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

相關文章
相關標籤/搜索