阅读更多
Ansj 是一个开源的 Java 中文分词工具,基于中科院的 ictclas 中文分词算法,比其他常用的开源分词工具(如mmseg4j)的分词准确率更高。

在线演示:http://ansj.sdapp.cn/demo/seg.jsp
官网地址:http://www.ansj.org/
Github地址:https://github.com/ansjsun/ansj_seg

我们本期采访了Ansj的作者孙健,请他为大家详细介绍一下这个分词工具。

ITeye期待并致力于为国内优秀的开源项目提供一个免费的推广平台,如果你和你的团队希望将自己的开源项目介绍给更多的开发者,或者你希望我们对哪些开源项目进行专访,请告诉我们,发站内短信给ITeye管理员或者发邮件到webmaster@iteye.com即可。

先来个自我介绍吧! Top

孙健,胸无大志,没想过创业,没想过发财,只想高高兴兴写两行代码,做了近五年Java程序员,写过页面,干过运维,做过人力,忽悠过客户,擅长字符串操作,擅长数据结构和算法。现在主要从事检索、自然语言处理、数据挖掘等方面工作。

介绍一下Ansj! Top

Ansj中文分词是一款纯Java的、主要应用于自然语言处理的、高精度的中文分词工具,目标是“准确、高效、自由地进行中文分词”,可用于人名识别、地名识别、组织机构名识别、多级词性标注、关键词提取、指纹提取等领域,支持行业词典、用户自定义词典。

上面是客套话,先说明一下Ansj命名的由来吧。本来开始打算叫totoro分词(同事帮忙起的名),最后发现好多厕所中卫生洁具都叫“TOTO” ^_^

正好我注册了Ansj.org域名,于是乎,就叫这个名字吧。

你认为中文分词的难点是什么? Top

在这里说分词有点老生常谈了。的确,中文分词已经非常成熟了,但是之间有一些问题依旧比较难解。个人认为大致有以下几点吧:

1.  中文歧义的识别

比较出名的一句话“结婚的和尚未结婚的”,如果使用正向最大匹配,容易分成“结婚/的/和尚/未/结婚的”,于是有的学者试图倒过来识别,逆向匹配会大于正向。但是碰到这句“结合成分子时”,采用逆向最大匹配,则会分为“结合/成分/子时”,更有甚者像“咬了猎人的狗”这种语意不明的词语,就更不容易正确分词了。这是中文分词的软肋。下面是些典型的歧义句:

  • 交叉歧义(多种切分交织在一起):内塔内亚胡说的/确实/在理
  • 组合歧义(不同情况下切分不同):这个人/手上有痣、我们公司人手
  • 真歧义(几种切分都可以):乒乓球拍/卖/完了、乒乓球/拍卖/完了
2.  实体名识别

这个是中文分词遇到的最大的难点,也是最最紧迫的。实体名识别包括人名识别、地名识别、机构名识别,还包括有监督识别和无监督识别。有监督的还好,无监督基本是无解的,比如“王大力发球”是“王大力”还是“大力发球”,一般人都难以识别。

3.  新词热词发现

目前常用的新词发现还是一个比较有研究性的课题,虽然有些论文在准确率很高,但是大多是封闭测试,这意味着结果很难应用到实际工程中。目前Ansj采用的新词发现方式比较简单,采用了高频词的匹配方式,不使用规则,用统计重复串识别新词,根据词性去掉干扰词,虽然有一定的效果,但还是差强人意。

4.  颗粒度问题

这个就是一个规则探讨的问题了,比如“北京大学”是“北京”+“大学”还是“北京大学”,人各有志,就连同一个人不同时间的标注也有可能是有区别的,虽然这个问题严格上来说不属于技术问题,但是对分词结果的评测却有着很大的关系,Ansj采用“能识别就识别”的策略方针,所以在真正R值的时候偏低,总之一句话,适合学术的不一定适合工业,反之亦然。

简单介绍一下Ansj分词用到的算法,其分词原理是什么? Top

Ansj并非我创新,可以说是一个ictclas的Java版本,基本原理一致,只不过在分词优化算法上做了一些改进。

该算法实现分词有以下几个步骤:

  1. 全切分,原子切分;
  2. N最短路径的粗切分,根据隐马尔科夫模型和viterbi算法,达到最优路径的规划;
  3. 人名识别;
  4. 系统词典补充;
  5. 用户自定义词典的补充;
  6. 词性标注(可选)

Ansj分词的准确率大概是多少? Top

