Lucene 实战教程第七章七大分词器 Analyzer 介绍和使用

这一章也不算是什么新的内容了,前面我已经写过两篇关于 Analyzer 的内容了。它们分别是《深入理解 Lucene 的 Analyzer》、《详解 org.apache.lucene.analysis.Analyzer 使用教程》。这篇文章,我们在对七个常用的 Analyzer 做个介绍吧!

为什么要有 Analyzer 呢?

对于 Lucene 而言,不管是索引还是检索,都是针对纯文本而言,对于纯文本的来源可以是 PDF,Word,Excel,PPT,HTML等,Lucene 对此并不关心,只要保证传递给 Lucene 的是纯文本即可。

以我们使用谷歌和百度为例,我们在搜索框里输入内容后,搜索引擎会根据我们输入的内容扯分出关键字。这个过程对 Lucene 来说,就是 Analyzer 分词器的应用场景里。Analyzer 主要是用来构建 TokenStreams。TokenStream 是一个分词后的 Token 结果组成的流,通过流能够不断的得到下一个 Token。这个前面也有介绍,后面还会再来写,本文先略过。

下面我们一起来看看常用的 7 个 Analyzer 吧。

分析器 说明
WhitespaceAnalyzer 根据空格拆分语汇单元
SimpleAnalyzer 根据非字母拆分文本,并将其转换为小写形式
StopAnalyzer 根据非字母拆分文本,然后小写化,再移除停用词
KeywordAnalyzer 将整个文本作为一个单一语汇单元处理
StandardAnalyzer 根据Unicode文本分割算法,具体算法参考Unicode Standard Annex #29,然后将文本转化为小写,并移除英文停用词
SmartChineseAnalyzer SmartChineseAnalyzer 是一个智能中文分词模块,能够利用概率对汉语句子进行最优切分,并内嵌英文 tokenizer,能有效处理中英文混合的文本内容。它的原理基于自然语言处理领域的隐马尔科夫模型(HMM),利用大量语料库的训练来统计汉语词汇的词频和跳转概率,从而根据这些统计结果对整个汉语句子计算最似然(likelihood)的切分。因为智能分词需要词典来保存词汇的统计值,SmartChineseAnalyzer 的运行需要指定词典位置,如何指定词典位置请参考org.apache.lucene.analysis.cn.smart.AnalyzerProfile。SmartChineseAnalyzer 的算法和语料库词典来自于ICTCLAS
CJKAnalyzer CJK表示中日韩,目的是要把分别来自中文、日文、韩文、越文中,本质、意义相同、形状一样或稍异的表意文字(主要为汉字,但也有仿汉字如日本国字、韩国独有汉字、越南的喃字)在ISO 10646 及 Unicode 标准内赋予相同编码。对于中文是交叉双字分割,二元分词法

Analyzer 主要是用来构建 TokenStreams。下面我们来看看 WhitespaceAnalyzer,SimpleAnalyzer,StopAnalyzer,StandardAnalyzer,CJKAnalyzer,SmartChineseAnalyzer 这 6 大常用分词器的简单用法。它们分别具有对英文、中文、特殊符号及邮箱等的切分效果。

public class AnalyzerDemo {
    private static final String[] examples = {
        "The quick brown 1234 fox jumped over the lazy dog!", 
        "XY&Z 15.6 Corporation - xttblog@xttblog.com",
        "北京市北京大学"
    };
    private static final Analyzer[] ANALYZERS = new Analyzer[]{
        new WhitespaceAnalyzer(), 
        new SimpleAnalyzer(), 
        new StopAnalyzer(), 
        new StandardAnalyzer(), 
        new CJKAnalyzer(), 
        new SmartChineseAnalyzer()
    };
    @Test
    public void testAnalyzer() throws IOException {
        for (int i = 0; i < ANALYZERS.length; i++) {
            String simpleName = ANALYZERS[i].getClass().getSimpleName();
            for (int j = 0; j < examples.length; j++) {
                TokenStream contents = ANALYZERS[i].tokenStream("contents", examples[j]);
                //TokenStream contents = ANALYZERS[i].tokenStream("contents", new StringReader(examples[j]));
                OffsetAttribute offsetAttribute = contents.addAttribute(OffsetAttribute.class);
                TypeAttribute typeAttribute = contents.addAttribute(TypeAttribute.class);
                contents.reset();
                System.out.println(simpleName + " analyzing : " + examples[j]);
                while (contents.incrementToken()) {
                    String s1 = offsetAttribute.toString();
                    int i1 = offsetAttribute.startOffset();//起始偏移量
                    int i2 = offsetAttribute.endOffset();//结束偏移量
                    System.out.print(s1 + "[" + i1 + "," + i2 + ":" + typeAttribute.type() + "]" + " ");
                }
                contents.end();
                contents.close();
                System.out.println();
            }
        }
    }
}

运行效果我就不贴了,大家自己去看!

Lucene 实战教程第七章七大分词器 Analyzer 介绍和使用

: » Lucene 实战教程第七章七大分词器 Analyzer 介绍和使用

原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/251963.html

(0)
上一篇 2022年5月3日
下一篇 2022年5月3日

相关推荐

发表回复

登录后才能评论