zoukankan      html  css  js  c++  java
  • HanLP中文分词Lucene插件

     基于HanLP,支持包括Solr(7.x)在内的任何基于Lucene(7.x)的系统。

    Maven

        <dependency>

          <groupId>com.hankcs.nlp</groupId>

          <artifactId>hanlp-lucene-plugin</artifactId>

          <version>1.1.6</version>

        </dependency>

    Solr快速上手

    1.hanlp-portable.jar和hanlp-lucene-plugin.jar共两个jar放入${webapp}/WEB-INF/lib下。(或者使用mvn package对源码打包,拷贝target/hanlp-lucene-plugin-x.x.x.jar到${webapp}/WEB-INF/lib下)

    2. 修改solr core的配置文件${core}/conf/schema.xml:

      <fieldType name="text_cn" class="solr.TextField">

          <analyzer type="index">

              <tokenizer class="com.hankcs.lucene.HanLPTokenizerFactory" enableIndexMode="true"/>

          </analyzer>

          <analyzer type="query">

              <!-- 切记不要在query中开启index模式 -->

              <tokenizer class="com.hankcs.lucene.HanLPTokenizerFactory" enableIndexMode="false"/>

          </analyzer>

      </fieldType>

      <!-- 业务系统中需要分词的字段都需要指定type为text_cn -->

      <field name="my_field1" type="text_cn" indexed="true" stored="true"/>

      <field name="my_field2" type="text_cn" indexed="true" stored="true"/>

    · 如果你的业务系统中有其他字段,比如location,summary之类,也需要一一指定其type="text_cn"。切记,否则这些字段仍旧是solr默认分词器。

    · 另外,切记不要在query中开启indexMode,否则会影响PhaseQuery。indexMode只需在index中开启一遍即可。

    高级配置

    目前本插件支持如下基于schema.xml的配置:

     

    更高级的配置主要通过class path下的hanlp.properties进行配置,请阅读HanLP自然语言处理包文档以了解更多相关配置,如:

    0.用户词典

    1.词性标注

    2.简繁转换

    3.……

    停用词与同义词

    推荐利用Lucene或Solr自带的filter实现,本插件不会越俎代庖。 一个示例配置如下:

     

    调用方法

    Query改写的时候,可以利用HanLPAnalyzer分词结果中的词性等属性,如

    String text = "中华人民共和国很辽阔";

    for (int i = 0; i < text.length(); ++i)

    {

        System.out.print(text.charAt(i) + "" + i + " ");

    }

    System.out.println();

    Analyzer analyzer = new HanLPAnalyzer();

    TokenStream tokenStream = analyzer.tokenStream("field", text);

    tokenStream.reset();

    while (tokenStream.incrementToken())

    {

        CharTermAttribute attribute = tokenStream.getAttribute(CharTermAttribute.class);

        // 偏移量

        OffsetAttribute offsetAtt = tokenStream.getAttribute(OffsetAttribute.class);

        // 距离

        PositionIncrementAttribute positionAttr = tokenStream.getAttribute(PositionIncrementAttribute.class);

        // 词性

        TypeAttribute typeAttr = tokenStream.getAttribute(TypeAttribute.class);

        System.out.printf("[%d:%d %d] %s/%s ", offsetAtt.startOffset(), offsetAtt.endOffset(), positionAttr.getPositionIncrement(), attribute, typeAttr.type());

    }

    在另一些场景,支持以自定义的分词器(比如开启了命名实体识别的分词器、繁体中文分词器、CRF分词器等)构造HanLPTokenizer,比如:

    tokenizer = new HanLPTokenizer(HanLP.newSegment()

                                        .enableJapaneseNameRecognize(true)

                                        .enableIndexMode(true), null, false);

    tokenizer.setReader(new StringReader("林志玲亮相网友:确定不是波多野结衣?"));

    文章摘自:2019 github

  • 相关阅读:
    获取设备唯一标识 uuid(采用第三方库SSKeychain)
    基于定时器的动画和性能调优
    获取设备的唯一标识uuid
    获取网络状态ios(2G、3G、4G、Wifi)
    equals 为什么要把常量写在前面?
    svn提交更新代码提示Please execute the 'Cleanup' command 的解决办法
    C# 一次循环获取树的两种方法
    递归拼装无限层级菜单树
    mysql错误:Column count doesn't match value count at row 1解决办法
    IDEA 解决Number objects are compared using '==', not 'equals()' 警告
  • 原文地址:https://www.cnblogs.com/adnb34g/p/10708902.html
Copyright © 2011-2022 走看看