3.0 分词器详解

2016-02-17 00:19:23 5,344 0


在建立索引和搜索时,都会用到分词器,建立索引时和搜索时使用的分词器应该是同一个,否则可能会出现搜不到的情况。

实际中,我们不会去开发分词器,都是使用别人开发好的分词器,因此我们主要是学会如何使用这些分词器。

目前所有的分词器,对英文都有很好的处理。例如对于这样的一句话:

An IndexWriter creates and maintains an index.

存储时:

第一步:切分关键词:

分词器首先会根据空格将这段话拆分为一个个单独的英语单词,并将标点去掉:

An 
IndexWriter 
creates 
and 
maintains 
an 
index

第二步:去除停用词

创建索引时,有些单词在文本中出现的概率非常高,但是对文本所带的信息基本不产生影响,例如:英文中的“aantheof”,中文中的“了、的、着”。停用词通常会被过滤掉,不会被进行索引。

         用户检索时,检索系统也会将停用词过滤掉。

第三步:对于英文单词,把所有的单词转为小写(搜索时不区分大小写)

indexwriter 
creates 
maintains 
index

如果我们想查看某段内容的分词结果,可以按照如下方式进行

@Test
    public void test() throws IOException{
        Analyzer analyzer=new StandardAnalyzer();
        String text = "An IndexWriter creates and maintains an index";
        TokenStream tokenStream = analyzer.tokenStream("", text);
        tokenStream.reset();
        while (tokenStream.incrementToken()) {
            CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
            System.out.println(charTermAttribute);
            
        }
    }

运行这段代码,你可以看到"An IndexWriter creates and maintains an index"这段话的分词效果。现在我们来看看中文

将text的内容替换为:"我爱北京天安门"

运行程序后,分词效果为:

我
爱
北
京
天
安
门

发现对于中文,实际上是一个字一个字的进行分词,这样明显是不行的。即使官方提供的Analyzer子类ChineseAnalyzer,分词也打不到我们想要的效果,读者可以自己尝试。

在使用Lucene建立索引的时候,官方提供的分词器由于对中文支持不友好,所以我们需要使用另外的分词器,比较火的是庖丁解牛分词器和IKAnalyzer分词,后面一一介绍。