Analyzer(分詞器)的做用是把一段文本中的詞按規則取出所包含的全部詞。對應的是Analyzer類,這是一個抽象類,切分詞的具體規則是由子類實現的,因此對於不一樣的語言(規則),要用不一樣的分詞器。以下圖html
注意:在建立索引時會用到分詞器,在使用字符串搜索時也會用到分詞器,這兩個地方要使用同一個分詞器,不然可能會搜索不出結果。因此當改變分詞器的時候,須要從新創建索引庫java
中文的分詞比較複雜,由於不是一個字就是一個詞,並且一個詞在另一個地方就可能不是一個詞,如在「帽子和服裝」中,「和服」就不是一個詞。對於中文分詞,一般有三種方式:單字分詞、二分法分詞、詞典分詞git
就是按照中文一個字一個字地進行分詞,效率比較低。如:「咱們是中國人」,效果:「我」、「們」、「是」、「中」、「國」、「人」。(StandardAnalyzer就是這樣)github
Analyzer analyzer2 = new StandardAnalyzer();算法
按兩個字進行切分,把相鄰的兩個字組成詞分解出來,效率也比較低。並且不少狀況下分的詞不對。如:「咱們是中國人」,效果:「咱們」、「們是」、「是中」、「中國」、「國人」。(CJKAnalyzer就是這樣)apache
Analyzer analyzer3 = new CJKAnalyzer(Version.LUCENE_30);maven
按某種算法構造詞,而後去匹配已建好的詞庫集合,若是匹配到就切分出來成爲詞語。一般詞庫分詞被認爲是最理想的中文分詞算法。如:「咱們是中國人」,效果爲:「咱們」、「中國人」。(使用極易分詞的MMAnalyzer。可使用「極易分詞」,或者是「庖丁分詞」分詞器、IKAnalyzer)。測試
Analyzer analyzer4 = new IKAnalyzer();spa
基本上能夠把詞分出來(常常用的分詞器)code
<!-- IK分詞器--> <dependency> <groupId>com.github.magese</groupId> <artifactId>ik-analyzer</artifactId> <version>7.4.0</version> </dependency>
停用詞和擴展詞以及配置文件
ext_stopword.dic爲停用詞的詞庫,詞庫裏的詞都被看成爲停用詞使用。
ext_dict.dic 爲擴用詞的詞庫,詞庫裏的詞都被看成爲擴用詞使用。
停用詞:有些詞在文本中出現的頻率很是高。但對本文的語義產生不了多大的影響。例如英文的a、an、the、of等。或中文的」的、了、呢等」。這樣的詞稱爲停用詞。停用詞常常被過濾掉,不會被進行索引。在檢索的過程當中,若是用戶的查詢詞中含有停用詞,系統會自動過濾掉。停用詞能夠加快索引的速度,減小索引庫文件的大小。
擴展詞:就是不想讓哪些詞被分開,讓他們分紅一個詞。好比傳智播客、傳智
IKAnalyzer.cfg.xml爲IKAnalyzer的配置文件。
<?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>
添加測試類
代碼以下:
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