开源中文分词Ansj的简单使用

这篇具有很好参考价值的文章主要介绍了开源中文分词Ansj的简单使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ANSJ是由孙健(ansjsun)开源的一个中文分词器,为ICTLAS的Java版本,也采用了Bigram + HMM分词模型:在Bigram分词的基础上,识别未登录词,以提高分词准确度。

虽然基本分词原理与ICTLAS的一样,但是Ansj做了一些工程上的优化,比如:用DAT高效地实现检索词典、邻接表实现分词DAG、支持自定义词典与自定义消歧义规则等。

1.项目地址

项目的github地址:https://github.com/NLPchina/ansj_seg
项目的文档地址:http://nlpchina.github.io/ansj_seg/

2.导入

2.1依赖

Ansj最新依赖包是5.1.6版本的,2018年更新的,最近已经不更新了:

<dependency>
            <groupId>org.ansj</groupId>
            <artifactId>ansj_seg</artifactId>
            <version>5.1.6</version>
</dependency>

2.2 配置文件

在ansj中配置文件名为library.properties,这是一个不可更改的约定。下面让我们看看都有哪些选项在这个配置文件中:

字段名 默认值 说明
isNameRecognition true 是否开启人名识别
isNumRecognition true 是否开启数字识别
isQuantifierRecognition true 是否数字和量词合并
isRealName false 是否取得真实的词,默认情况会取得标注化后的
isSkipUserDefine false 是否用户辞典不加载相同的词
dic "library/default.dic" 自定义词典路径
dic_[key] "你的词典路径" 针对不同语料调用不同的自定义词典
ambiguity "library/ambiguity.dic" 歧义词典路径
ambiguity_[key] "library/ambiguity.dic" 歧义词典路径
crf null crf词典路径,不设置为默认
crf_[key] "你的模型路径" 针对不同语料调用不同的分词模型
synonyms "默认的同义词典" 针对不同语料调用不同的分词模型
synonyms_[key] "你的同义词典路径" 针对不同语料调用不同的分词模型

默认的配置文件格式:

#path of userLibrary this is default library
dic=library/default.dic

#redress dic file path
ambiguityLibrary=library/ambiguity.dic

#set real name
isRealName=true

#isNameRecognition default true
isNameRecognition=true

#isNumRecognition default true
isNumRecognition=true

#digital quantifier merge default true
isQuantifierRecognition=true

3.分词实现

3.1 ToAnalysis 精准分词

精准分词是Ansj分词的推荐款

它在易用性、稳定性、准确性以及分词效率上,都取得了一个不错的平衡。如果你初次尝试Ansj想开箱即用,那么就用这个分词方式是不会错的。

3.2 DicAnalysis 用户自定义词典优先策略的分词

用户自定义词典优先策略的分词。如果你的用户自定义词典足够好,或者你的需求对用户自定义词典的要求比较高,那么强烈建议你使用DicAnalysis的分词方式。

可以说在很多方面Dic优于ToAnalysis的结果。

3.3 NlpAnalysis 带有新词发现功能的分词

nlp分词是总能给你惊喜的一种分词方式。

它可以识别出未登录词,但是它也有它的缺点:速度比较慢、稳定性差。ps:我这里说的慢仅仅是和自己的其他方式比较,应该是40w字每秒的速度吧。

个人觉得nlp的适用方式:语法实体名抽取、未登录词整理、对文本进行发现分析等工作

3.4 IndexAnalysis 面向索引的分词

面向索引的分词。顾名思义就是适合在lucene等文本检索中用到的分词。主要考虑以下两点

  • 召回率
    • 召回率是对分词结果尽可能的涵盖。比如对“上海虹桥机场南路” 召回结果是[上海/ns, 上海虹桥机场/nt, 虹桥/ns, 虹桥机场/nz, 机场/n, 南路/nr]
  • 准确率
    • 其实这和召回本身是具有一定矛盾性的Ansj的强大之处是很巧妙的避开了这两个的冲突 。比如我们常见的歧义句“旅游和服务”->对于一般保证召回 。大家会给出的结果是“旅游 和服 服务” 对于ansj不存在跨term的分词。意思就是。召回的词只是针对精准分词之后的结果的一个细分。比较好的解决了这个问题

3.5 BaseAnalysis 最小颗粒度的分词

基本就是保证了最基本的分词。词语颗粒度最非常小的,所涉及到的词大约是10万左右。