这是我采用人民日报1998年1月语料库的一个测试结果,首先要说明的是这份人工标注的语料库本身就有错误。

  • P(准确率):0.984887218571267
  • R(召回率):0.9626488103178712
  • F(综合指标F值):0.9736410471396494

在歧义、未登录词问题上,Ansj表现怎样? Top

歧异方面的处理方式自我感觉还可以,基于“最佳实践规则+统计”的方式,虽然还有一部分歧异无法识别,但是已经完全能满足工程应用了。

至于未登录词的识别,目前重点做了中文人名的识别,效果还算满意,识别方式用的“字体+前后监督”的方式,也算是目前我所知道的效果最好的一种识别方式了。

Ansj的性能如何? Top

在我的测试中,Ansj的效率已经远超ictclas的其他开源实现版本。

核心词典利用双数组规划,每秒钟能达到千万级别的粗分。在我的MacBookAir上面,分词速度大约在300w/字/秒,在酷睿i5+4G内存组装机器上,更是达到了400w+/字/秒的速度。

如何添加自定义词典? Top

Ansj已经实现了用户自定义词典的动态添加删除,当然,也支持从文件加载词典。

从硬盘加载用户自定义词典的方法:

用户自定义词典默认路径:项目目录/library/userLibrary/userLibrary.dic

格式为:[自定义词]  [词性]  [词频],如:csdn创新院  userDefine  1000,中间用TAB键隔开

原分词结果:[csdn, 创新, 院, 是, 一个, 好, 公司]

增加词典后:[csdn创新院, 是, 一个, 好, 公司]

详细内容见:用户自定义词典的添加

用户自定义词典的动态添加删除方法见:用户自定义词典的动态添加删除Demo

你在开发过程中,遇到哪些困难? Top

最大的困难是训练样本和语料库的不足,遗憾国内没有共享,大多数都是收费的,而且好贵。

你认为Ansj还需要在哪些方面进行完善? Top

我打算下一版的改进将围绕未登录词进行,采用crf来做新词的识别。当然随着系统的庞大,每次修改都要考虑效率内存占用。

虽然已经着手开始进行中,但是进展一直不快。有兴趣的同学可以多提意见,可以通过Github参与到该项目中,让我们做一个真正的Java版的高准确率分词。

Github地址:https://github.com/ansjsun/ansj_seg
  • 大小: 44.8 KB


评论 共 226 条
166 楼 ansjsun 2013-11-19 11:46
cdmamata 写道
2013-11-19日下载的ansj项目,在myeclipse 中找不到 love.cq.util 这个包

在我git中有个tree-split的项目.中有这个包...你也可以从我git的代码仓库中直接下载这个jar...看git的首页说明谢谢
165 楼 cdmamata 2013-11-19 11:37
2013-11-19日下载的ansj项目,在myeclipse 中找不到 love.cq.util 这个包
164 楼 ansjsun 2013-11-01 11:10
也许会有问题。但是我真的没有遇到过。当初也许运行的比较浅把。但是我记得用这个生成了1t的词共现。弱弱的问一下。如果设置为-1是否速度可以提升?还会发生什么问题?谢谢

andyshar 写道
ansj在hadoop中性能问题,可能不能用jvm重用来解决。我已用-Dmapred.job.reuse.jvm.num.tasks=-1测试过。原因可能与以下网页的分析一致。
http://stackoverflow.com/questions/4877691/is-it-possible-to-run-several-map-task-in-one-jvm/4878134#4878134

To my best knowledge, there is no easy way for multiple map tasks (Hadoop) to share static data structures.

This is actually a known problem for current Map Reduce model. The reason that current implementation doesn't share static datas across map tasks is because Hadoop is designed to be highly reliable. As a result, if a task fails, it will only crash its own JVM. It will not impact the execution of other JVMs.

163 楼 andyshar 2013-10-31 15:05
ansj在hadoop中性能问题,可能不能用jvm重用来解决。我已用-Dmapred.job.reuse.jvm.num.tasks=-1测试过。原因可能与以下网页的分析一致。
http://stackoverflow.com/questions/4877691/is-it-possible-to-run-several-map-task-in-one-jvm/4878134#4878134

To my best knowledge, there is no easy way for multiple map tasks (Hadoop) to share static data structures.

