ansj中文分词器详解

  最近在做一个人工智能的项目,其中用到了分词功能。从网上找了一些java用于分词的工具,最终选择了ansj中文分词器。个人认为效果和功能是比较优秀的。本文将对ansj的所有功能进行详解并提供收集到的文本,下面开始正文:

一、基本使用

  引入如下maven依赖配置:

 <!-- ansj分词插件依赖 --><dependency><groupId>org.ansj</groupId><artifactId>ansj_seg</artifactId><version>5.1.6</version></dependency>

  看下面的测试类:

 public static void main(String[] args) {String str = "欢迎使用ansj_seg,(ansj中文分词)在这里如果你遇到什么问题都可以联系我.我一定尽我所能.帮助大家.ansj_seg更快,更准,更自由!" ;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);}}

  这个测试类说明了ansj的基本使用方法分为几下几步:

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

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

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

测试最终结果如下:

欢迎:v
使用:v
ansj:en
_:null
seg:en
,:w
(:w
ansj:en
中文:nz
分词:v
):w
在:p
这里:r
如果:c
你:r
遇到:v
什么:r
问题:n
都:d
可以:v
联系:v
我:r
.:w
我:r
一定:d
尽:v
我:r
所能:v
.:w
帮助:v
大家:r
.:w
ansj:en
_:null
seg:en
更快:d
,:w
更:d
准:a
,:w
更:d
自由:a
!:w

二、自定义词库

  从上面分词的结果可以看出有些词语我们本来是想让它放在一起的,但是分开了。因为ansj本身有一个词库,它是根据内部词库来进行分词的。但是内部词库也并不是那么完善,所以我们需要自己定义一个词库,在分词的时候把我们自己定义的词库加载进去,这样就可以达到我们预期的效果。

  1、创建一个dic文件
  在你电脑的任意位置创建一个名为userLibrary.dic的文件,内容如下:

尽我所能 v   1
更准  v   2
更自由 v   3

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

  2、加载自定义词库
  你虽然已经定义了自定义词库,但是你还没有把它加入到你的ansj中去。看如下测试类:

public static void main(String[] args) {// 关闭名字识别MyStaticValue.isNameRecognition = false;// 配置自定义词典的位置。注意是绝对路径MyStaticValue.ENV.put(DicLibrary.DEFAULT,"D:\\ideaproject\\ocr\\src\\main\\resources\\userLibrary.dic");String str = "欢迎使用ansj_seg,(ansj中文分词)在这里如果你遇到什么问题都可以联系我.我一定尽我所能.帮助大家.ansj_seg更快,更准,更自由!" ;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);}
}

  我在前几行加入了加载自定义词库的代码,你只需要修改你自定义词库的路径即可,下面看测试结果:可以看到之前没有分出来的 ‘尽我所能’ 、‘更准’、‘更自由’ 由于我在自定义词库加入了它们所以成功分在一起了。

欢迎:v
使用:v
ansj:en
_:null
seg:en
,:w
(:w
ansj:en
中文:nz
分词:v
):w
在:p
这里:r
如果:c
你:r
遇到:v
什么:r
问题:n
都:d
可以:v
联系:v
我:r
.:w
我:r
一定:d
尽我所能:v
.:w
帮助:v
大家:r
.:w
ansj:en
_:null
seg:en
更快:d
,:w
更准:v
,:w
更自由:v
!:w

三、自定义停用词库

  大家要知道停用词是什么,就是当我们使用ansj将一句话分词的时候,它分出来的词语会有一些没有任何意义的词,最近我在做的是语义分析,这些词是会影响语义分析结果的,所以必须将其去掉。比如 ‘啊’、‘嗯’、‘哦’等词。创建停用词库步骤如下:

  1、创建一个dic文件
  在你电脑的任意位置创建一个名为stopLibrary.dic的文件,内容如下:

啊
阿
哎
唉
俺
按
吧

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

  2、加载自定义词库
  直接看如下代码,手写酸了。。。。。

public static void main(String[] args) {// 关闭名字识别MyStaticValue.isNameRecognition = false;// 配置自定义词典的位置。注意是绝对路径MyStaticValue.ENV.put(DicLibrary.DEFAULT,"D:\\ideaproject\\ocr\\src\\main\\resources\\userLibrary.dic");//去停用词List<String> stopWords = getStopWords("D:\\ideaproject\\ocr\\src\\main\\resources\\library\\stopLibrary.dic");StopRecognition filter = new StopRecognition();filter.insertStopWords(stopWords);String str = "欢迎使用ansj_seg,(ansj中文分词)在这里如果你遇到什么问题都可以联系我.我一定尽我所能.帮助大家.ansj_seg更快,更准,更自由!" ;Result result = ToAnalysis.parse(str).recognition(filter); //分词结果的一个封装,主要是一个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);}
}

  注意看去停用词那块,就是将停用词库的内容获取放到List中然后加入到ansj的停用词库中。还有在分词时ToAnalysis.parse(str).recognition(filter)加入了.recognition(filter)这个,它就是将你停用词库加入到ansj中去。这里我用到了一个getStopWords方法,参数就是你自定义停用词库的路径,内容如下:

