阅读更多
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 条
196 楼 louiswang 2014-02-14 12:25
我测试了分词速度,大文本在28w/s,用户词库自己整的,有30万左右,是什么原因呢
195 楼 ansjsun 2014-02-11 22:27
BeMyself_wangl 写道
ansjsun 写道
BeMyself_wangl 写道
Exception in thread "main" java.lang.NoSuchMethodError: org.ansj.splitWord.analysis.ToAnalysis.<init>(Ljava/io/Reader;)V
at org.ansj.lucene4.AnsjAnalysis.createComponents(AnsjAnalysis.java:38)
at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:142)

ansj_seg-1.1以后就报这个错了。
是我调用的不对?



应该不是..treesplit包更新了.你得更新到1.2版本..通过http://maven.ansj.org/org/ansj/tree_split/1.2/ 下载



我一开始就是tree_split-1.2.jar+ansj_lucene4_plug-1.0.jar+ansj_seg-1.3.jar
就是报错。
把ansj_seg-1.3.jar 退回到 ansj_seg-1.1.jar 就不报错了。


你好.你联系我qq吧..因为我现在都不怎么做lucene了.而且1.3改动的地方比较大..我有点担心,偏移量我写的不对.你要是还在做.有兴趣.我帮你调试.你帮我反馈问题.我的q是5144694
194 楼 BeMyself_wangl 2014-02-11 13:56
ansjsun 写道
BeMyself_wangl 写道
Exception in thread "main" java.lang.NoSuchMethodError: org.ansj.splitWord.analysis.ToAnalysis.<init>(Ljava/io/Reader;)V
at org.ansj.lucene4.AnsjAnalysis.createComponents(AnsjAnalysis.java:38)
at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:142)

ansj_seg-1.1以后就报这个错了。
是我调用的不对?



应该不是..treesplit包更新了.你得更新到1.2版本..通过http://maven.ansj.org/org/ansj/tree_split/1.2/ 下载



我一开始就是tree_split-1.2.jar+ansj_lucene4_plug-1.0.jar+ansj_seg-1.3.jar
就是报错。
把ansj_seg-1.3.jar 退回到 ansj_seg-1.1.jar 就不报错了。
193 楼 ansjsun 2014-02-10 20:36
BeMyself_wangl 写道
Exception in thread "main" java.lang.NoSuchMethodError: org.ansj.splitWord.analysis.ToAnalysis.<init>(Ljava/io/Reader;)V
at org.ansj.lucene4.AnsjAnalysis.createComponents(AnsjAnalysis.java:38)
at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:142)

ansj_seg-1.1以后就报这个错了。
是我调用的不对?



应该不是..treesplit包更新了.你得更新到1.2版本..通过http://maven.ansj.org/org/ansj/tree_split/1.2/ 下载
192 楼 BeMyself_wangl 2014-02-10 16:17
Exception in thread "main" java.lang.NoSuchMethodError: org.ansj.splitWord.analysis.ToAnalysis.<init>(Ljava/io/Reader;)V
at org.ansj.lucene4.AnsjAnalysis.createComponents(AnsjAnalysis.java:38)
at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:142)

ansj_seg-1.1以后就报这个错了。
是我调用的不对?

191 楼 ansjsun 2014-01-28 10:21
louiswang 写道
另外在arrays.dic里面出现的词,用户词库里面去重这些词不会影响分词效果吧?


如果 你的分词是1个月前的。。那个辞典是不去重的。。。用户自定义辞典优先最大匹配原则。。

对于这种词语 “他/从/马上/掉/了/下来”会是这个结果.最新版的对用户自定义辞典中的词。进行了去重设置。