This is actually a known problem for current Map Reduce model. The reason that current implementation doesn't share static datas across map tasks is because Hadoop is designed to be highly reliable. As a result, if a task fails, it will only crash its own JVM. It will not impact the execution of other JVMs.
162 楼 ansjsun 2013-10-22 13:19
andyshar 写道
关于Hadoop的MapReduce程序使用ansj。ansjsun,我想提出一些我觉得中肯的想法。分词器对海量文档数据的分析很重要了,跟IK分词器的文档比起来,ansj的文档还是少了。而且IK在mapreduce上的性能非常优秀,可惜没有词性标注功能。即使hadoop上考虑jvm重用,我还是不知如何下手。应该考虑各词库的加载与分词功能是分开的,不能简单用ToAnalysis.parse(sentense)来解决。我目前也想着手解决中文语义分析的问题,不知你们是否要人参与。想考虑自由职业方式,参与进来,能解决生存问题就好了。


语义分析是构建语法树吗?如果有兴趣欢迎加入的。目前ansj没有语法树的构建。
关于hadoop jvm重用很简单的
http://jerrylead.iteye.com/blog/1195335
可以参考这里。我很早以前设置过一次。

词库的加载和分词其实是分开的。因为用户自定义辞典是外部的。。最新的ansj只提供了基础辞典大约10w个词左右。这10w个词主要用来处理歧义。
161 楼 andyshar 2013-10-22 10:18
关于Hadoop的MapReduce程序使用ansj。ansjsun,我想提出一些我觉得中肯的想法。分词器对海量文档数据的分析很重要了,跟IK分词器的文档比起来,ansj的文档还是少了。而且IK在mapreduce上的性能非常优秀,可惜没有词性标注功能。即使hadoop上考虑jvm重用,我还是不知如何下手。应该考虑各词库的加载与分词功能是分开的,不能简单用ToAnalysis.parse(sentense)来解决。我目前也想着手解决中文语义分析的问题,不知你们是否要人参与。想考虑自由职业方式,参与进来,能解决生存问题就好了。
160 楼 ansjsun 2013-10-21 17:26
rtygbwwwerr 写道
楼主你好,首先感谢一如既往的热心回答。关于粗分时的得分计算公式看得不是很明白:在MathUtil.compuScore()中,有这么一行:
double value = -Math.log(dSmoothingPara * frequency / (MAX_FREQUENCE + 80000) + (1 - dSmoothingPara) * ((1 - dTemp) * nTwoWordsFreq / frequency + dTemp));


请问这个公式的原理是?有没有相关的文章可以推荐一下,还有就是MAX_FREQUENCE的取值为什么是2079997,后边那个80000又是怎么来的?多谢了!


抄袭来的。。。:-)。你可以看最大熵马尔科夫。。然后看看北野斯。。就这两个东西。。。
159 楼 rtygbwwwerr 2013-10-21 16:28
楼主你好,首先感谢一如既往的热心回答。关于粗分时的得分计算公式看得不是很明白:在MathUtil.compuScore()中,有这么一行:
double value = -Math.log(dSmoothingPara * frequency / (MAX_FREQUENCE + 80000) + (1 - dSmoothingPara) * ((1 - dTemp) * nTwoWordsFreq / frequency + dTemp));


请问这个公式的原理是?有没有相关的文章可以推荐一下,还有就是MAX_FREQUENCE的取值为什么是2079997,后边那个80000又是怎么来的?多谢了!
158 楼 woshiliulei0 2013-10-20 18:11
孙大哥,你一定要帮帮我啊,我研究ansj有两个星期了,对自定义添加字典一直没有搞懂:
我从github上面下载的jar包中包含好像两个版本、第三个是从网上下载的
①ansj_seg-0.9.jar,文件大小4.63M,里面有company,META-INF,nature,newWord,org
,person,arrays.dic,bigramdict.dic,englishLibrary.dic,jianFan.dic,numberLibrary.dic,但是里面没有library.properties文件
②ansj_seg-0.8.jar.jar,文件大小7.5M,里面有文件
③ans_seg-20130615.jar(这是从网上下载的版本)里面有文件love,META-INF,org,library.properties,

