开源中文分词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 {@Testpublic 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>的termsSystem.out.println(result.getTerms());List<Term> terms = result.getTerms(); //拿到termsSystem.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
相关文章:
开源中文分词Ansj的简单使用
ANSJ是由孙健(ansjsun)开源的一个中文分词器,为ICTLAS的Java版本,也采用了Bigram HMM分词模型:在Bigram分词的基础上,识别未登录词,以提高分词准确度。 虽然基本分词原理与ICTLAS的一样&#…...
251_多线程_创建一个多线程的图像处理应用,其中每个线程负责对一部分图像进行处理,然后将处理后的结果合并为最终图像
举一个更丰富的例子来说明多线程的用法。 我们将创建一个多线程的图像处理应用,其中每个线程负责对一部分图像进行处理,然后将处理后的结果合并为最终图像。 这个例子可以更好地展示多线程并发处理的优势。 假设有一个函数 processImageSection,它会对图像的一个特定区域进…...
[吐槽Edge浏览器]关于Edge浏览器的闪退问题
这个浏览器嘛,在谷歌浏览器不能页面翻译后,一直是用的高高兴兴的,可突然有一天,Edge浏览器页面加载不出来了。 很慌,大概就是页面崩溃、加载失败什么的都出现过。 修了整整一天,不知道原因在哪,…...
数据包在网络中传输的过程
ref: 【先把这个视频看完了】:数据包的传输过程【网络常识10】_哔哩哔哩_bilibili 常识都看看 》Ref: 1. 这个写的嘎嘎好,解释了为啥4层7层5层,还有数据包封装的问题:数据包在网络中的传输过程详解_数据包传输_张孟浩_jay的博客…...
Acwing.875 快速幂
题目 给定n组ai , bi, pi,对于每组数据,求出akimod pi的值。 输入格式 第一行包含整数n。 接下来n行,每行包含三个整数ai , bi,pi。输出格式 对于每组数据,输出一个结果,表示aibimod pi的值。 每个结果占一行。 数…...
【决策树-鸢尾花分类】
决策树算法简介 决策树是一种基于树状结构的分类与回归算法。它通过对数据集进行递归分割,将样本划分为多个类别或者回归值。决策树算法的核心思想是通过构建树来对数据进行划分,从而实现对未知样本的预测。 决策树的构建过程 决策树的构建过程包括以…...
类与对象(中--构造函数)
类与对象(中--构造函数) 1、构造函数的特性2、默认构造函数3、编译器自动生成的默认构造函数(无参的)(当我们不写构造函数时)3.1 编译器自动生成的默认构造函数只对 自定义类型的成员变量 起作用࿰…...
Makefile学习1
文章目录 Makefile学习1Makefile简介Makefile重要性Makefile内容1) 显式规则2) 隐晦规则3) 变量的定义4) 文件指示5) 注释 Makefile规则规则默认目标多目标多规则目标伪目标 Makefile目标依赖头文件依赖自动生成头文件依赖关系 Makefile命令Makefile变量变量定义和使用赋值立即…...
城市内涝监测预警系统,科学“智治”应对灾害
近日,台风“杜苏芮”以摧枯拉朽之势给我国东南沿海地区带来狂风骤雨,福建的三个国家气象观测站日降水量突破历史极值。之后,“杜苏芮”一路北上。中央气象台预报称,7月29日至8月1日,北京、天津、河北、山东西部、河南北…...
切片[::-1]解析列表list表示的“非负整数加1”
列表数位表示非负整数,熟练操作“满十进位”。 (本笔记适合熟练操作Python列表list的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教程》,不仅仅…...
Mac下certificate verify failed: unable to get local issuer certificate
出现这个问题,可以安装证书 在finder中查找 Install Certificates.command找到后双击,或者使用其他终端打开 安装完即可...
Django项目启动错误
uwsgi项目启动错误信息如下Did you install mysqlclient?Command pkg-config --exists mysqlclient returned non-zero exit status 1Command pkg-config --exists mariadb returned non-zero exit status 1.Traceback (most recent call last):File "/home/dream21th/co…...
Vue2 第十二节 Vue组件化编程 (二)
1. VueComponent 2. 单文件组件 一. VueComponent 组件本质上是一个名为VueComponent的构造函数,不是程序员定义的,是Vue.extend生成的只需要写<school/>或者<school><school/>,Vue解析时,会帮我们创建schoo…...
pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug
未经允许,本文不得转载,vx:837007389 文章目录 step1:下载专业版本的pycharmstep2 配置自动同步文件夹,即远程的工程文件和本地同步2.1 Tools -> Deployment -> configuration2.2 设置同步文件夹2.3 同步服务器…...
SAP ABAP 基础语法超详细
1.表声明 Tables: 表名[,表名]. 声明多个表时可用逗号分隔当你声明了一个数据表的同时,系统也同时自动生成了一个和数据表同名的结构,结构的变量集等于数据表里面的字段。 2.定义变量 Data: v1[(l)] [type t] [decimals d] [v…...
html学习3(表格table、列表list)
1、html表格由<table>标签来定义。 <thead>用来定义表格的标题部分,其内部用 <th > 元素定义列的标题,可以使其在表格中以粗体显示,与普通单元格区分开来。<tbody>用来定义表格的主体部分,其内部用<t…...
【SpringBoot】85、SpringBoot中Boolean类型数据转0/1返回序列化配置
在 SpringBoot 中,前端传参数 0,1,后端可自动解析为 boolean 类型,但后端返回前端 boolean 类型时,却无法自动转换为 0,1,所以我们需要自定义序列化配置,将 boolean 类型转化为 0,1 1、类型对应 boolean 类型有false,true对应的 int 类型0,12、序列化配置 import com.f…...
hbase优化:客户端、服务端、hdfs
hbase优化 一.读优化 1.客户端: scan。cache 设置是否合理:大scan场景下将scan缓存从100增大到500或者1000,用以减少RPC次数使用批量get进行读取请求离线批量读取请求设置禁用缓存,scan.setBlockCache(false)以指定列族或者列进行…...
docker安装memcached
查找容器是否有该镜像存在 docker search memcached拉取镜像 docker pull memcached创建容器 docker create --name memcache1 memcached或者映射一下端口 docker create -p 11211:11211 --name memcache1 memcached启动 docker start memcache1指定容器的 IP docker net…...
Redis 客户端有哪些?
文章目录 JedisLettuceRedisson最佳实践 - 到底用哪个? Redis 最常见的 Java 客户端有两个,Jedis 和 Lettuce,高级客户端有 Redisson,见下图(图源 Clients | Redis) Jedis Github地址:redis/j…...
使用taotoken聚合api后模型响应延迟的实际体感观察
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用taotoken聚合api后模型响应延迟的实际体感观察 作为一名日常需要调用多种大模型API的开发者,将多个供应商的API接入…...
从‘一核有难,多核围观’到雨露均沾:深入Linux内核看网卡中断与RSS/RPS
从“一核有难,多核围观”到雨露均沾:Linux内核网络中断负载均衡实战解析 当服务器网卡吞吐量突然暴跌时,很多工程师的第一反应是检查带宽和协议栈参数,却忽略了最底层的CPU中断分配机制。我曾处理过一台数据库服务器,在…...
别再瞎猜了!LaTeX排版中em、ex、pt、px到底该用哪个?一篇讲透所有单位
LaTeX排版单位全指南:从em到px的精准选择法则 当你第一次打开LaTeX文档,准备调整行距或设置边距时,那些神秘的缩写——em、ex、pt、px——是否让你感到困惑?每个单位似乎都有其存在的理由,但何时使用哪个才是最合适的&…...
手把手教你用Python脚本给飞书机器人“喂”数据:Gerrit事件通知实战
Python自动化实战:用飞书机器人构建Gerrit事件通知系统 每当团队协作开发时,代码审查状态的实时同步总是让人头疼。想象一下:你刚提交的代码被同事点赞,或是某个关键补丁集终于通过审核——这些重要时刻如果能在飞书群里即时提醒&…...
别再只盯着P值了!用Stata做格兰杰检验后,这样解读结果才专业(含VAR模型与脉冲响应分析)
超越P值陷阱:格兰杰检验的深度解读与Stata实战指南 当屏幕上跳出那个熟悉的P值时,大多数研究者会条件反射般地做出二元判断——"显著"或"不显著",然后匆匆写下结论。这种机械式的数据分析方式正在学术界和业界制造大量&q…...
基于FET6254-C多核异构处理器的智能运动控制系统设计与实践
1. 项目概述:当运动控制遇上嵌入式智能最近在做一个智能运动控制的项目,从传统的PLC方案转向了更灵活、更智能的嵌入式平台。选型过程中,飞凌嵌入式的FET6254-C核心板进入了我的视野,经过一番深度评估和实际测试,它确实…...
离线语音技术如何重塑智能照明:从核心原理到产品实战
1. 从“在线”到“离线”:智能照明交互的范式转变作为一名在智能家居领域摸爬滚打了十来年的从业者,我亲眼见证了智能照明从最初的手机APP遥控,到后来的智能音箱联动,再到如今离线语音技术的兴起。每次技术迭代,都不仅…...
跨平台包管理新思路:paks项目如何统一软件安装体验
1. 项目概述:一个轻量级、跨平台的包管理新思路如果你和我一样,常年混迹在开发运维一线,肯定对“包管理”这件事又爱又恨。爱的是,它能让我们一键安装、更新、卸载软件,省去了手动编译、配置依赖的繁琐;恨的…...
地平线X3M平台sensor点亮故障排查实战指南
1. 地平线X3M平台sensor点亮常见问题概述 第一次接触地平线X3M平台的开发者,在点亮sensor时经常会遇到各种"拦路虎"。我刚开始接触这个平台时,光是调试一个imx415 sensor就花了整整三天时间。现在回想起来,大部分问题其实都有规律可…...
终极免费音频编辑解决方案:告别昂贵软件,用Audacity实现专业级音频处理
终极免费音频编辑解决方案:告别昂贵软件,用Audacity实现专业级音频处理 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 还在为音频编辑软件的高昂费用而烦恼?是否曾因复杂的专业…...