基本分词速度非常快。在macAir上,能到每秒300w字每秒。同时准确率也很高,但是对于新词他的功能十分有限。

3.6 功能统计

名称 用户自定义词典 数字识别 人名识别 机构名识别 新词发现
BaseAnalysis X X X X X
ToAnalysis X X
DicAnalysis X X
IndexAnalysis X X
NlpAnalysis

 4、使用实例

4.1 分词demo

package com.*;

import org.ansj.splitWord.analysis.*;
import org.junit.Test;

import java.util.*;

/**
 * @author 
 * @date 2023-07-26 15:29
 */
public class SegTest {
    @Test
    public void test(){
        String str = "ANSJ是由孙健(ansjsun)开源的一个中文分词器,为ICTLAS的Java版本,也采用了Bigram + HMM分词模型:在Bigram分词的基础上,识别未登录词,以提高分词准确度。" ;
        System.out.println(BaseAnalysis.parse(str));
        System.out.println(ToAnalysis.parse(str));
        System.out.println(DicAnalysis.parse(str));
        System.out.println(IndexAnalysis.parse(str));
        System.out.println(NlpAnalysis.parse(str));
    }
}

分词结果:

BaseAnalysis

ANSJ/en,是/v,由/p,孙健/nr,(/w,ansjsun/en,)/w,开源/v,的/u,一个/m,中文/nz,分词/v,器/ng,,/w,为/p,ICTLAS/en,的/u,Java/en,版本/n,,/w,也/d,采用/v,了/u,Bigram/en, ,+/w, ,HMM/en,分词/v,模型/n,:/w,在/p,Bigram/en,分词/v,的/u,基础/n,上/f,,/w,识别/v,未/d,登录/vn,词/n,,/w,以/p,提高/v,分词/v,准确度/n,。/w

ToAnalysis:

ANSJ/en,是/v,由/p,孙健/nr,(/w,ansjsun/en,)/w,开源/v,的/u,一个/m,中文/nz,分词器/n,,/w,为/p,ICTLAS/en,的/u,Java/en,版本/n,,/w,也/d,采用/v,了/u,Bigram/en, ,+/w, ,HMM/en,分词/v,模型/n,:/w,在/p,Bigram/en,分词/v,的/u,基础/n,上/f,,/w,识别/v,未/d,登录/vn,词/n,,/w,以/p,提高/v,分词/v,准确度/n,。/w

DicAnalysis:

ANSJ/en,是/vshi,由/p,孙健/nr,(/w,ansjsun/en,)/w,开源/v,的/ude1,一个/mq,中文/nz,分词器/n,,/w,为/p,ICTLAS/en,的/ude1,Java/en,版本/n,,/w,也/d,采用/v,了/ule,Bigram/en, ,+/w, ,HMM/en,分词/v,模型/n,:/w,在/p,Bigram/en,分词/v,的/ude1,基础/n,上/f,,/w,识别/vn,未/d,登录/v,词/n,,/w,以/p,提高/v,分词/v,准确度/n,。/w

IndexAnalysis:

ANSJ/en,是/v,由/p,孙健/nr,孙/ng,健/ag,(/w,ansjsun/en,)/w,开源/v,开/v,源/ng,的/u,一个/m,一/m,个中/r,个/q,中文/nz,中/f,文/ng,分词器/n,分词/v,分/qt,词/n,器/ng,,/w,为/p,ICTLAS/en,的/u,Java/en,版本/n,版/n,本/rz,,/w,也/d,采用/v,采/v,用/p,了/u,Bigram/en, ,+/w, ,HMM/en,分词/v,分/qt,词/n,模型/n,模/ng,型/k,:/w,在/p,Bigram/en,分词/v,分/qt,词/n,的/u,基础/n,基/ng,础/ng,上/f,,/w,识别/v,识/v,别/d,未/d,登录/vn,登/v,录/ng,词/n,,/w,以/p,提高/v,提/v,高分/n,高/a,分词/v,分/qt,词/n,准确度/n,准确/a,准/a,确/d,度/qv,。/w

NlpAnalysis :

ANSJ/en,是/v,由/p,孙健/nr,(/w,ansjsun/en,)/w,开源/v,的/u,一个/m,中文/nz,分词器/n,,/w,为/p,ICTLAS/en,的/u,Java/en,版本/n,,/w,也/d,采用/v,了/u,Bigram/en, ,+/w, ,HMM/en,分词/v,模型/n,:/w,在/p,Bigram/en,分词/v,的/u,基础/n,上/f,,/w,识别/v,未/d,登录/vn,词/n,,/w,以/p,提高/v,分词/v,准确度/n,。/w 

