IK分词器实战
ES中分詞器Analyzer的組成
分詞器是專門處理分詞的組件,由三部分組成。
- Character filter:針對原始文本處理,例如去除html
- Tokenizer:按照規則切分為單詞
- Token Filter:將切分的單詞進行加工,小寫,刪除stopwords,增加同義詞
以上三部分是串行處理的關系,除Tokenizer只能一個外,其他兩個都可以多個。IK分詞器僅實現了Tokenizer
IK分詞器原理
IK分詞器在是一款基于詞典和規則的中文分詞器。具有以下特性:
IK內部有3個子分詞器(Segmenter),CJKSegmenter(中日韓文分詞器),CN_QuantifierSegmenter(中文數量詞分詞器),LetterSegmenter(英文分詞器)。
LetterSegmenter:從遇到第一個英文字符往后,直到碰到第一個非英文字符,這中間的所有字符則切分為一個英文單詞。
CN_QuantifierSegmenter:從遇到每一個中文數量詞,然后檢查該數量詞后一個字符是否為中文量詞(根據是否包含在中文量詞詞典中為判斷依據),如是,則分成一個詞,如否,則不是一個詞。
CJKSegmenter:處理邏輯較為復雜,整體思路是從字典樹中尋找匹配的詞
分詞裁決器IKArbitrator:只有在Smart模式才會生效,僅根據幾條可能是最佳的分詞實踐規則,并沒有用到任何概率模型,也不具有新詞發現的功能。
兩種分詞模式
智能模式
對應es的IK插件的ik_smart,會做最粗粒度的拆分。比如會將“中華人民共和國國歌”拆分為“中華人民共和國,國歌”,適合 Phrase 查詢。
細粒度模式
對用es的插件ik_max_word: 會將文本做最細粒度的拆分,比如會將“中華人民共和國國歌”拆分為“中華人民共和國,中華人民,中華,華人,華,人民共和國,人民,人,民,共和國,共和,和,國國,國歌”,會窮盡各種可能的組合,適合 Term Query。
IK分詞實踐
IK分詞的效果主要取決于詞庫,目前自帶主詞典擁有27萬左右的漢語單詞量。對于應用領域的不同,需要各類專業詞庫的支持。
分詞規律
es檢索的核心數據結構為倒排索引,分詞是否合理正確,直接影響數據的檢索結果,在自定義詞典及分詞器時,可以采取以下方式來驗證分詞的結果:
GET /_analyze {"analyzer": "ik_max_word","text": ["甲三"] }ik_max_word
例如:在北–>在,北
例如:甲乙–>甲乙
聯通–>聯通,聯,通
例如:甲乙丙丁–>甲乙丙丁,甲乙,丙丁
中國聯通–>中國聯通,中國,國聯,聯通,通(沒弄明白為啥這里聯通不拆成聯、通)
ik_smart
例如:在北–>在,北
例如:甲乙–>甲乙
甲乙丙丁–>甲乙丙丁
依據上述規律,我們可以在寫入數據時使用ik_max_word,增加分詞數量,提高被命中幾率,在查詢數據時使用ik_smart,減少分詞數量,提升結果準確率,減少無關結果
去掉分詞結果中的單個字
使用es內置的token filter:length
POST _analyze {"text": "一中華人民共和國國歌","filter": [{"type": "length","min": "2"}],"tokenizer": "ik_smart" }分詞結果中“一”被過濾掉,但對于某些查詢詞,例如“父與子”,該設置會導致無分詞結果
總結
- 上一篇: combox 增加请选择_本命佛怎么请?
- 下一篇: js 正则表达式实现文本验证