写了个最简单的程序,也创建了自定义词典library/userLibrary/userLibrary.dic
public static void main(String[] args) {
// TODO Auto-generated method stub
List paser = ToAnalysis.parse("csdn创新院是一个好公司");
        System.out.println(paser);
}
但是只有第①个jar包导入项目中能分词,但是不能按照自定义字典的字分,
第③②个直接在程序运行时就报错,也不能分词
init user userLibrary ok path is : D:\MyEclipse8.5\java1\library\userLibrary\userLibrary.dic
init ambiguity  waring :null because : not find that file or can not to read !
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.String.substring(String.java:1940)
at java.lang.String.subSequence(String.java:1973)
at java.util.regex.Pattern.split(Pattern.java:1002)
at java.lang.String.split(String.java:2293)
at java.lang.String.split(String.java:2335)
at org.ansj.domain.TermNature.setNatureStrToArray(Unknown Source)
at org.ansj.library.InitDictionary.initArrays(Unknown Source)
at org.ansj.library.InitDictionary.initArrays(Unknown Source)
at org.ansj.library.InitDictionary.init(Unknown Source)
at org.ansj.library.InitDictionary.<clinit>(Unknown Source)
at org.ansj.splitWord.Analysis.analysis(Unknown Source)
at org.ansj.splitWord.Analysis.analysisStr(Unknown Source)
at org.ansj.splitWord.Analysis.parseStr(Unknown Source)
at org.ansj.splitWord.analysis.ToAnalysis.parse(Unknown Source)
at java.main(java.java:20)

一定要帮帮我啊,最好加我qq:1759242922,在线请教你一下。谢谢谢谢。。。。

157 楼 ansjsun 2013-10-18 21:02
rtygbwwwerr 写道
楼主你好!有个问题想再请教你一下:PersonNatureAttr类中,有一个字段
int[][] locFreq,debug了一下,发现里边是一个变长的数组
{{x,x}{x,x,x}{x,x,x,x}},请问这里边数值的含义是什么?

这个是。每个名字在词位置的频率。。你得看注释。。大概就是这个意思
156 楼 ansjsun 2013-10-18 21:00
andyshar 写道
你好。ansjsun。我想在hadoop中的mapreduce中使用ansj。初步用了,速度出奇的慢。你们尝试过吗?我可以要处理海量数据。另外,人名、地名、机构名等识别还有可改进之处。比如:韩国人金在中,没能正确分词。

是很慢。。因为辞典加载比较耗时。你可以每个task重用jvm来解决。。部分人名识别是有错误的但是也是不可避免的。
155 楼 rtygbwwwerr 2013-10-18 16:53
楼主你好!有个问题想再请教你一下:PersonNatureAttr类中,有一个字段
int[][] locFreq,debug了一下,发现里边是一个变长的数组
{{x,x}{x,x,x}{x,x,x,x}},请问这里边数值的含义是什么?
154 楼 andyshar 2013-10-18 11:20
你好。ansjsun。我想在hadoop中的mapreduce中使用ansj。初步用了,速度出奇的慢。你们尝试过吗?我可以要处理海量数据。另外,人名、地名、机构名等识别还有可改进之处。比如:韩国人金在中,没能正确分词。
153 楼 ansjsun 2013-10-12 18:47
woshiliulei0 写道
楼主好,我这在研究你的代码,可是在运行源码的时候为什么src下面src\test\java\org\ansj\test,路径这么深呢,在源文件中
package org.ansj.app.keyword;找不到包呢,是什么情况,如果放到java web 中怎么用呢,求解



这是maven项目的结构。。
152 楼 woshiliulei0 2013-10-12 09:03
楼主好,我这在研究你的代码,可是在运行源码的时候为什么src下面src\test\java\org\ansj\test,路径这么深呢,在源文件中
package org.ansj.app.keyword;找不到包呢,是什么情况,如果放到java web 中怎么用呢,求解
151 楼 rtygbwwwerr 2013-10-11 09:56
明白了,非常感谢!
150 楼 ansjsun 2013-10-10 19:40
rtygbwwwerr 写道
你好!最近在研究源码,有个问题想请教一下:arrays.dic这个文件中的第三个属性放入了base数组,这个值的作用是什么?

看了下InitDictionary.java中的注释,注释内容是“数组用来存放单词的转换..其实就是一个DFA转换过程”,还是甚感疑惑。求指教,谢谢!


那些数字是数组的下标..你得看双数组tire树就明白了
149 楼 rtygbwwwerr 2013-10-10 19:15
你好!最近在研究源码,有个问题想请教一下:arrays.dic这个文件中的第三个属性放入了base数组,这个值的作用是什么?