4.2 使用demo

以ToAnalysis为例,其它方法大同小异:

	public static void main(String[] args) {
        String str = "欢迎使用ansj_seg,(ansj中文分词)在这里如果你遇到什么问题都可以联系我!" ;
        Result result = ToAnalysis.parse(str); //分词结果的一个封装,主要是一个List<Term>的terms
        System.out.println(result.getTerms());

        List<Term> terms = result.getTerms(); //拿到terms
        System.out.println(terms.size());

        for(int i=0; i<terms.size(); i++) {
            String word = terms.get(i).getName(); //拿到词
            String natureStr = terms.get(i).getNatureStr(); //拿到词性
            System.out.println(word + ":" + natureStr);
        }
    }

 基本使用方法分为几下几步:

  1、使用ToAnalysis.parse(str)将字符串进行分词,会返回一个Result,分词的结果就在它里面。

  2、然后继续result.getTerms()获得分词结果的内容,因为是返回的多个分词,所以最终获得的是一个List。

  3、然后遍历它,term.getName()获得的是词,term.getNatureStr()拿到的是这个词的词性。

4.3 个性化定制分词词典

4.3.1 自定义常用词典

  • 创建一个名为userLibrary.dic的文件,内容如下:

5G        n        1000

哈利·波特        n        1000

 第一个是词语,第二个是词性,第三个是权重。词性这里大家不用关注,编号以此类推即可,不要重复,各个以缩进(\t)分隔。

  • 加载自定义词典
// 配置自定义词典的位置。注意是绝对路径
MyStaticValue.ENV.put(DicLibrary.DEFAULT,System.getProperty("user.dir")+"/library/dictionary/userLibrary.dic");

 4.3.2 自定义停用词典

  • 创建一个名为stopLibrary.dic的文件,内容如下:







直接写停用词,每一行写一个。

  • 加载自定义词库
//去停用词
List<String> stopWords = getStopWords(System.getProperty("user.dir") + "/library/stopLibrary.dic");
StopRecognition filter = new StopRecognition(); 
filter.insertStopWords(stopWords);

String str = "欢迎使用ansj_seg,(ansj中文分词)在这里如果你遇到什么问题都可以联系我!" ;

//分词结果的一个封装,recognition增加分词过滤

Result result = ToAnalysis.parse(str).recognition(filter);
System.out.println(result.getTerms());

 4.3.3 自主添加个别词

DicLibrary.insert(DicLibrary.DEFAULT, "抠图");

DicLibrary.insert(DicLibrary.DEFAULT,"抠图","n",1000);

4.3.4  歧义纠正词典

歧义纠正是Ansj分词的最后最后的大招了,杀伤力巨大,谨慎使用,极可能造成其他的错误。

很多时候,分词发生歧异不是很好调整,用户需要更强的规则来约束所以ansj中增加了歧异消除的一个强规则方式。

  • 创建一个名为library/ambiguity.dic 的文件,内容格式如下:

三个    m    和尚    n

动漫    n    游戏    n

李民    nr    工作    vn

第一列是识别串,第二列是分词结果,奇数行是词,偶数行是词性。这里例子告诉计算机:如果你发现 "李民工作"---> "李/民工/作" 纠正为 --->"李民/工作/" 这种类型

ps:这个是优先分词运行的.所以添加时候要谨慎。

  • 在配置文件中设置ambiguity.dic 的路径

ambiguityLibrary=library/ambiguity.dic

  • 也可以用 MyStaticValue.ambiguityLibrary = "library/ambiguity.dic" 来设定;
  • 也可动态添加歧义纠正词典:
        System.out.println(ToAnalysis.parse("据说川府办发的发文很厉害"));

        //歧义纠正
        Value value = new Value("川府办", "川府办", "n");
        Library.insertWord(AmbiguityLibrary.get(), value);

        System.out.println(ToAnalysis.parse("据说川府办发的发文很厉害"));;

运行结果:

据说/v,川/j,府/ng,办发/j,的/u,发文/v,很/d,厉害/a
据说/v,川府办/n,发/v,的/u,发文/v,很/d,厉害/a文章来源地址https://www.toymoban.com/news/detail-624135.html

