美文网首页
Lucene 入门 05 - 中文分析器

Lucene 入门 05 - 中文分析器

作者: __Y_Q | 来源:发表于2020-01-16 11:54 被阅读0次

上一章说了基本的查询流程, 这一章说一下分析器.
Lucene 默认使用的是标准分析器 StandardAnalyzer, 但是对中文是不支持分词的.

使用 Analyzer 对象的 tokenStream 方法返回一个 TokenStream 对象, 这个对象中包含了最终的分词结果. 现在来测试一把.

    @Test
    public void testTokenStream() throws Exception {
        //创建一个 Analyzer 对象, StandardAnalyzer.
        Analyzer analyzer = new StandardAnalyzer();
        //使用分析器对象的 tokenStream 方法获得 TokenStream 对象.
        TokenStream tokenStream = analyzer.tokenStream("", "spring lucene 全文检索是将整本书java、整篇文章中的任意内容信息查找出来的检索");
        //向 TokenStream 对象中设置一个引用, 相当于设置一个指针
        CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
        //调用 TokenStream 对象的 rest 方法, 把指针重置.
        tokenStream.reset();
        // 使用 while 来遍历 TokenStream 对象
        // 通过 incrementToken 方法判断是否结束
        while (tokenStream.incrementToken()) {
            System.out.println(charTermAttribute.toString());
        }
        // 关闭 TokenStream
        tokenStream.close();
    }

运行测试方法.


测试结果

这里使用的就是 Lucene 默认的分析器 StandardAnalyzer , 他无法对中文做出分词效果. 比如我们想把 "全文检索"这四个字分出来 ,使用默认的就无法达到我们想要的效果.

使用第三方包 IKAnalyzer 来实现中文分词

什么是 IKAnalyzer :
IK 采用了特有的"正想迭代最细粒度切分算法", 多子处理器分析模式, 具有 50 万字/秒 的高速处理能力
网站: https://code.google.com/archive/p/ik-analyzer/downloads

在官网上下载 source 后解压 里面包含文件目录如下


source
  • ext.dic 扩展词典, IK 本身提供的分词词库有限, 我们可以添加自己想要的分词, 也可以去除原有的分词.
  • stopword.dic 停用词典.用来停用一些不必要的敏感词.
  • IKAnalyzer.cfg.xml IK的配置文件,用来指定 停用词典和扩展词典. 也可以增加自己的扩展词典.

还是上面那个例子, 我们不希望分析器对 "spring lucene 全文检索是将整本书java、整篇文章中的任意内容信息查找出来的检索" 这个字符串中的 "全文检索是将" 这几个字进行分词,

  • 添加依赖
  • 添加配置文件,停用词库, 扩展词库, 并在配置文件内指定词库.
  • 在扩展词库内,写入我们不希望被分词的字符串 例 "全文检索是将"
  • 修改上面代码中的创建分析器对象为 IKAnalyzer
  1. 引入依赖包
 <dependency>
      <groupId>com.janeluo</groupId>
      <artifactId>ikanalyzer</artifactId>  
      <version>2012_u6</version>
</dependency>
  1. 添加完依赖后, 把 ext.dic, stopword.dic, IKAnalyzer.cfg.xml copy 到项目中的 resources 目录下 , 并在 IKAnalyzer.cfg.xml 中指定扩展词库与停用词库.
文件目录

IKAnalyzer.cfg.xml , 每个分号后面都可以加上自己的词库

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <!--用户可以在这里配置自己的扩展字典 -->
    <entry key="ext_dict">hotword.dic;</entry>
    <!--用户可以在这里配置自己的扩展停止词字典-->
    <entry key="ext_stopwords">stopwords.dic;</entry>
</properties>
  1. 把不希望分词的内容添加到 ext.dic

    不希望被分词的字符串
    注意: 扩展词典和停用词典打开和保存的时候一定要注意编码格式, 一定要 UTF-8.
    注意: 扩展词典和停用词典打开和保存的时候一定要注意编码格式, 一定要 UTF-8.
    注意: 扩展词典和停用词典打开和保存的时候一定要注意编码格式, 一定要 UTF-8.
  2. 把上面代码中创建分析器的代码改动一下

Analyzer analyzer = new StandardAnalyzer();

改为

Analyzer analyzer = new IKAnalyzer();

运行结果如下.


中文分词结果

可以发现,我们添加进去的那个字符串,没有被分词.

停用词典的用法和扩展词典的用法一样, 也是直接添加进去就行.

最后说一遍注意编码. UTF-8.

下一章说索引库的维护.

相关文章

网友评论

      本文标题:Lucene 入门 05 - 中文分析器

      本文链接:https://www.haomeiwen.com/subject/tpwfzctx.html