看了下InitDictionary.java中的注释,注释内容是“数组用来存放单词的转换..其实就是一个DFA转换过程”,还是甚感疑惑。求指教,谢谢!
148 楼 曾洪星 2013-10-08 17:33
ansjsun 写道
曾洪星 写道
ansjsun 写道
曾洪星 写道
你好,最近在看源码,分词的时候好像是直接就找出最优路径来了graph.walkPath(),按照分词的原理不是应该先找N最短路径的么?是我理解错了还是看漏了N最短路径相关的代码?请指教。。


你没有看错。直接就是最优路径。。其他路径为了计算成本没有例举。。我觉得例举出来也是没有太大意义的


谢谢你的回答!还有2个疑问:
1.刚刚更新了最新版本,发现核心词典的词数好像少了很多,想问下这个词典的更改是出于什么原则?

2.发现的新词好像是加到一个树里边的吧,那这些词是怎么在以后的分词中起作用的?好像分词的过程里并没有使用到这个树吧?

刚接触这方面的知识,请指教,谢谢啦!


1.核心辞典保证词的最基本的颗粒度。。就是颗粒度越细越好。但是不好是一个字。起到一个消歧义的过程。遮阳ngrame的纬度也少一些。

2.新词发现的树是一个数据结构。。本身没有什么意义。。。倒是有一个用户自定义辞典的树是有用的


明白了,thx~~
147 楼 ansjsun 2013-10-08 16:49
曾洪星 写道
ansjsun 写道
曾洪星 写道
你好,最近在看源码,分词的时候好像是直接就找出最优路径来了graph.walkPath(),按照分词的原理不是应该先找N最短路径的么?是我理解错了还是看漏了N最短路径相关的代码?请指教。。


你没有看错。直接就是最优路径。。其他路径为了计算成本没有例举。。我觉得例举出来也是没有太大意义的


谢谢你的回答!还有2个疑问:
1.刚刚更新了最新版本,发现核心词典的词数好像少了很多,想问下这个词典的更改是出于什么原则?

2.发现的新词好像是加到一个树里边的吧,那这些词是怎么在以后的分词中起作用的?好像分词的过程里并没有使用到这个树吧?

刚接触这方面的知识,请指教,谢谢啦!


1.核心辞典保证词的最基本的颗粒度。。就是颗粒度越细越好。但是不好是一个字。起到一个消歧义的过程。遮阳ngrame的纬度也少一些。

2.新词发现的树是一个数据结构。。本身没有什么意义。。。倒是有一个用户自定义辞典的树是有用的
146 楼 曾洪星 2013-10-08 16:01
ansjsun 写道
曾洪星 写道
你好,最近在看源码,分词的时候好像是直接就找出最优路径来了graph.walkPath(),按照分词的原理不是应该先找N最短路径的么?是我理解错了还是看漏了N最短路径相关的代码?请指教。。


你没有看错。直接就是最优路径。。其他路径为了计算成本没有例举。。我觉得例举出来也是没有太大意义的


谢谢你的回答!还有2个疑问:
1.刚刚更新了最新版本,发现核心词典的词数好像少了很多,想问下这个词典的更改是出于什么原则?

2.发现的新词好像是加到一个树里边的吧,那这些词是怎么在以后的分词中起作用的?好像分词的过程里并没有使用到这个树吧?

刚接触这方面的知识,请指教,谢谢啦!
145 楼 ansjsun 2013-10-08 14:11
曾洪星 写道
你好,最近在看源码,分词的时候好像是直接就找出最优路径来了graph.walkPath(),按照分词的原理不是应该先找N最短路径的么?是我理解错了还是看漏了N最短路径相关的代码?请指教。。


你没有看错。直接就是最优路径。。其他路径为了计算成本没有例举。。我觉得例举出来也是没有太大意义的
144 楼 曾洪星 2013-10-07 16:25
你好,最近在看源码,分词的时候好像是直接就找出最优路径来了graph.walkPath(),按照分词的原理不是应该先找N最短路径的么?是我理解错了还是看漏了N最短路径相关的代码?请指教。。
143 楼 ansjsun 2013-09-12 21:19
cdmamata 写道
cdmamata 写道
cdmamata 写道
2013-09-10日,反应一个小BUG,不知道算不算BUG。
将 github上面的 maven 项目打成jar包后,在 UserDefineLibrary 类的initAmbiguityLibrary 方法中,因为是在jar包中,所以 这段代码 :
"if (file.isFile() && file.canRead()) {"  始终是找不到 library 下的资源文件的,提示  "init ambiguity  error : .... because : not find that file or can not to read !"
不知道这个 BUG 对结果会不会有影响。

望回复

