在代碼實(shí)現(xiàn)倒排索引這節(jié)中,我們的分詞方式是對(duì)文本按空格分詞贼涩。而在我們實(shí)際過(guò)程中巧涧,我們對(duì)分詞的要求是苛刻的,我們會(huì)在不同的場(chǎng)景下使用不同的分詞器∫>耄現(xiàn)在谤绳,我們先使用標(biāo)準(zhǔn)分詞器StandardAnalyzer這個(gè)工具來(lái)進(jìn)行分詞的測(cè)試占锯。
-
首先我們需要引入jar包,這是一個(gè)Lucene全文檢索引擎中自帶的分詞器.
<dependency> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> <version>4.7.2</version> </dependency>
-
簡(jiǎn)單的使用
import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.core.SimpleAnalyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.analysis.tokenattributes.OffsetAttribute; import org.apache.lucene.analysis.tokenattributes.TypeAttribute; import java.io.IOException; import java.io.StringReader; /** * created by yuyufeng on 2017/11/9. */ public class LearnAnalyzer { public static void main(String[] args) { // 構(gòu)建分詞器 Analyzer analyzer = new StandardAnalyzer(); // 獲取Lucene的TokenStream對(duì)象 TokenStream ts = null; try { ts = analyzer.tokenStream("myfield", new StringReader( "這是一個(gè)分詞的例子缩筛,我們來(lái)使用一下試試消略。 Let's use it.")); // 獲取詞元位置屬性 OffsetAttribute offset = ts.addAttribute(OffsetAttribute.class); // 獲取詞元文本屬性 CharTermAttribute term = ts.addAttribute(CharTermAttribute.class); // 獲取詞元文本屬性 TypeAttribute type = ts.addAttribute(TypeAttribute.class); // 重置TokenStream(重置StringReader) ts.reset(); // 迭代獲取分詞結(jié)果 while (ts.incrementToken()) { System.out.println(offset.startOffset() + " - " + offset.endOffset() + " : " + term.toString() + " | " + type.type()); } // 關(guān)閉TokenStream(關(guān)閉StringReader) ts.end(); // Perform end-of-stream operations, e.g. set the final offset. } catch (IOException e) { e.printStackTrace(); } finally { // 釋放TokenStream的所有資源 if (ts != null) { try { ts.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
運(yùn)行結(jié)果:
0 - 1 : 這 | <IDEOGRAPHIC>
1 - 2 : 是 | <IDEOGRAPHIC>
2 - 3 : 一 | <IDEOGRAPHIC>
3 - 4 : 個(gè) | <IDEOGRAPHIC>
4 - 5 : 分 | <IDEOGRAPHIC>
5 - 6 : 詞 | <IDEOGRAPHIC>
6 - 7 : 的 | <IDEOGRAPHIC>
7 - 8 : 例 | <IDEOGRAPHIC>
8 - 9 : 子 | <IDEOGRAPHIC>
10 - 11 : 我 | <IDEOGRAPHIC>
11 - 12 : 們 | <IDEOGRAPHIC>
12 - 13 : 來(lái) | <IDEOGRAPHIC>
13 - 14 : 使 | <IDEOGRAPHIC>
14 - 15 : 用 | <IDEOGRAPHIC>
15 - 16 : 一 | <IDEOGRAPHIC>
16 - 17 : 下 | <IDEOGRAPHIC>
17 - 18 : 試 | <IDEOGRAPHIC>
18 - 19 : 試 | <IDEOGRAPHIC>
21 - 26 : let's | <ALPHANUM>
27 - 30 : use | <ALPHANUM>
StandardAnalyzer是一個(gè)標(biāo)準(zhǔn)的分詞器,它以非字母符來(lái)分割文本信息瞎抛,并將語(yǔ)匯單元統(tǒng)一為小寫形式艺演,并去掉數(shù)字類型的字符。而我們的中文詞組的分詞顯然不同桐臊。所以胎撤,對(duì)于中文的分詞,我們常用的有IK分詞器
<dependency>
<groupId>com.janeluo</groupId>
<artifactId>ikanalyzer</artifactId>
<version>2012_u6</version>
</dependency>
上面的代碼修改分詞器的實(shí)現(xiàn):
Analyzer analyzer = new IKAnalyzer(true);
分詞結(jié)果:
0 - 2 : 這是 | CN_WORD
2 - 4 : 一個(gè) | CN_WORD
4 - 6 : 分詞 | CN_WORD
6 - 7 : 的 | CN_WORD
7 - 9 : 例子 | CN_WORD
10 - 12 : 我們 | CN_WORD
12 - 14 : 來(lái)使 | CN_WORD
14 - 17 : 用一下 | CN_WORD
17 - 19 : 試試 | CN_WORD
21 - 24 : let | ENGLISH
25 - 26 : s | ENGLISH
27 - 30 : use | ENGLISH
31 - 34 : it. | LETTER
顯然断凶,這個(gè)是中英文分詞的伤提,相比StandardAnalyzer更適合我們?nèi)粘J褂?/p>
常見(jiàn)的分詞器
名稱 | 分詞規(guī)則 | 備注 |
---|---|---|
WhitespaceAnalyzer | 以空格作為切詞標(biāo)準(zhǔn),不對(duì)語(yǔ)匯單元進(jìn)行其他規(guī)范化處理认烁。 | 適用英文 |
SimpleAnalyzer | 以非字母符來(lái)分割文本信息飘弧,并將語(yǔ)匯單元統(tǒng)一為小寫形式,并去掉數(shù)字類型的字符 | |
StopAnalyzer | 停頓詞分析器會(huì)去除一些常有a,the,an等等砚著,也可以自定義禁用詞 | |
StandardAnalyzer | 標(biāo)準(zhǔn)分析器是Lucene內(nèi)置的分析器,會(huì)將語(yǔ)匯單元轉(zhuǎn)成小寫形式,并去除停用詞及標(biāo)點(diǎn)符號(hào) | |
CJKAnalyzer | 中日韓分析器痴昧,能對(duì)中稽穆,日,韓語(yǔ)言進(jìn)行分析的分詞器 | 對(duì)中文支持效果一般 |
SmartChineseAnalyzer | 對(duì)中文支持稍好赶撰,但擴(kuò)展性差舌镶,擴(kuò)展詞庫(kù),禁用詞庫(kù)和同義詞庫(kù)等不好處理 | |
IKAnalyzer | 支持:英文字母豪娜、數(shù)字餐胀、中文詞匯等分詞處理,兼容韓文瘤载、日文字符優(yōu)化的詞典存儲(chǔ)否灾,更小的內(nèi)存占用。支持用戶詞典擴(kuò)展定義 | 常用 |
HanLP | HanLP實(shí)現(xiàn)了許多種分詞算法鸣奔,每個(gè)分詞器都支持特定的配置 | 國(guó)產(chǎn)墨技,實(shí)現(xiàn)了許多種分詞算法,支持自命名體識(shí)別等 |