private static List<String> getStopWords(String url){// 使用一个字符串集合来存储文本中的路径 ,也可用String []数组List<String> list = new ArrayList<String>();try {FileInputStream fis = new FileInputStream(url);// 防止路径乱码   如果utf-8 乱码  改GBK     eclipse里创建的txt  用UTF-8,在电脑上自己创建的txt  用GBKInputStreamReader isr = new InputStreamReader(fis, "UTF-8");BufferedReader br = new BufferedReader(isr);String line = "";while ((line = br.readLine()) != null) {// 如果 t x t文件里的路径 不包含---字符串       这里是对里面的内容进行一个筛选if (line.lastIndexOf("---") < 0) {list.add(line);}}br.close();isr.close();fis.close();} catch (Exception e) {e.printStackTrace();}return list;
}

  3、测试结果
  不测试了,手真的酸了。但是这里要说一个小细节,就是去停用词是在分词后,而不是分词前。

四、ansj的五种分词模式

  直接看这篇吧,写的挺好。https://blog.csdn.net/lb521200200/article/details/53696387
  如果对这几种模式还是不太理解,或者觉得这篇博文讲的太官方了,欢迎给我留言
  另外给大家提供搜狗词库去重两百万词库。
    链接:https://pan.baidu.com/s/1CJVOTVwDkbkFkIueBKjgtw
    提取码:3fnn

ansj中文分词器详解相关推荐

  1. 【IKAnalyzer中文分词器详解-(1)分词逻辑】

    分词的目的:把一句话,分解成单字.数量词 .词 (分词算法中称为"词元") 初始化词典Trie树结构 把句子分解成词 处理歧义与冲突词,删除多余的低权重词元 应用目的: 搜索引擎为 ...

  2. 【Lucene】分词器详解,常用的分词器,IKANalyzer

    [Lucene]分词器详解,常用的分词器,IKANalyzer 1. 分词器详解 1.1 分词器的作用 1.2 分词器API 1.2.1 示例 1.2.2 Analyzer 1.2.3 createC ...

  3. Elasticsearch 分词器详解(热更新词库)

    1 分词器 text类型数据存入ES经过的步骤: 2 规范化(normalization) #采用默认分词器分词 GET _analyze {"analyzer": "s ...

  4. Lucene分词器详解

    一.分词器作用 在创建索引的时候需要用到分词器,在使用字符串搜索的时候也会用到分词器,并且这两个地方要使用同一个分词器,否则可能会搜索不出来结果. 分词器(Analyzer)的作用是把一段文本中的词按 ...

  5. java Ansj中文分词器

    ##Ansj中文分词 这是一个基于n-Gram+CRF+HMM的中文分词的java实现. 分词速度达到每秒钟大约200万字左右(mac air下测试),准确率能达到96%以上目前实现了.中文分词. 中 ...

  6. python统计词频瓦尔登湖_自然语言处理之中文分词器-jieba分词器详解及python实战...

    (转https://blog.csdn.net/gzmfxy/article/details/78994396) 中文分词是中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块,在进行中文自 ...

  7. python中文分词器-jieba分词器详解及wordcloud词云生成

    jieba分词 jieba分词支持三种分词模式: 精确模式, 试图将句子最精确地切开,适合文本分析 全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义 搜索引擎模式,在精确模 ...

  8. ElasticSearch之 ik分词器详解

    IK分词器 本文分为简介.安装.使用三个角度进行讲解. 简介 倒排索引 众所周知,ES是一个及其强大的搜索引擎,那么它为什么搜索效率极高呢,当然和他的存储方式脱离不了关系,ES采取的是倒排索引,就是反 ...

  9. hanlp java_HanLP-实词分词器详解

    在进行文本分类(非情感分类)时,我们经常只保留实词(名.动.形)等词,为了文本分类的分词方便,HanLP专门提供了实词分词器类NotionalTokenizer,同时在分类数据集加载处理时,默认使用了 ...

最新文章

  1. 数据由SqlServer2008转移到MySQL的一个方法
  2. 船长带你看书——《selenium2 python 自动化测试实战》(2)浏览器操作
  3. leetcode算法题--二叉搜索树的后序遍历序列
  4. 为什么 SAP 电商云 Spartacus 产品明细页面的自定义 matcher 会重复被调用
  5. jQuery事件绑定(一)
  6. 爬取LeetCode题目——如何发送GraphQL Query获取数据
  7. Linux内核实验作业七
  8. 初识exe程序反汇编小感
  9. Monkey之环境搭建
  10. 巴巴运动网学习笔记(51-55)
  11. redis 入门笔记(一)
  12. python defaultdict tree_python – 从非空的defaultdict中挑选一个随机元素
  13. 矩阵理论——Smith标准型的学习
  14. oracle优化distinct,oracle 索引优化之distinct
  15. 什么是gc和gc的工作原理
  16. Vocabulary and Phrase in Paper of Computer Vision (Updating)
  17. 企业供应链管理为什么要“上云”?
  18. 求2的零次方 加 2的一次方 加2的二次方等等的和
  19. 江苏大学毕业设计TEX排版(三)
  20. 3dmax室内灯光强度一般打多少才合适

热门文章

  1. hdu 5687 Problem C
  2. Docker可视化管理工具Kitematic 安装和使用简介
  3. html的h1有什么效果,H1标签有什么作用?网页H1标签优化技巧
  4. 二氟尼柳或将明显减缓多神经病的恶化
  5. 学习笔记(24):四十九课时精通matlab数学建模-精通matlab隶属度函数
  6. 三菱FX PLC模糊PID三角形隶属度函数(FB)
  7. 2 Power Map—Power Map安装与使用
  8. 【Aurix系列学习】TC264D最小系统搭建—基本配置引脚
  9. 纯文字图片缩小后像素点丢失的一种逃课式解决办法(Android)
  10. 感恩节感谢陪我一路走到现在的所有人