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

  • 《CSS样式表行为手册》中文chm最新版本

    CSS样式表里重点讲述“行为”功能的一本CHM参考手册,很实用方便,内容也很丰富,收藏一下哦!

  • 1-中国各地区-固定资产投资-房地产开发投资情况(1999-2020年)-社科数据.zip

    中国各地区固定资产投资中的房地产开发投资数据集涵盖了1999至2020年的详细统计信息。该数据集包含了全国各城市地级市州的房地产开发投资情况,这些数据对于理解中国城市化进程、经济发展和房地产市场趋势至关重要。数据集中的指标包括年份、地区以及对应的房地产开发投资额(以亿元为单位),这些数据来源于中国区域统计年鉴及各省市统计年鉴。通过这些数据,研究者和决策者可以深入了解不同地区的经济动态,评估房地产市场的健康状况,并据此制定相应的政策和战略。这些数据不仅有助于宏观经济分析,还能为房地产开发商提供市场进入和扩张的决策支持。

  • 1-中国各地区数字经济发展对环境污染的影响数据(2011-2021年)-社科数据.zip

    中国各地区数字经济发展对环境污染的影响数据集(2011-2021年)提供了深入分析数字经济与环境污染关系的实证数据。该数据集涵盖了中国各地区在数字经济发展水平、环境污染物排放量、人口与经济指标、外资利用情况以及绿色专利指标等多个维度的数据。具体来说,数据集包括了行政区划代码、年份、所属省份等基本信息,以及数字经济水平熵值法、PM2.5均值、工业烟粉尘排放量、工业二氧化硫排放量、工业废水排放量等关键指标。此外,数据集还涉及了人口密度、人均地区生产总值、实际利用外资额占GDP之比、科学支出占比等经济和人口统计数据,以及绿色专利申请和授权总量等创新指标。这些数据不仅有助于研究者探讨数字经济对环境污染的直接影响,还能分析其潜在的中介机制和影响因素,为理解数字经济如何影响环境质量提供了宝贵的数据资源。

  • 1-中国各区县-工业行业企业数2004-2020年-社科数据.zip

    中国各区县工业行业企业数数据集覆盖了2004至2020年的时间跨度,提供了全国范围内区县级工业企业数量的详细统计。这些数据不仅能够反映中国工业企业的发展趋势和分布状况,而且对于研究工业行业的区域差异、发展质量和效益具有重要意义。数据集中包含了省份、地区、时间以及工业行业企业数目等关键指标,总计超过33000条数据记录。这些数据来源于各地方统计局,并经过整理,为研究者提供了一个宝贵的资源,以支持对中国经济特别是工业行业的深入分析和研究。

  • BGM坏了吗111111

    BGM坏了吗111111

  • 毕业设计&课设_主要语言为 Java,含相关文件及配置.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

  • Puppet 模块用于安装和管理 Python、pip、virtualenvs 和 Gunicorn 虚拟主机 .zip

    puppet-python The Puppet module is used to install and manage python, pip, virtualenvs, and Gunicorn virtual hosts. Please note that the module stankevich/python has been deprecated and is now available under Vox Pupuli: puppet/python. Usage For usage of classes, see Resources. If contributed, update to bundle exec rake strings:generate\[',,,,false,true'] hierarchical configuration. This module supports configuration through hiera. The following example creates two python3 virtual environments.

  • WorldPO连接器标准尺寸及其选型指南,包含1.27mm、0.8mm、0.5mm间距的高速连接器

    WORLDPO(沃德披欧)是在政策支持下,成功做出对标进口品质和多达15个系列型号的连接器品牌,并且在专业机构的检测下,成功通过ISO 9001认证,FCC认证,CE认证。 内容概要:本文档为WorldPO连接器产品的选型手册,详细介绍了多种型号连接器的产品规格和参数, 包括标准的引脚间距(1.27mm、0.8mm、0.5mm、0.635mm等)、具体的引脚数量(如6-500针)、各式引脚样式(如贴片式、直插式等)、电镀方式(金镀层厚度不同)、 此外,还提供了配对合高高度、接触材料、电流负载能力、额定电流、不同型号的最大插拔次数和温度范围以及操作环境条件等多种关键属性说明。文中所有技术数据均有详细的图表辅助解读,方便用户快速查找所需参数。此外,还支持非标准定制服务。 使用场景及目标:帮助用户快速查找并选择适合自己应用需求的电连接器型号。例如,针对不同的信号传输要求,如高速数据传输、电力供应或是模拟信号传输,可以选择具有相应特性的连接器。 可以通过直接联系供应商来获取进一步的支持和服务建议。 其他说明:文档末尾提供联系人邮箱和电话,方便客户进行业务洽谈和技术支持查询。

  • 操作系统概述期末复习题(含解析)

    操作系统期末复习题

  • 毕业设计&课设_博客系统,含前后端技术,附搭建教程,曾获优秀毕业论文及展示页面截图.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

  • 个人原创STM32F1 BOOTLOADER,主控芯片为STM32F103VET6

    F103BL 是BOOTLOADER,需要通过仿真器进行写入; F103Usr 是一个用户程序编写实例; SW_BootLoader 是QT写的上位机,在BL的模式下通过串口和这个上位机将用户程序写入芯片; STM32的程序是利用uVision5.36编译 SW_BootLoader 是用QT5.15.2编译的

  • 线性调频LFM脉冲压缩雷达仿真 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

  • 数据科学领域的主流数据集类型及其应用分析

    内容概要:本文详细介绍了数据集中最常见的几种类型,包括结构化数据集(关系型数据库数据、时间序列数据、地理空间数据)、非结构化数据集(文本数据、图像数据、音频数据、视频数据)、半结构化数据集(JSON数据、XML数据)、流式数据集(传感器数据、社交媒体数据、网络日志数据)、多维数据集(数据仓库数据、数据立方体数据)和合成数据集(模拟数据、生成数据)。每种类型都具体描述了其特点、应用场景和优势。 适合人群:数据科学家、数据分析师、机器学习工程师和其他从事数据相关工作的专业人士。 使用场景及目标:帮助读者深入了解各种数据集的特点和应用场景,提升数据处理和分析能力,更好地利用数据集解决实际问题。 其他说明:随着大数据和人工智能技术的发展,数据集的种类、规模和复杂性不断增加,了解不同类型数据集的特点和应用场景对于提高算法性能和效果至关重要。

Global site tag (gtag.js) - Google Analytics