明白了,library 是用户词库,是作为外部资源使用的。另外,用户自定义词库文件 *.dic 的格式可否说明一下

看我github的wiki里面有这个格式的说明...
142 楼 cdmamata 2013-09-11 10:29
cdmamata 写道
cdmamata 写道
2013-09-10日,反应一个小BUG,不知道算不算BUG。
将 github上面的 maven 项目打成jar包后,在 UserDefineLibrary 类的initAmbiguityLibrary 方法中,因为是在jar包中,所以 这段代码 :
"if (file.isFile() && file.canRead()) {"  始终是找不到 library 下的资源文件的,提示  "init ambiguity  error : .... because : not find that file or can not to read !"
不知道这个 BUG 对结果会不会有影响。

望回复

明白了,library 是用户词库,是作为外部资源使用的。另外,用户自定义词库文件 *.dic 的格式可否说明一下
141 楼 cdmamata 2013-09-11 09:41
cdmamata 写道
2013-09-10日,反应一个小BUG,不知道算不算BUG。
将 github上面的 maven 项目打成jar包后,在 UserDefineLibrary 类的initAmbiguityLibrary 方法中,因为是在jar包中,所以 这段代码 :
"if (file.isFile() && file.canRead()) {"  始终是找不到 library 下的资源文件的,提示  "init ambiguity  error : .... because : not find that file or can not to read !"
不知道这个 BUG 对结果会不会有影响。

望回复
140 楼 cdmamata 2013-09-11 09:40
2013-09-10日,反应一个小BUG,不知道算不算BUG。
将 github上面的 maven 项目打成jar包后,在 UserDefineLibrary 类的initAmbiguityLibrary 方法中,因为是在jar包中,所以 这段代码 :
"if (file.isFile() && file.canRead()) {"  始终是找不到 library 下的资源文件的,提示  "init ambiguity  error : .... because : not find that file or can not to read !"
不知道这个 BUG 对结果会不会有影响。
139 楼 ansjsun 2013-06-04 09:37
violet0925 写道
.词典没有读取到
ansjsun 写道
violet0925 写道
你好,我想请教一下为什么我在自定义词典/library/userLibrary/userLibrary.dic中添加的词根本不起作用啊,给的例子里面用户新增的词也只是一种临时的存储吧,并没有加入到字典中。

如果没有起作用.可能是因为.1.词典没有读取到.2.用户自定义词与粗分结果.产生冲突.这种情况会按照粗分接过来算.

临时加入到词典的.是放到内存中.不会写入到文件的..

为什么会出现词典没有读取到呢,library.properties文件中不是已经指定路径了么,我是直接下的源码运行的不是jar包,请问读取自定义词典的具体类和方法在哪,多谢!

UserDefineLibrary.loadFile(UserDefineLibrary.FOREST, new File("词典路径")) ;
可以通过这种方式来加载..
看这里
https://github.com/ansjsun/ansj_seg/wiki/%E7%94%A8%E6%88%B7%E8%87%AA%E5%AE%9A%E4%B9%89%E8%AF%8D%E5%85%B8%E8%B7%AF%E5%BE%84%E8%AE%BE%E7%BD%AE

ps:
138 楼 violet0925 2013-06-04 08:43
.词典没有读取到
ansjsun 写道
violet0925 写道
你好,我想请教一下为什么我在自定义词典/library/userLibrary/userLibrary.dic中添加的词根本不起作用啊,给的例子里面用户新增的词也只是一种临时的存储吧,并没有加入到字典中。

如果没有起作用.可能是因为.1.词典没有读取到.2.用户自定义词与粗分结果.产生冲突.这种情况会按照粗分接过来算.

临时加入到词典的.是放到内存中.不会写入到文件的..

为什么会出现词典没有读取到呢,library.properties文件中不是已经指定路径了么,我是直接下的源码运行的不是jar包,请问读取自定义词典的具体类和方法在哪,多谢!
137 楼 ansjsun 2013-06-03 16:32
violet0925 写道
你好,我想请教一下为什么我在自定义词典/library/userLibrary/userLibrary.dic中添加的词根本不起作用啊,给的例子里面用户新增的词也只是一种临时的存储吧,并没有加入到字典中。

如果没有起作用.可能是因为.1.词典没有读取到.2.用户自定义词与粗分结果.产生冲突.这种情况会按照粗分接过来算.

