lucene分詞(一)

詞匯單元流

lucene的分詞過程,是從Reader中獲取原始字符流,產(chǎn)生語匯單元流TokenStream的過程。當(dāng)分析器獲取tokenStream對象以后,它就開始用一個tokenizer對象創(chuàng)建初始語匯單元序列,然后再鏈接任意數(shù)量的tokenFilter對象來修改原始語匯單元。整個分析過程稱為分析器鏈(analyzer chain)。如下圖具有2個tokenFilter的分析器鏈:


分析鏈

TokenStream

分詞后產(chǎn)生語匯單元流,流中存儲了分詞的各種信息,可通過TokenStream有效獲取分詞單元。

Tokenizer

負(fù)責(zé)接收Reader對象的字符,創(chuàng)建原始語匯單元——分詞。

TokenFilter

負(fù)責(zé)處理輸入的語匯單元,通過新增、刪除或修改屬性的方式產(chǎn)生新的語匯單元。

詞匯單元基本術(shù)語

語匯單元

分詞過程中產(chǎn)生的基本單元,攜帶文本值(單詞本身)和一些元數(shù)據(jù):文本值偏移量、位置增量、詞匯單元類型。語匯單元可以選擇性包含一些由程序定義的標(biāo)志位和任意字節(jié)數(shù)的有效負(fù)載,這樣程序就能根據(jù)具體需要來處理這些詞匯單元。

偏移量

偏移量包括起點偏移量和終點偏移量;起點偏移量指詞匯單元文本起始字符在原始文本中的位置,終點偏移量指詞匯單元文本終止字符的下一個位置。

位置增量

位置增量將當(dāng)前詞匯單元和前一個詞匯單元在位置上關(guān)聯(lián)起來。位置增量會影響短語查詢和跨度查詢,這些查詢都需要用到位置信息。

  1. posIncr = 1, 表示當(dāng)前詞匯單元和前一詞匯單元連續(xù),如果所有詞匯單元的posIncr都是1,則流中各個文本值存在于唯一確定且連續(xù)的位置上。
  2. posIncr > 1, 表示當(dāng)前詞匯單元和前一詞匯單元之間有空隙,可能是移除停用詞后產(chǎn)生
  3. posIncr = 0, 表示當(dāng)前詞匯單元和前一詞匯單元處在相同的位置上。詞匯單元在同一位置可用于表示某種關(guān)系,例如同義詞關(guān)系。

詞匯單元類型

用String對象表示詞匯單元類型,默認(rèn)值是“word”,如果需要可以在詞匯單元過濾過程中控制和利用類型屬性。

有效負(fù)載

每個詞匯單元可以有多個選擇標(biāo)志;lucene內(nèi)置分詞器不會使用這些標(biāo)志,但你自己設(shè)計的程序可以使用它們。此外,每個詞匯單元都能以byte[]數(shù)組形式記錄在索引中,用以指向有效負(fù)載。

下面是使用StandardAnalyzer分詞的一個具體例子,原始文本內(nèi)容為text:

text = "Bad times make a good man"

分詞結(jié)果如下圖:

分詞實例

位置增量部分,make和good之間的位置增量是2,是因為原句子中的"a"被作為停用詞刪除掉了。

參考

Lucene實戰(zhàn)(第2版)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容