到了这里,关于开源中文分词Ansj的简单使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HuggingFace开源的自然语言处理AI工具平台

    HuggingFace是一个开源的自然语言处理AI工具平台,它为NLP的开发者和研究者提供了一个简单、快速、高效、可靠的解决方案,让NLP变得更加简单、快速、高效、可靠。 Hugging Face平台主要包括以下几个部分: Transformers:一个提供了数千种预训练好的NLP模型(如BERT、GPT-3等)以及

    2024年02月12日
    浏览(40)
  • 自然语言处理 | 大模型|类似chatGPT的开源大模型整理

    最近正在学习chatGPT相关大模型,整理相关资料如下,本文仍在修改中,如有侵权,请联系删除 chatGPT-1: Improving Language Understanding by Generative Pre-Training chatGPB-2: Language Models are Unsupervised Multitask Learners chatGPT-3: Language Models are Few-Shot Learners 模型名称 开发者 模型介绍 介绍资料

    2024年02月02日
    浏览(40)
  • 中文自然语言处理(NLP)中的命名实体识别(NER)任务中,加入注意力(attention)机制

    在中文自然语言处理(NLP)中的命名实体识别(NER)任务中,加入注意力(attention)机制可以极大地提升模型的性能。注意力机制可以帮助模型更好地捕捉序列中的关键信息和上下文依赖关系,从而提高对命名实体的识别准确度。下面是一些关于注意力机制的具体作用和不同

    2024年01月25日
    浏览(54)
  • 7个顶级开源数据集来训练自然语言处理(NLP)和文本模型

    推荐:使用 NSDT场景编辑器快速助你搭建可二次编辑的3D应用场景 NLP现在是一个令人兴奋的领域,特别是在像AutoNLP这样的用例中,但很难掌握。开始使用NLP的主要问题是缺乏适当的指导和该领域的过度广度。很容易迷失在各种论文和代码中,试图吸收所有内容。 要意识到的是

    2024年02月13日
    浏览(57)
  • 自然语言处理NLP:一文了解NLP自然语言处理技术,NLP在生活中的应用,图导加深了解,NLP语料库,NLP开源工具

    目录 1.自然语言处理NLP 1.1 NLP中英对照(双份) 1.2 相关文章  2.NLP语料库

    2024年02月09日
    浏览(61)
  • 让AI分析更加简单:ApacheZeppelin如何简化自然语言处理任务

    作者:禅与计算机程序设计艺术 在自然语言处理(NLP)领域,有着许多需要解决的问题,其中最重要的当然就是文本分类、关系抽取等等了。目前业界有很多成熟的文本分类工具,比如维基百科的分类系统,但是这些分类工具的准确性一般都比较高,但同时也存在一定的局限性

    2024年02月06日
    浏览(47)
  • Chat2DB-开源AI智能数据库客户端工具 能够将自然语言转换为SQL

    Chat2DB 是一款有 开源免费的多数据库客户端工具 ,支持windows、mac本地安装,也支持服务器端部署,web网页访问。和传统的数据库客户端软件Navicat、DBeaver 相比Chat2DB集成了AIGC的能力,能够将自然语言转换为SQL,也可以将SQL转换为自然语言,可以给出研发人员SQL的优化建议,极

    2024年02月15日
    浏览(82)
  • [自然语言处理] 自然语言处理库spaCy使用指北

    spaCy是一个基于Python编写的开源自然语言处理库。基于自然处理领域的最新研究,spaCy提供了一系列高效且易用的工具,用于文本预处理、文本解析、命名实体识别、词性标注、句法分析和文本分类等任务。 spaCy的官方仓库地址为:spaCy-github。本文主要参考其官方网站的文档,

    2024年02月15日
    浏览(98)
  • 6款支持中文语音识别开源软件的简单使用

    摘自百度百科 语音识别技术,也被称为自动语音识别(Automatic Speech Recognition,ASR),其目标是将人类的语音中的词汇内容转换为计算机可读的输入,例如按键、二进制编码或者字符序列。与说话人识别及说话人确认不同,后者尝试识别或确认发出语音的说话人而非其中所包含

    2024年02月12日
    浏览(47)
  • LangChain:使用自然语言查询数据库

    目录 前言 LangChain介绍 为什么选择LangChain LangChain的结构 代理 SQL Database Agent 数据库模式和资源 导入必要的库 连接到数据库: 设置 LLM、工具包和代理执行器: 使用自然语言查询数据库: 完整代码示例: 结论 在LLM模型还没有特别成熟,像现在这样火爆之前,我们对于数据库

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包