临时加入到词典的.是放到内存中.不会写入到文件的..

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 国内外优秀开源项目创始人专访

    这几年陆续采访了国内外一些优秀开源项目的zuozh

  • R语言︱文本挖掘之中文分词包——Rwordseg包(原理、功能、详解)

    笔者寄语:与前面的RsowballC分词不同的地方在于这是一个中文的分词包,简单易懂,分词是一个非常重要的步骤,可以通过一些字典,进行特定分词。大致分析步骤如下: 数据导入——选择分词字典——分词 但是下载...

  • 中文分词工具Rwordseg

    Ansj 也是一个开源的 Java 中文分词工具,基于中科院的 ictclas 中文分词算法,采用隐马尔科夫模型(Hidden Markov Model, HMM)。作者孙健重写了一个Java版本,并且全部开源,使得 Ansi 可用于人名识别、地名识别...

  • 中文分词的应用 新浪和庖丁两种方式对比

    中文分词相比于英文难度要大得多,涉及到自然语言的理解和处理。分词也是文本挖掘中的关键技术之一,百度也是因为中文分词相比于google更优秀,才做到中文的检索结果更优。实际上新浪、百度云服务上很多开发者也开放...

  • Lucene下分词工具的学习探讨

    今天一天学习的东西不多,除了看《Lucene实战》第20页的程序,就是研究Java版本的开源分词器了! 在网上找到了两种分词器,ansj和imdict,本质上没有什么区别,都是用采用ICTCLAS的核心。个人觉得ansj要更好一些,...

  • NLP自然语言处理干货贴

    摘要:作者:苏剑林 来源网站:科学空间 原文链接:OCR技术浅探:9. 代码共享(完) 文件说明: 1. image... 2.OCR技术浅探:8. 综合评估 摘要:作者:苏剑林 来源网站:科学空间 原文链接:OCR技术浅探:8. 综合...

  • 高校学生选课系统项目源码资源

    项目名称: 高校学生选课系统 内容概要: 高校学生选课系统是为了方便高校学生进行选课管理而设计的系统。该系统提供了学生选课、查看课程信息、管理个人课程表等功能,同时也为教师提供了课程发布和管理功能,以及管理员对整个选课系统的管理功能。 适用人群: 学生: 高校本科生和研究生,用于选课、查看课程信息、管理个人课程表等。 教师: 高校教师,用于发布课程、管理课程信息和学生选课情况等。 管理员: 系统管理员,用于管理整个选课系统,包括用户管理、课程管理、权限管理等。 使用场景及目标: 学生选课场景: 学生登录系统后可以浏览课程列表,根据自己的专业和兴趣选择适合自己的课程,并进行选课操作。系统会实时更新学生的选课信息,并生成个人课程表。 教师发布课程场景: 教师登录系统后可以发布新的课程信息,包括课程名称、课程描述、上课时间、上课地点等。发布后的课程将出现在课程列表中供学生选择。 管理员管理场景: 管理员可以管理系统的用户信息,包括学生、教师和管理员账号的添加、删除和修改;管理课程信息,包括课程的添加、删除和修改;管理系统的权限控制,包括用户权限的分配和管理。 目标: 为高校学生提

  • TC-125 230V 50HZ 圆锯

    TC-125 230V 50HZ 圆锯

  • 影音娱乐北雨影音系统 v1.0.1-bymov101.rar

    北雨影音系统 v1.0.1_bymov101.rar 是一个计算机专业的 JSP 源码资料包,它为用户提供了一个强大而灵活的在线影音娱乐平台。该系统集成了多种功能,包括视频上传、播放、分享和评论等,旨在为用户提供一个全面而便捷的在线视频观看体验。首先,北雨影音系统具有强大的视频上传功能。用户可以轻松地将本地的视频文件上传到系统中,并与其他人分享。系统支持多种视频格式,包括常见的 MP4、AVI、FLV 等,确保用户能够方便地上传和观看各种类型的视频。其次,该系统提供了丰富的视频播放功能。用户可以选择不同的视频进行观看,并且可以调整视频的清晰度、音量等参数,以适应不同的观看需求。系统还支持自动播放下一个视频的功能,让用户可以连续观看多个视频,无需手动切换。此外,北雨影音系统还提供了一个社交互动的平台。用户可以在视频下方发表评论,与其他观众进行交流和讨论。这为用户之间的互动提供了便利,增加了观看视频的乐趣和参与感。最后,该系统还具备良好的用户体验和界面设计。界面简洁明了,操作直观易用,让用户可以快速上手并使用各项功能。同时,系统还提供了个性化的推荐功能,根据用户的观看历史和兴趣,为用户推荐

  • Tripp Trapp 儿童椅用户指南 STOKKE

    Tripp Trapp 儿童椅用户指南

  • node-v8.13.0-linux-armv6l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

  • 谷歌浏览器 64位-89.0.4389.128.exe

    Windows版本64位谷歌浏览器,是由Google谷歌公司开发的一款电脑版网络浏览器,可以运行在Windows 10/8.1/8/7 64位的操作系统上。该浏览器是基于其它开放原始码软件所撰写,包括WebKit和Mozilla,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。软件的特点是简洁、快速。并且支持多标签浏览,每个标签页面都在独立的“沙箱”内运行,在提高安全性的同时,一个标签页面的崩溃也不会导致其他标签页面被关闭。此外,谷歌浏览器(Google Chrome)基于更强大的JavaScript V8引擎,这是当前Web浏览器所无法实现的。

  • 适用于鲲鹏麒麟的OpenJDK1.8

    适用于鲲鹏麒麟的OpenJDK1.8

  • 毕业设计-基于SSH的任务调度系统的设计与实现

    任务调度试系统,基本功能包括:用户的注册、用户的登录、发起项目、项目详细及搜索等。本系统结构如下: (1)用户的注册登录: 注册模块:完成用户注册功能; 登录模块:完成用户登录功能; (2)发起项目: 发起项目模块:完成了项目及项目下一个或者多个任务的添加; 项目详细:点击项目名称,可以看到项目及任务详细信息; 搜索项目:完成对项目名称的模糊搜索功能 任务调度试系统,基本功能包括:用户的注册、用户的登录、发起项目、项目详细及搜索等。本系统结构如下: (1)用户的注册登录: 注册模块:完成用户注册功能; 登录模块:完成用户登录功能; (2)发起项目: 发起项目模块:完成了项目及项目下一个或者多个任务的添加; 项目详细:点击项目名称,可以看到项目及任务详细信息; 搜索项目:完成对项目名称的模糊搜索功能

  • 30个炫酷的数据可视化大屏(含源码)

    大屏数据可视化是以大屏为主要展示载体的数据可视化设计,30个可视化大屏包含源码,直接运行文件夹中的index.html,即可看到大屏。 内含:数据可视化页面设计;数据可视化演示系统;大数据可视化监管平台;智能看板;翼兴消防监控;南方软件视频平台;全国图书零售监测数据;晋城高速综合管控大数据;无线网络大数据平台;设备大数据;游戏数据大屏;厅店营业效能分析;车辆综合管控平台;政务大数据共享交换平台;智慧社区;物流云数据看板平台;风机可视化大屏等。

  • 基于yolov5识别算法实现的DNF自动脚本源码.zip

    优秀源码设计,详情请查看资源源码内容

  • 毕业设计:基于SSM的mysql-在线网上书店(源码 + 数据库 + 说明文档)

    毕业设计:基于SSM的mysql_在线网上书店(源码 + 数据库 + 说明文档) 2.系统分析与设计 3 2.1系统分析 3 2.1.1需求分析 3 2.1.2必要性分析 3 2.2系统概要设计 3 2.2.1 项目规划 3 2.2.2系统功能结构图 4 2.3开发及运行环境 4 2.4逻辑结构设计 5 2.4.1 数据库概要说明 5 2.4.2 主要数据表结构 6 2.5文件夹架构 9 2.6编写JAVA BEAN 9 3.网站前台主要功能模块设计 10 3.1前台首页架构设计 10 3.2网站前台首页设计 11 3.3新书上市模块设计 12 3.4特价书籍模块设计 13 3.5书籍分类模块设计 14 3.6会员管理模块设计 15 3.7购物车模块设计 17 3.8收银台设计模块 19 3.9畅销书籍模块设计 20 4.网站后台主要功能模块设计 21 4.1网站后台文件夹架构设计 21 4.2后台主页面设计 21 4.3书籍管理模块设计 22 4.4会员管理模块设计 25 4.5订单管理模块设计 26 4.6公告管理模块设计 28 4.7退出系统页面设计 29 5.网站制作中遇到的问

  • python 开发 python爬虫数据可视化分析项目源码加课题报告,源码注解清晰一看就懂,适合新手.zip

    python 开发 python爬虫数据可视化分析项目源码加课题报告,源码注解清晰一看就懂,适合新手

  • node-v8.0.0-linux-armv7l.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics