`
lies_joker
  • 浏览: 39888 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ansj分词器和solr结合的零零碎碎

阅读更多
在solr4.8使用的章节里我讲了很多有关ansj分词器的用法以及相关描述和个人看法。这里新开一篇专门描述。

传送门:https://github.com/ansjsun/ansj_seg/
作者是个年轻的技术男,github上有他的微博,可以和他沟通交流问题(加粉吧,虽然微博现在不流行了,但是这么好的分词器的作者才800多粉丝看着心疼)。

ansj最新版下载下来有40+MB,不过新特性自然语言方面用到的crf.model(NlpAnalysis分词会用到)占了37MB,一般做搜索的是用不到的,所以直接精简掉吧,立刻很轻松有木有。去掉之后就不能再用NlpAnalysis分词了,不过因为分词器通常和索引以及搜索混合使用,建议用ToAnalysis即可。

ansj附加词库是比较前卫的树形添加,按照文件或者文件夹批量添加,这样会带来一个问题,词库是在项目内还是另外存放,在项目内的话,打包项目后不方便找到,有时会有bug,这里我是推荐另外存放,也方便持续添加,然后用配置文件来指向目录即可。开发中善用配置文件可以明显得提高生产力,避免将配置写死在代码里。

如果只用一种分词方法来实现索引和搜索,那么重写Tokenizer即可,但是实际使用solr过程中,索引我们通常希望最小颗粒,搜索采用智能分词,所以就需要传入参数进行配置选择特定的分词器,因此需要重写TokenizerFactory,传入参数。我的schema.xml配置如下
<fieldType name="text_ansj" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
      <tokenizer class="org.ansj.solr.ANSJTokenizerFactory" useSmart="false"/> 
  <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
    </analyzer> 
<analyzer type="query"> 
      <tokenizer class="org.ansj.solr.ANSJTokenizerFactory" useSmart="true"/> 
  <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true"/>
    </analyzer> 
  </fieldType>
考虑到ansj自己并没有停用词库,后续应该会添加lucene自己的停用词库。重写Tokenizer时需要注意termAtt和offsetAtt设置不要出错,因为ansj的Term没有末位位置,所以需要自己处理:
termAtt.copyBuffer(term.getName().toCharArray(),0,term.getName().length());
offsetAtt.setOffset(term.getOffe(),term.getOffe()+term.getName().length());


前段时间ansj结合solr4.8后一直在做solrcloud,后来直接拿来用,发来ansj有不少问题和不足。一个很大的bug是它索引排序有问题,导致useFastVectorHighlighter时候会报错,无法使用。这个一个不小的问题。我折腾很久,甚至差点放弃了ansj,最后总算发现是ansj的IndexAnalysis有不够周全的地方。毕竟ansj的分词重点是智能分词和发现新词,传统分词不被作者重视也在情理之中。下面说下问题具体所在。
    比如我们要对“创业者创业”进行分词,传统的IKanalyzer之类的分词,分出来是“创业者 创业 业者 创业”,ansj分词是“创业者 创业 创 创业 业 者”。先不说创业者被过分细碎分词(ansj实在太简单粗暴了),这个分出来的词排序明显不对,position位置错误,useFastVectorHighlighter高亮会存储错误的向量地址。所以需要在IndexAnalysis里矫正分词的排序。

     然后是最细分词的问题,抽时间我会进行二次开发,提高准确度,降低冗余。



未完待续....
分享到:
评论

相关推荐

    ANSJ中文分词器

    aAnsj中文分词 这是一个ictclas的java实现.基本上重写了所有的数据结构和算法.词典是用的开源版的ictclas所提供的.并且进行了部分的人工优化 内存中中文分词每秒钟

    ansj分词工具所需jar包(最新)

    这是目前来说最新的ansj分词jar包,导入即可使用

    ansj分词器手册

    ansj分词.ict的真正java实现.分词效果速度都超过开源版的ict. 中文分词,人名识别,词性标注,用户自定义词典

    ansj分词ansj_seg-5.1.5.jar

    ansj分词配置jar包,结合nlp-lang的配置jar使用。

    ansj中文分词工具

    最新2015年的java工程的ansj中文分词工具 myeclipse工程

    Ansj中文分词(强大)

    Ansj中文分词是一款纯Java、主要用于自然语言处理、高精度的中文分词工具,目标是“准确、高效、自由地进行中文分词”。 内容简介:http://www.iteye.com/magazines/102#234 此分词具有自己学习的功能,所以拜托大家...

    Ansj分词工具包

    用途1 新建项目——&gt;将ansj_seg-5.1.5.jar、nlp-lang-1.7.7.jar导入项目中。即可使用。 用途2 示例程序 1.1 将程序源码导入到Myeclipse中 1.2 此时,程序中自带的jar包路径可能不正确,须将两个jar包删除,然后...

    word分词器、ansj分词器、mmseg4j分词器、ik-analyzer分词器分词效果评估

    ansj、mmseg4j和ik-analyzer的评估程序 博文链接:https://yangshangchuan.iteye.com/blog/2056537

    ansj分词_思维导图

    研究ansj代码之后,所做的思维导图。如需转载,请注明出处。

    ansj分词jar包

    solr配置ansj,managed-schema.xml中配置 &lt;fieldType name="text_ansj" class="solr.TextField" positionIncrementGap="100"&gt; &lt;tokenizer class="org.ansj.lucene.util.AnsjTokenizerFactory" isQuery="false"/...

    springMVC+ansj中文分词

    springMVC+mybatis+自动摘要+ansj中文分词+关键词匹配规则等等

    Ansj中文分词

    Ansj中文分词是一个完全开源的、基于Google语义模型+条件随机场模型的中文分词的Java实现,具有使用简单、开箱即用等特点。 Ansj分词速度达到每秒钟大约100万字左右(Mac Air下测试),准确率能达到96%以上。 ...

    ANSJ分词JAR包

    ANSJ分词JAR包,Github上面已经找不到了,这是孙健老师通过QQ发给我的,很是感谢,关于ANSJ更多请看 http://blog.csdn.net/blogdevteam/article/details/8148451

    ansj分词、关键词匹配

    springMVC+ansj中文分词+多线程+mybatis+redis+多库等等

    跟益达学Solr5之使用Ansj分词器

    NULL 博文链接:https://iamyida.iteye.com/blog/2220833

    ansj elasticsearch 分词插件

    ansj elasticsearch 分词

    ansj分词 jar包

    ansj 分词所需jar包,包括ansj_seg-5.1.1.jar 、ansj_seg-5.1.1-sources.jar、nlp-lang-1.7.2.jar、nlp-lang-1.7.2-sources.jar、pinyin4j-2.5.0.jar

    ansj_solr_all

    ansj_solr_all

    ansj中文分词器源码

    分词速度达到每秒钟大约200万字左右(mac air下测试),准确率能达到96%以上目前实现了.中文分词. 中文姓名识别 . 用户自定义词典,关键字提取,自动摘要,关键字标记等功能

    最新的ansj分词jar包

    这是目前来说最新的ansj分词jar包,导入即可使用

Global site tag (gtag.js) - Google Analytics