总而言之。不怕重复。对分词影响微乎其微。就算用户自定义辞典本身有词重复。也没有影响。
190 楼 louiswang 2014-01-27 23:00
另外在arrays.dic里面出现的词,用户词库里面去重这些词不会影响分词效果吧?
189 楼 louiswang 2014-01-27 22:58
有几个问题咨询下:
1.arrays.dic 里,序号和base数据怎么来的呢,比如:
154651 望风而 154651 121834 1 null
第一列和第三列的值,单个字是两个字节的int值,单字符串怎么来的,是相加得到么?
2.建立无环图gp后,中文应该以标点分割建立多个gp吧,这样效率会不会高些,比如“中国,中国梦”
188 楼 ansjsun 2014-01-24 23:49
andyshar 写道
ansj大侠:有个问题,我还没看代码。不过也可能是我语料问题。语料是大数据,不便查。你能简单看出是什么问题不?
2014-01-24 13:45:40,053 FATAL [IPC Server handler 23 on 43278] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Task: attempt_1388218982030_1509_r_000003_1 - exited : java.lang.ArrayIndexOutOfBoundsException: 427277
at org.ansj.splitWord.impl.GetWordsImpl.getStatement(GetWordsImpl.java:111)
at org.ansj.splitWord.impl.GetWordsImpl.allWords(GetWordsImpl.java:57)
at org.ansj.splitWord.Analysis.analysis(Analysis.java:198)
at org.ansj.splitWord.Analysis.analysisStr(Analysis.java:138)
at org.ansj.splitWord.Analysis.parseStr(Analysis.java:218)
at org.ansj.splitWord.analysis.ToAnalysis.parse(ToAnalysis.java:117)
at cn.antvision.newword.mr.Job0_Deserializer$Reduce.reduce(Job0_Deserializ


首先你ansj版本是多少号
?因为我看你是hadoop中跑的..所以你调试估计是比较困难的..
理论上不会有任何句子会造成这种问题.哪怕传入的都是乱码..但是实际上如你所见.他真的发生了...
建议你升级到..0.1版本..对了我最近在重构分词..所以.不要升级到1.1版本.因为1.1的jar有50多m..你升级到0.91就可以..如果已经是了...那只能找到那个例句才可能解决..因为我用这个也跑过很多文本.木有发现这个错误额...




187 楼 andyshar 2014-01-24 14:05
ansj大侠:有个问题,我还没看代码。不过也可能是我语料问题。语料是大数据,不便查。你能简单看出是什么问题不?
2014-01-24 13:45:40,053 FATAL [IPC Server handler 23 on 43278] org.apache.hadoop.mapred.TaskAttemptListenerImpl: Task: attempt_1388218982030_1509_r_000003_1 - exited : java.lang.ArrayIndexOutOfBoundsException: 427277
at org.ansj.splitWord.impl.GetWordsImpl.getStatement(GetWordsImpl.java:111)
at org.ansj.splitWord.impl.GetWordsImpl.allWords(GetWordsImpl.java:57)
at org.ansj.splitWord.Analysis.analysis(Analysis.java:198)
at org.ansj.splitWord.Analysis.analysisStr(Analysis.java:138)
at org.ansj.splitWord.Analysis.parseStr(Analysis.java:218)
at org.ansj.splitWord.analysis.ToAnalysis.parse(ToAnalysis.java:117)
at cn.antvision.newword.mr.Job0_Deserializer$Reduce.reduce(Job0_Deserializ
186 楼 ansjsun 2014-01-18 21:17
andyshar 写道
ansjsun 写道
andyshar 写道
你好,尊敬的ansjsun。呵呵请允许我这样称呼。上次提到hadoop中用ansj分词器。我后来在Reduce里使用ansj,由于Reduce的分组特性,ansj的多次加载的问题得到一定缓解。现在还有个问题请教:
目前ansj分词器,能够智能的识别一些词典以外的新词。而我现在是想把新词找出来,如何利用分词器判断出是词典以外的新词。似乎并非新词都是标注的nw词性,比如人名、地名、机构名。



nlpanalysis 支持新词识别。但是不很稳定。人名地名机构名。统称未登录词识别。他们的词性分别是。nr 。nz ,nt ,领域词或者其他不确定的是nw。不过词性标注可能会出错


如果不稳定的话,我不是一定要用ansj的新词识别功能。其实我是在利用大数据来实现找新词的功能。但用Ansj时,由于智能识别了一些人名、地名、机构名,所以不知这其中哪些是ansj词典里所没有的了,所以可能会漏掉一些新词。因此我想知道有无简单的方法,判断这些智能识别的词是否是词典里所没有的。

andyshar 写道
ansjsun 写道
andyshar 写道
你好,尊敬的ansjsun。呵呵请允许我这样称呼。上次提到hadoop中用ansj分词器。我后来在Reduce里使用ansj,由于Reduce的分组特性,ansj的多次加载的问题得到一定缓解。现在还有个问题请教:
目前ansj分词器,能够智能的识别一些词典以外的新词。而我现在是想把新词找出来,如何利用分词器判断出是词典以外的新词。似乎并非新词都是标注的nw词性,比如人名、地名、机构名。



nlpanalysis 支持新词识别。但是不很稳定。人名地名机构名。统称未登录词识别。他们的词性分别是。nr 。nz ,nt ,领域词或者其他不确定的是nw。不过词性标注可能会出错


如果不稳定的话,我不是一定要用ansj的新词识别功能。其实我是在利用大数据来实现找新词的功能。但用Ansj时,由于智能识别了一些人名、地名、机构名,所以不知这其中哪些是ansj词典里所没有的了,所以可能会漏掉一些新词。因此我想知道有无简单的方法,判断这些智能识别的词是否是词典里所没有的。



你要做词典整理的工作啊?
http://demo.ansj.org/
试试这个..效果应该好一点..

这版还木有开源.因为model比较大.我得想办法压缩下...

寻找的方法.你可以把所有标注为.nr nt nw的词语都保留下来.和词典.然后去重..
185 楼 andyshar 2014-01-17 11:08
ansjsun 写道
andyshar 写道
你好,尊敬的ansjsun。呵呵请允许我这样称呼。上次提到hadoop中用ansj分词器。我后来在Reduce里使用ansj,由于Reduce的分组特性,ansj的多次加载的问题得到一定缓解。现在还有个问题请教:
目前ansj分词器,能够智能的识别一些词典以外的新词。而我现在是想把新词找出来,如何利用分词器判断出是词典以外的新词。似乎并非新词都是标注的nw词性,比如人名、地名、机构名。



nlpanalysis 支持新词识别。但是不很稳定。人名地名机构名。统称未登录词识别。他们的词性分别是。nr 。nz ,nt ,领域词或者其他不确定的是nw。不过词性标注可能会出错


如果不稳定的话,我不是一定要用ansj的新词识别功能。其实我是在利用大数据来实现找新词的功能。但用Ansj时,由于智能识别了一些人名、地名、机构名,所以不知这其中哪些是ansj词典里所没有的了,所以可能会漏掉一些新词。因此我想知道有无简单的方法,判断这些智能识别的词是否是词典里所没有的。
184 楼 ansjsun 2014-01-13 11:01
andyshar 写道
你好,尊敬的ansjsun。呵呵请允许我这样称呼。上次提到hadoop中用ansj分词器。我后来在Reduce里使用ansj,由于Reduce的分组特性,ansj的多次加载的问题得到一定缓解。现在还有个问题请教:
目前ansj分词器,能够智能的识别一些词典以外的新词。而我现在是想把新词找出来,如何利用分词器判断出是词典以外的新词。似乎并非新词都是标注的nw词性,比如人名、地名、机构名。



nlpanalysis 支持新词识别。但是不很稳定。人名地名机构名。统称未登录词识别。他们的词性分别是。nr 。nz ,nt ,领域词或者其他不确定的是nw。不过词性标注可能会出错
183 楼 andyshar 2014-01-13 09:26
你好,尊敬的ansjsun。呵呵请允许我这样称呼。上次提到hadoop中用ansj分词器。我后来在Reduce里使用ansj,由于Reduce的分组特性,ansj的多次加载的问题得到一定缓解。现在还有个问题请教:
目前ansj分词器,能够智能的识别一些词典以外的新词。而我现在是想把新词找出来,如何利用分词器判断出是词典以外的新词。似乎并非新词都是标注的nw词性,比如人名、地名、机构名。
182 楼 rtygbwwwerr 2013-12-06 15:31
人名识别发现一个问题:
人名识别的上下文词典分3种情况
    11 人名的下文
    12 两个中国人名之间的成分
    44 可拆分的姓名
而在代码中,12被算做了姓名的上文:
case 12:
this.end += freq;
this.begin += freq;
allFreq += freq;
break;
参见张华平的论文《基于角色标注的中国人名自动识别研究》,应该还有一类词属于人名的上文。作者对这种类型是否进行了合并?在现在的词典中,“记者”一词被标为了“11”,为人名的下文,而这词通常来说是作为人名的上文来使用的。

现在因为这个原因,导致部分人名识别不准,比如:这句话的分词“本报上海1月 30日电 记者萧关根、张炯强报道”为:“本报 上海 1月 30日 电 记者 萧关 根 、 张炯 强 报道...”,里边的两个人名都识别有误,其中决定因素是“记者”这个词被标为了11,没有作为人名上文,结果计算的得分偏大,导致识别失败。
181 楼 rtygbwwwerr 2013-11-29 18:30
ansjsun 写道
rtygbwwwerr 写道
楼主你好!有个问题想再请教你一下:PersonNatureAttr类中,有一个字段
int[][] locFreq,debug了一下,发现里边是一个变长的数组
{{x,x}{x,x,x}{x,x,x,x}},请问这里边数值的含义是什么?

这个是。每个名字在词位置的频率。。你得看注释。。大概就是这个意思


这个数组的含义大概明白了,就是指该字作为人名,在对应Pattern对应位置出现的频率。例如:
碧 {17,23} {2,552,119} {0,0,3,0}

模式频率数组为:
   2字姓名:17,23   在模式BC中,第一个位置出现17次,第二个位置出现23次
   3字姓名:2,552,119   在模式BCD中,第一个位置出现2次,第二个位置出现552次,第三个位置出现119次
   4字姓名:0,0,3,0   在模式BCDE中,第一个位置出现0次,第二个位置出现0次,第三个位置出现3次,第四个位置出现0次

但是一个新的问题来了,我发现这个词典里边有许多双字词,比如:
欧阳 {153,4} {194,2,0} {0,0,0,0}

出现在3字姓名的第一个和第二个尚可理解:欧阳X,X欧阳,但是出现在2字姓名的第二个位置怎么理解?光“欧阳”这个词就已经2个字了

180 楼 cdmamata 2013-11-26 18:31
cdmamata 写道
ansjsun 写道
cdmamata 写道
ansjsun 写道

感谢孙大哥,本来想把问题整理完,一次性问完,可发现又漏掉一个,
就是 stopwords.dic 文件的第二列是一些浮点类型,他是不是表示的停用词的级别指标?是不是数字越小,他停用的级别越大。


stopwords.dic  这个 俄 。。。。不是的 。。如果是 0代表是停用此 。。如果 其他数字 。。是索引中权重占的比较少 。。你之关心 0的就可以了 。。还有 。。这个辞典我不知道你从哪里搞来的 。。。我记得我在lucene插件中已经废弃了。。。现在停用词后面已经没有数字了 。。。只要在辞典中的词全部过滤 。。也不要数字

stopwords.dic 这个是以前下载的lucene 插件中带的,可能是版本有点旧了,我更新一下版本看看。
万分感谢孙健大哥



最新的lucene插件 在这里 https://github.com/ansjsun/ansj_seg/tree/master/plug

好的,但是这个 lucene 插件 里面没有自带 新版的 stopwords.dic 文件啊,新版跟旧版区别大吗?
179 楼 ansjsun 2013-11-26 10:47
ansjsun 写道
cdmamata 写道
ansjsun 写道

感谢孙大哥,本来想把问题整理完,一次性问完,可发现又漏掉一个,
就是 stopwords.dic 文件的第二列是一些浮点类型,他是不是表示的停用词的级别指标?是不是数字越小,他停用的级别越大。


stopwords.dic  这个 俄 。。。。不是的 。。如果是 0代表是停用此 。。如果 其他数字 。。是索引中权重占的比较少 。。你之关心 0的就可以了 。。还有 。。这个辞典我不知道你从哪里搞来的 。。。我记得我在lucene插件中已经废弃了。。。现在停用词后面已经没有数字了 。。。只要在辞典中的词全部过滤 。。也不要数字

stopwords.dic 这个是以前下载的lucene 插件中带的,可能是版本有点旧了,我更新一下版本看看。
万分感谢孙健大哥



最新的lucene插件 在这里 https://github.com/ansjsun/ansj_seg/tree/master/plug
178 楼 cdmamata 2013-11-26 10:09
cdmamata 写道
ansjsun 写道

感谢孙大哥,本来想把问题整理完,一次性问完,可发现又漏掉一个,
就是 stopwords.dic 文件的第二列是一些浮点类型,他是不是表示的停用词的级别指标?是不是数字越小,他停用的级别越大。


stopwords.dic  这个 俄 。。。。不是的 。。如果是 0代表是停用此 。。如果 其他数字 。。是索引中权重占的比较少 。。你之关心 0的就可以了 。。还有 。。这个辞典我不知道你从哪里搞来的 。。。我记得我在lucene插件中已经废弃了。。。现在停用词后面已经没有数字了 。。。只要在辞典中的词全部过滤 。。也不要数字

stopwords.dic 这个是以前下载的lucene 插件中带的,可能是版本有点旧了,我更新一下版本看看。
万分感谢孙健大哥
177 楼 ansjsun 2013-11-25 15:57
cdmamata 写道
ansjsun 写道
cdmamata 写道
ansjsun 写道
cdmamata 写道

也就是说,
1、不能通过加载外部停用词表达到过滤的目的。
2、这个过滤不能持久化到配置文件中,只是对当前当前运行程序生效。
是这样的吗
还有,stopwords.dic 这个停用词库该怎么加载,或者说他的使用方法是怎样的


1.是的。。程序内部。没有通过外部停用此加载的目的
2.其实辞典就是持久化了。。

只不过你需要自己读取stopwords.dic 这个读取就是一行一个词。。你读取出来。然后放进去就可以了。。。

哦,了解了,就是说,通过文件流的方式,将stopwords.dic 里的内容,放到map 中,然后  setUpdateDic 。但是还有一些其他的疑问
1、流读取 stopwords.dic ,放入map,会不会对效率产生影响?
2、如何将学习到的新词持久化加到用户词库文件中呢?UserDefineLibrary.insertWord("新词测试", "userDefine", 1000);这个方法也只是对当前程序有效,有没有可以将新词直接保存到用户词库中的方法?


1.因为只初始化一次.而且停用词文件也就是几k的规模.效率基本不会影响的...
2.学习到的新词.无法写入到词典中..你可以写到一个文件中.然后补充到用户词典中.

感谢孙大哥,本来想把问题整理完,一次性问完,可发现又漏掉一个,
就是 stopwords.dic 文件的第二列是一些浮点类型,他是不是表示的停用词的级别指标?是不是数字越小,他停用的级别越大。


stopwords.dic  这个 俄 。。。。不是的 。。如果是 0代表是停用此 。。如果 其他数字 。。是索引中权重占的比较少 。。你之关心 0的就可以了 。。还有 。。这个辞典我不知道你从哪里搞来的 。。。我记得我在lucene插件中已经废弃了。。。现在停用词后面已经没有数字了 。。。只要在辞典中的词全部过滤 。。也不要数字
176 楼 cdmamata 2013-11-25 11:56
ansjsun 写道
cdmamata 写道
ansjsun 写道
cdmamata 写道

也就是说,
1、不能通过加载外部停用词表达到过滤的目的。
2、这个过滤不能持久化到配置文件中,只是对当前当前运行程序生效。
是这样的吗
还有,stopwords.dic 这个停用词库该怎么加载,或者说他的使用方法是怎样的


1.是的。。程序内部。没有通过外部停用此加载的目的
2.其实辞典就是持久化了。。

只不过你需要自己读取stopwords.dic 这个读取就是一行一个词。。你读取出来。然后放进去就可以了。。。

哦,了解了,就是说,通过文件流的方式,将stopwords.dic 里的内容,放到map 中,然后  setUpdateDic 。但是还有一些其他的疑问
1、流读取 stopwords.dic ,放入map,会不会对效率产生影响?
2、如何将学习到的新词持久化加到用户词库文件中呢?UserDefineLibrary.insertWord("新词测试", "userDefine", 1000);这个方法也只是对当前程序有效,有没有可以将新词直接保存到用户词库中的方法?


1.因为只初始化一次.而且停用词文件也就是几k的规模.效率基本不会影响的...
2.学习到的新词.无法写入到词典中..你可以写到一个文件中.然后补充到用户词典中.

感谢孙大哥,本来想把问题整理完,一次性问完,可发现又漏掉一个,
就是 stopwords.dic 文件的第二列是一些浮点类型,他是不是表示的停用词的级别指标?是不是数字越小,他停用的级别越大。
175 楼 ansjsun 2013-11-22 19:24
cdmamata 写道
ansjsun 写道
cdmamata 写道

也就是说,
1、不能通过加载外部停用词表达到过滤的目的。
2、这个过滤不能持久化到配置文件中,只是对当前当前运行程序生效。
是这样的吗
还有,stopwords.dic 这个停用词库该怎么加载,或者说他的使用方法是怎样的


1.是的。。程序内部。没有通过外部停用此加载的目的
2.其实辞典就是持久化了。。

只不过你需要自己读取stopwords.dic 这个读取就是一行一个词。。你读取出来。然后放进去就可以了。。。

哦,了解了,就是说,通过文件流的方式,将stopwords.dic 里的内容,放到map 中,然后  setUpdateDic 。但是还有一些其他的疑问
1、流读取 stopwords.dic ,放入map,会不会对效率产生影响?
2、如何将学习到的新词持久化加到用户词库文件中呢?UserDefineLibrary.insertWord("新词测试", "userDefine", 1000);这个方法也只是对当前程序有效,有没有可以将新词直接保存到用户词库中的方法?


1.因为只初始化一次.而且停用词文件也就是几k的规模.效率基本不会影响的...
2.学习到的新词.无法写入到词典中..你可以写到一个文件中.然后补充到用户词典中.
174 楼 cdmamata 2013-11-22 16:58
ansjsun 写道
cdmamata 写道

也就是说,
1、不能通过加载外部停用词表达到过滤的目的。
2、这个过滤不能持久化到配置文件中,只是对当前当前运行程序生效。
是这样的吗
还有,stopwords.dic 这个停用词库该怎么加载,或者说他的使用方法是怎样的


1.是的。。程序内部。没有通过外部停用此加载的目的
2.其实辞典就是持久化了。。

只不过你需要自己读取stopwords.dic 这个读取就是一行一个词。。你读取出来。然后放进去就可以了。。。

哦,了解了,就是说,通过文件流的方式,将stopwords.dic 里的内容,放到map 中,然后  setUpdateDic 。但是还有一些其他的疑问
1、流读取 stopwords.dic ,放入map,会不会对效率产生影响?
2、如何将学习到的新词持久化加到用户词库文件中呢?UserDefineLibrary.insertWord("新词测试", "userDefine", 1000);这个方法也只是对当前程序有效,有没有可以将新词直接保存到用户词库中的方法?
173 楼 ansjsun 2013-11-22 12:22
cdmamata 写道
ansjsun 写道
cdmamata 写道
ansjsun 写道
cdmamata 写道
ansjsun 写道
cdmamata 写道
2013-11-19日下载的ansj项目,在myeclipse 中找不到 love.cq.util 这个包

在我git中有个tree-split的项目.中有这个包...你也可以从我git的代码仓库中直接下载这个jar...看git的首页说明谢谢

OK,呵呵,大意了,忘了修改 pom.xml,导致maven 没有将jar包导入,谢谢耐心指导。还有麻烦请教一下,ansj包含能过滤 “的,地,得,”和 标点符号 的方法吗



这个是没有的..一般你在外部用个set or map来做吧...在lucene插件中有这个功能.停用词表自己找


updateDic.put("但是", FilterModifWord._stop);
FilterModifWord.setUpdateDic(updateDic);
这个方法可以达到过滤的目的,但是,这个方法不是永久写入到词库里面,然后,
我在 lucene 插件的 library 里面找到一个 stopwords.dic 停用词表,如何加载该词表,利用该词表里面的做过滤,以达到上面停用词的目的?


词表一行一行加入到updateDic.put(word, FilterModifWord._stop);中就可以。。需要你在外部填充。没有配置填充的

也就是说,
1、不能通过加载外部停用词表达到过滤的目的。
2、这个过滤不能持久化到配置文件中,只是对当前当前运行程序生效。
是这样的吗
还有,stopwords.dic 这个停用词库该怎么加载,或者说他的使用方法是怎样的


1.是的。。程序内部。没有通过外部停用此加载的目的
2.其实辞典就是持久化了。。

只不过你需要自己读取stopwords.dic 这个读取就是一行一个词。。你读取出来。然后放进去就可以了。。。
172 楼 cdmamata 2013-11-22 10:37
ansjsun 写道
cdmamata 写道
ansjsun 写道
cdmamata 写道
ansjsun 写道
cdmamata 写道
2013-11-19日下载的ansj项目,在myeclipse 中找不到 love.cq.util 这个包

在我git中有个tree-split的项目.中有这个包...你也可以从我git的代码仓库中直接下载这个jar...看git的首页说明谢谢

OK,呵呵,大意了,忘了修改 pom.xml,导致maven 没有将jar包导入,谢谢耐心指导。还有麻烦请教一下,ansj包含能过滤 “的,地,得,”和 标点符号 的方法吗



这个是没有的..一般你在外部用个set or map来做吧...在lucene插件中有这个功能.停用词表自己找


updateDic.put("但是", FilterModifWord._stop);
FilterModifWord.setUpdateDic(updateDic);
这个方法可以达到过滤的目的,但是,这个方法不是永久写入到词库里面,然后,
我在 lucene 插件的 library 里面找到一个 stopwords.dic 停用词表,如何加载该词表,利用该词表里面的做过滤,以达到上面停用词的目的?


词表一行一行加入到updateDic.put(word, FilterModifWord._stop);中就可以。。需要你在外部填充。没有配置填充的

也就是说,
1、不能通过加载外部停用词表达到过滤的目的。
2、这个过滤不能持久化到配置文件中,只是对当前当前运行程序生效。
是这样的吗
还有,stopwords.dic 这个停用词库该怎么加载,或者说他的使用方法是怎样的
171 楼 ansjsun 2013-11-22 10:27
cdmamata 写道
ansjsun 写道
cdmamata 写道
ansjsun 写道
cdmamata 写道
2013-11-19日下载的ansj项目,在myeclipse 中找不到 love.cq.util 这个包

在我git中有个tree-split的项目.中有这个包...你也可以从我git的代码仓库中直接下载这个jar...看git的首页说明谢谢

OK,呵呵,大意了,忘了修改 pom.xml,导致maven 没有将jar包导入,谢谢耐心指导。还有麻烦请教一下,ansj包含能过滤 “的,地,得,”和 标点符号 的方法吗



这个是没有的..一般你在外部用个set or map来做吧...在lucene插件中有这个功能.停用词表自己找


updateDic.put("但是", FilterModifWord._stop);
FilterModifWord.setUpdateDic(updateDic);
这个方法可以达到过滤的目的,但是,这个方法不是永久写入到词库里面,然后,
我在 lucene 插件的 library 里面找到一个 stopwords.dic 停用词表,如何加载该词表,利用该词表里面的做过滤,以达到上面停用词的目的?


词表一行一行加入到updateDic.put(word, FilterModifWord._stop);中就可以。。需要你在外部填充。没有配置填充的
170 楼 cdmamata 2013-11-21 17:59
ansjsun 写道
cdmamata 写道
ansjsun 写道
cdmamata 写道
2013-11-19日下载的ansj项目,在myeclipse 中找不到 love.cq.util 这个包

在我git中有个tree-split的项目.中有这个包...你也可以从我git的代码仓库中直接下载这个jar...看git的首页说明谢谢

OK,呵呵,大意了,忘了修改 pom.xml,导致maven 没有将jar包导入,谢谢耐心指导。还有麻烦请教一下,ansj包含能过滤 “的,地,得,”和 标点符号 的方法吗



这个是没有的..一般你在外部用个set or map来做吧...在lucene插件中有这个功能.停用词表自己找


updateDic.put("但是", FilterModifWord._stop);
FilterModifWord.setUpdateDic(updateDic);
这个方法可以达到过滤的目的,但是,这个方法不是永久写入到词库里面,然后,
我在 lucene 插件的 library 里面找到一个 stopwords.dic 停用词表,如何加载该词表,利用该词表里面的做过滤,以达到上面停用词的目的?
169 楼 cdmamata 2013-11-19 14:00
ansjsun 写道
cdmamata 写道
ansjsun 写道
cdmamata 写道
2013-11-19日下载的ansj项目,在myeclipse 中找不到 love.cq.util 这个包

在我git中有个tree-split的项目.中有这个包...你也可以从我git的代码仓库中直接下载这个jar...看git的首页说明谢谢

OK,呵呵,大意了,忘了修改 pom.xml,导致maven 没有将jar包导入,谢谢耐心指导。还有麻烦请教一下,ansj包含能过滤 “的,地,得,”和 标点符号 的方法吗



这个是没有的..一般你在外部用个set or map来做吧...在lucene插件中有这个功能.停用词表自己找

万分感谢孙大哥的指导
168 楼 ansjsun 2013-11-19 12:08
cdmamata 写道
ansjsun 写道
cdmamata 写道
2013-11-19日下载的ansj项目,在myeclipse 中找不到 love.cq.util 这个包

在我git中有个tree-split的项目.中有这个包...你也可以从我git的代码仓库中直接下载这个jar...看git的首页说明谢谢

OK,呵呵,大意了,忘了修改 pom.xml,导致maven 没有将jar包导入,谢谢耐心指导。还有麻烦请教一下,ansj包含能过滤 “的,地,得,”和 标点符号 的方法吗



这个是没有的..一般你在外部用个set or map来做吧...在lucene插件中有这个功能.停用词表自己找
167 楼 cdmamata 2013-11-19 12:06
ansjsun 写道
cdmamata 写道
2013-11-19日下载的ansj项目,在myeclipse 中找不到 love.cq.util 这个包

在我git中有个tree-split的项目.中有这个包...你也可以从我git的代码仓库中直接下载这个jar...看git的首页说明谢谢

OK,呵呵,大意了,忘了修改 pom.xml,导致maven 没有将jar包导入,谢谢耐心指导。还有麻烦请教一下,ansj包含能过滤 “的,地,得,”和 标点符号 的方法吗

发表评论

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

相关推荐

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

    这几年陆续采访了国内外一些优秀开源项目的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