阅读更多
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. 综合...

  • 基于单片机的科学型计算器设计(51+1602+KEY40)#0067

    包括:源程序工程文件、Proteus仿真工程文件、配套技术手册等 1、采用51/52单片机作为主控芯片; 2、采用1602液晶显示; 3、采用5*8矩阵键盘输入; 4、功能键包括:复位键(RST),回删键(DEL),确定键(OK),第二功能切换(2U),背光灯键(LED); 5、运算均为单精度浮点数,包括: 加(+),减(-),乘(x),除(÷), e底指数(e^n),N次方(x^n),开N次方(sqrt), 正弦(sin),余弦(cos),正切(tan), 对数(log), 阶乘(n!)(n<35), 排列(Arn), 累加(∑), *开启第二功能(2U)后可用: 反正弦(asin),反余弦(acos),反正切(atan), 组合(Crn)

  • 基于三菱FX2N PLC的机械手控制系统设计与实现

    内容概要:本文详细介绍了如何利用三菱FX2N系列PLC构建机械手控制系统。主要内容涵盖电路图设计、IO表配置、源程序编写以及单机组态。文中提供了具体的梯形图编程实例,展示了如何通过PLC精确控制机械手的各种动作,如抓取、移动和放置。此外,还分享了许多实用的调试技巧和注意事项,强调了传感器状态交叉验证和关键动作的时间守护机制。通过这些内容,读者可以全面了解PLC在机械手控制中的应用。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC编程和机械手控制感兴趣的初学者和有一定经验的研发人员。 使用场景及目标:适用于需要设计和实施机械手控制系统的工业场合,帮助工程师掌握PLC编程技巧,提高机械手控制系统的稳定性和可靠性。 其他说明:文章不仅提供理论指导,还包括大量实战代码和调试经验,有助于读者快速上手并在实践中不断优化系统性能。

  • 豆包生成美女的AI提示词基于豆包平台的美女图像生成提示词

    内容概要:本文档提供了用于生成具有时尚性感元素的美女跳舞图像的提示词指南。文档内容包括角色设定为擅长描绘时尚与超现实主义图片的创作者,背景设定强调女性形象,偏好展现性感漂亮女孩的镜头表达。目标在于根据用户指令创作三幅统一风格的图像,注重色彩搭配和高清效果,同时确保每张图片都具备半身像、真实感和电影效果的特点。文档还给出了具体的输出示例,详细描述了人物形象、服装搭配以及场景布置等要素,旨在为用户提供满意的图像生成服务。; 适合人群:对图像生成感兴趣,尤其是喜欢带有时尚性感元素的美女图像的用户。; 使用场景及目标:①根据用户提供的简单场景信息(如户外或室内)生成三幅不同场景但风格统一的赛博朋克风格美女跳舞图像;②确保生成的图像符合特定的要求,如半身像、真实感、电影效果、性感服装、特定灯光效果等;③通过询问用户对生成图像的满意度来保证服务质量。; 其他说明:文档明确了图像生成的工作流程,从接收用户指令到根据反馈调整生成内容,确保整个过程高效且满足用户需求。同时,文档还限制了生成图像的具体条件,如场景必须为赛博朋克风格、不能出现鞋子和其他人等,以保证图像的独特性和一致性。

  • 蓝桥杯大赛模拟题PDF

    题目描述 1.问题描述 一个正整数如果任何一个数位不大于右边相邻的数位,则称为一个数位递增的 数,例如1135是一个数位递增的数,而1024不是一个数位递增的数。 给定正整数n,请问在整数1至n中有多少个数位递增的数? 输入格式 输入的第一行包含一个整数n。 输出格式 输出一行包含一个整数,表示答案。 样例输入 30 样例输出

  • 基于非对称纳什谈判的多微网电能共享优化策略及其MATLAB实现

    内容概要:本文详细介绍了基于非对称纳什谈判的多微网电能共享运行优化策略及其MATLAB代码实现。首先阐述了纳什谈判和合作博弈的基本理论,然后将多微网电能共享合作运行模型分解为微网联盟效益最大化和合作收益分配两个子问题。文中展示了如何通过交替方向乘子法(ADMM)进行分布式求解,确保各微网隐私安全。此外,还探讨了电转气(P2G)和碳捕集(CCS)设备的应用,以实现低碳调度。最后,通过具体代码示例解释了模型的构建、求解及优化过程。 适合人群:对电力系统优化、博弈论、MATLAB编程感兴趣的科研人员和技术开发者。 使用场景及目标:适用于希望深入了解多微网电能共享优化策略的研究者,旨在提高微网联盟的整体效益并实现公平合理的收益分配。同时,该策略有助于降低碳排放,提升系统的环境友好性和经济性。 其他说明:文章提供了详细的代码注释和调试技巧,帮助读者更好地理解和实现这一复杂的优化策略。

  • MATLAB机器人仿真:基于视觉控制的六轴机械臂运动路径规划与实现

    内容概要:本文详细介绍了如何利用MATLAB进行六轴机械臂的视觉控制系统仿真。首先,通过MATLAB的图像处理工具箱捕捉并处理实时视频流,使用HSV颜色空间进行颜色阈值处理,从而定位红色小球的位置。然后,借助Robotics Toolbox中的逆运动学模块,将摄像头获取的目标位置转换为机械臂的关节角度,确保机械臂能够精准地追踪目标。此外,还讨论了路径规划的方法,如使用五次多项式插值和平滑滤波器,使机械臂的动作更加流畅。文中强调了实际应用中可能遇到的问题及其解决方法,如奇异点处理、坐标系转换和机械臂的速度限制等。 适合人群:具有一定编程基础和技术背景的研究人员、工程师以及对机器人视觉控制感兴趣的开发者。 使用场景及目标:适用于希望在MATLAB环境中快速搭建和测试机械臂视觉控制系统的科研人员和工程师。主要目标是掌握从图像处理到机械臂控制的完整流程,理解各模块的工作原理,并能够在实际项目中应用。 其他说明:本文不仅提供了详细的代码示例,还分享了许多实用的经验和技巧,帮助读者更好地理解和优化仿真系统。同时提醒读者注意仿真与现实之间的差异,如摄像头延迟、机械臂传动误差等问题。

  • 【KUKA 机器人坐标的建立】:mo2_base_en.ppt

    KUKA机器人相关文档

  • 【KUKA 机器人资料】:KAKA机器人汽车座椅测试系统.pdf

    KUKA机器人相关文档

  • 三相变流器MPC控制:Matlab/Simulink仿真实现及优化技巧

    内容概要:本文详细介绍了三相变流器的模型预测控制(MPC)在Matlab/Simulink环境下的实现过程。首先,初始化程序设置了关键参数,如直流母线电压、开关频率和控制周期等,确保系统的稳定性和效率。接着,通过MPC_sfun.c实现了核心控制算法,采用状态空间模型进行滚动预测,提高了系统的动态响应能力。最后,利用out.m生成高质量的仿真结果图,展示了负载突变时的快速恢复特性,并提供了优化建议,如调整代价函数权重和引入软约束等。 适合人群:电力电子工程师、控制系统研究人员以及对MPC感兴趣的科研工作者。 使用场景及目标:适用于需要精确控制电压电流的场合,如电动汽车充电站、风力发电系统等。主要目标是提高系统的动态响应速度、降低总谐波失真(THD),并在性能和计算负担之间取得平衡。 其他说明:文中提到了一些实用技巧,如控制周期的选择、预测步长的优化、图形绘制的最佳实践等,有助于读者更好地理解和应用MPC控制策略。同时,强调了在实际应用中需要注意的问题,如避免过高开关频率导致器件损坏等。

  • 网络炒作策划要点解析.ppt

    网络炒作策划要点解析.ppt

  • 三菱Q03UDE PLC SFC编程模板在16轴伺服控制系统中的应用与优化

    内容概要:本文详细介绍了三菱Q03UDE PLC使用SFC(顺序功能图)编程方法在16轴伺服控制系统中的应用。文章首先概述了硬件配置,包括500个IO点、16轴伺服控制以及触摸屏的画面编程。接着深入探讨了SFC编程的具体实现方式,如将复杂的轴控制分解为独立的流程块,利用并行结构解决多轴同步问题,通过触摸屏实时监控和反馈SFC步状态,以及如何高效管理和复用输出点。此外,文章还讨论了SFC在状态管理和报警处理方面的优势,并提供了具体的代码示例来展示其实现细节。最后,作者分享了一些实用技巧和注意事项,强调了SFC编程相比传统梯形图的优势。 适合人群:从事工业自动化控制系统的工程师和技术人员,尤其是对三菱PLC和SFC编程感兴趣的读者。 使用场景及目标:适用于需要进行复杂多轴伺服控制项目的工程师,旨在提高调试效率、减少信号冲突、缩短新人培养周期,并提供一种更加直观和高效的编程方法。 其他说明:文中提到的实际项目经验有助于读者更好地理解和应用SFC编程技术,同时也提醒了一些常见的错误和陷阱,帮助读者避免不必要的麻烦。

  • LabVIEW与三菱FX3U PLC串口通讯:基于Modbus协议的简易实现及应用

    内容概要:本文详细介绍了如何使用LabVIEW实现与三菱FX3U PLC的串口通讯,采用Modbus无协议通讯方式进行简单读写操作。主要内容包括PLC通讯参数配置、LabVIEW工程结构搭建、Modbus报文构造方法以及具体的读写数据模块实现。文中提供了详细的代码示例和注意事项,帮助读者快速理解和实践这一通讯过程。 适合人群:对工业自动化有一定兴趣的技术人员,尤其是熟悉LabVIEW和三菱PLC的工程师。 使用场景及目标:适用于需要将LabVIEW作为上位机与三菱FX3U PLC进行串口通讯的应用场合,如工业控制系统、实验教学等。主要目标是掌握Modbus协议的基础知识及其在LabVIEW中的具体实现。 其他说明:文章还提供了一些常见的错误排查方法和实用技巧,如CRC校验的处理、地址偏移量的注意事项等。此外,附带了完整的源码供读者下载和参考。

  • 图像检索-基于零样本开集的草图图像检索系统实现-附项目源码+流程教程-优质项目实战.zip

    图像检索_基于零样本开集的草图图像检索系统实现_附项目源码+流程教程_优质项目实战

Global site tag (gtag.js) - Google Analytics