Lucene05-分词器

Lucene05-分词器

 

一、概念

Analyzer(分词器)的做用是把一段文本中的词按规则取出所包含的全部词。对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,因此对于不一样的语言(规则),要用不一样的分词器。以下图html

 

 注意:在建立索引时会用到分词器,在使用字符串搜索时也会用到分词器,这两个地方要使用同一个分词器,不然可能会搜索不出结果。因此当改变分词器的时候,须要从新创建索引库java

二、常见的中文分词器

中文的分词比较复杂,由于不是一个字就是一个词,并且一个词在另一个地方就可能不是一个词,如在帽子和服装中,和服就不是一个词。对于中文分词,一般有三种方式:单字分词、二分法分词、词典分词git

2.1 单字分词

就是按照中文一个字一个字地进行分词,效率比较低。如:咱们是中国人,效果:。(StandardAnalyzer就是这样)github

Analyzer analyzer2 = new StandardAnalyzer();算法

2.2 二分法分词

按两个字进行切分,把相邻的两个字组成词分解出来,效率也比较低。并且不少状况下分的词不对。如:咱们是中国人,效果:咱们们是是中中国国人。(CJKAnalyzer就是这样)apache

Analyzer analyzer3 = new CJKAnalyzer(Version.LUCENE_30);maven

2.3 词库分词(IKAnalyzer)

按某种算法构造词,而后去匹配已建好的词库集合,若是匹配到就切分出来成为词语。一般词库分词被认为是最理想的中文分词算法。如:咱们是中国人,效果为:咱们中国人。(使用极易分词的MMAnalyzer。可使用极易分词,或者是庖丁分词分词器、IKAnalyzer)。测试

Analyzer analyzer4 = new IKAnalyzer();spa

基本上能够把词分出来(常常用的分词器)code

 

三、IDEA集成IKAnalyzer

3.1 添加maven依赖

<!-- IK分词器-->
        <dependency>
            <groupId>com.github.magese</groupId>
            <artifactId>ik-analyzer</artifactId>
            <version>7.4.0</version>
        </dependency>

 

3.2 添加配置文件

停用词和扩展词以及配置文件

 

ext_stopword.dic为停用词的词库,词库里的词都被看成为停用词使用。

 

ext_dict.dic 为扩用词的词库,词库里的词都被看成为扩用词使用。

 

停用词:有些词在文本中出现的频率很是高。但对本文的语义产生不了多大的影响。例如英文的aantheof等。或中文的”的、了、呢等”。这样的词称为停用词。停用词常常被过滤掉,不会被进行索引。在检索的过程当中,若是用户的查询词中含有停用词,系统会自动过滤掉。停用词能够加快索引的速度,减小索引库文件的大小。

扩展词:就是不想让哪些词被分开,让他们分红一个词。好比传智播客、传智

IKAnalyzer.cfg.xmlIKAnalyzer的配置文件。

<?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">ext_dict.dic;</entry>
<!--用户能够在这里配置本身的扩展中止词字典-->
<entry key="ext_stopwords">ext_stopword.dic;</entry>
</properties>

 

3.3 测试分词器

添加测试类

代码以下:

import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.cjk.CJKAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.junit.Test; import org.wltea.analyzer.lucene.IKAnalyzer; import java.io.IOException; import java.io.StringReader; /** * @author PC-Black * @version v1.0 * @date 2019/7/20 18:39 * @description TODO **/
public class AnalayzerTest { @Test public void testIKAnalyzer()throws IOException { //使用lucene 自带的标准分词器...
        IKAnalyzer analyzer = new IKAnalyzer(); // Analyzer analyzer=new CJKAnalyzer(); // Analyzer analyzer=new StandardAnalyzer();
        analyzer(analyzer,"最贵的苹果4"); } public static void analyzer(Analyzer analyzer, String str) throws IOException { StringReader reader = new StringReader(str); //处理单个字符组成的字符流,读取Reader对象中的数据,处理后转换成词汇单元
        TokenStream tokenStream = analyzer.tokenStream(str, reader); // 清空流
        try { tokenStream.reset(); } catch (IOException e) { e.printStackTrace(); } CharTermAttribute attribute = tokenStream.getAttribute(CharTermAttribute.class); try { while (tokenStream.incrementToken()) { System.out.print(attribute.toString()+"|"); } } catch (IOException e) { e.printStackTrace(); } } }

 

单字分词器

 

二分法分词

 

IK分词

 

原文出处:https://www.cnblogs.com/yuanke-blog/p/11218851.html

相关文章
相关标签/搜索