佛山新網(wǎng)站制作怎么樣抖音優(yōu)化是什么意思
概述
分詞器的主要作用將用戶輸入的一段文本,按照一定邏輯,分析成多個(gè)詞語的一種工具
什么是分詞器
顧名思義,文本分析就是把全文本轉(zhuǎn)換成一系列單詞(term/token)的過程,也叫分詞。在 ES 中,Analysis
是通過分詞器(Analyzer) 來實(shí)現(xiàn)的,可使用 ES 內(nèi)置的分析器或者按需定制化分析器。
舉一個(gè)分詞簡單的例子:比如你輸入 Mastering Elasticsearch,會(huì)自動(dòng)幫你分成兩個(gè)單詞,一個(gè)是 mastering,另一個(gè)是 elasticsearch,可以看出單詞也被轉(zhuǎn)化成了小寫的。
分詞器的構(gòu)成
分詞器是專門處理分詞的組件,分詞器由以下三部分組成:
character filter
接收原字符流,通過添加、刪除或者替換操作改變原字符流
例如:去除文本中的html標(biāo)簽,或者將羅馬數(shù)字轉(zhuǎn)換成阿拉伯?dāng)?shù)字等。一個(gè)字符過濾器可以有零個(gè)或者多個(gè)
tokenizer
簡單的說就是將一整段文本拆分成一個(gè)個(gè)的詞。
例如拆分英文,通過空格能將句子拆分成一個(gè)個(gè)的詞,但是對于中文來說,無法使用這種方式來實(shí)現(xiàn)。在一個(gè)分詞器中,有且只有一個(gè)tokenizeer
token filters
將切分的單詞添加、刪除或者改變
例如將所有英文單詞小寫,或者將英文中的停詞a刪除等,在token filters中,不允許將token(分出的詞)的position或者offset改變。同時(shí),在一個(gè)分詞器中,可以有零個(gè)或者多個(gè)token filters.
分詞順序
同時(shí) Analyzer 三個(gè)部分也是有順序的,從圖中可以看出,從上到下依次經(jīng)過 Character Filters,Tokenizer 以及 Token Filters,這個(gè)順序比較好理解,一個(gè)文本進(jìn)來肯定要先對文本數(shù)據(jù)進(jìn)行處理,再去分詞,最后對分詞的結(jié)果進(jìn)行過濾。
索引和搜索分詞
文本分詞會(huì)發(fā)生在兩個(gè)地方:
- 創(chuàng)建索引:當(dāng)索引文檔字符類型為text時(shí),在建立索引時(shí)將會(huì)對該字段進(jìn)行分詞。
- 搜索:當(dāng)對一個(gè)text類型的字段進(jìn)行全文檢索時(shí),會(huì)對用戶輸入的文本進(jìn)行分詞。
配置分詞器
默認(rèn)ES使用standard analyzer,如果默認(rèn)的分詞器無法符合你的要求,可以自己配置
分詞器測試
可以通過_analyzerAPI來測試分詞的效果。
COPY# 過濾html 標(biāo)簽
POST _analyze
{"tokenizer":"keyword", #原樣輸出"char_filter":["html_strip"], # 過濾html標(biāo)簽"text":"<b>hello world<b>" # 輸入的文本
}
指定分詞器
使用地方
分詞器的使用地方有兩個(gè):
- 創(chuàng)建索引時(shí)
- 進(jìn)行搜索時(shí)
創(chuàng)建索引時(shí)指定分詞器
如果手動(dòng)設(shè)置了分詞器,ES將按照下面順序來確定使用哪個(gè)分詞器:
- 先判斷字段是否有設(shè)置分詞器,如果有,則使用字段屬性上的分詞器設(shè)置
- 如果設(shè)置了analysis.analyzer.default,則使用該設(shè)置的分詞器
- 如果上面兩個(gè)都未設(shè)置,則使用默認(rèn)的standard分詞器
字段指定分詞器
為title屬性指定分詞器
PUT my_index
{"mappings": {"properties": {"title":{"type":"text","analyzer": "whitespace"}}}
}
指定默認(rèn)default_seach
COPYPUT my_index
{"settings": {"analysis": {"analyzer": {"default":{"type":"simple"},"default_seach":{"type":"whitespace"}}}}
}
內(nèi)置分詞器
es在索引文檔時(shí),會(huì)通過各種類型 Analyzer 對text類型字段做分析,
不同的 Analyzer 會(huì)有不同的分詞結(jié)果,內(nèi)置的分詞器有以下幾種,基本上內(nèi)置的 Analyzer 包括 Language Analyzers 在內(nèi),對中文的分詞都不夠友好,中文分詞需要安裝其它 Analyzer
分析器 | 描述 | 分詞對象 | 結(jié)果 |
---|---|---|---|
standard | 標(biāo)準(zhǔn)分析器是默認(rèn)的分析器,如果沒有指定,則使用該分析器。它提供了基于文法的標(biāo)記化(基于 Unicode 文本分割算法,如 Unicode 標(biāo)準(zhǔn)附件 # 29所規(guī)定) ,并且對大多數(shù)語言都有效。 | The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. | [ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog’s, bone ] |
simple | 簡單分析器將文本分解為任何非字母字符的標(biāo)記,如數(shù)字、空格、連字符和撇號、放棄非字母字符,并將大寫字母更改為小寫字母。 | The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. | [ the, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ] |
whitespace | 空格分析器在遇到空白字符時(shí)將文本分解為術(shù)語 | The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. | [ The, 2, QUICK, Brown-Foxes, jumped, over, the, lazy, dog’s, bone. ] |
stop | 停止分析器與簡單分析器相同,但增加了刪除停止字的支持。默認(rèn)使用的是 english 停止詞。 | The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. | [ quick, brown, foxes, jumped, over, lazy, dog, s, bone ] |
keyword | 不分詞,把整個(gè)字段當(dāng)做一個(gè)整體返回 | The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. | [The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone.] |
pattern | 模式分析器使用正則表達(dá)式將文本拆分為術(shù)語。正則表達(dá)式應(yīng)該匹配令牌分隔符,而不是令牌本身。正則表達(dá)式默認(rèn)為 w+ (或所有非單詞字符)。 | The 2 QUICK Brown-Foxes jumped over the lazy dog’s bone. | [ the, 2, quick, brown, foxes, jumped, over, the, lazy, dog, s, bone ] |
多種西語系 arabic, armenian, basque, bengali, brazilian, bulgarian, catalan, cjk, czech, danish, dutch, english等等 | 一組旨在分析特定語言文本的分析程序。 |
分詞器 _analyze 的使用
#standard
GET _analyze
{"analyzer": "standard","text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}#simpe
GET _analyze
{"analyzer": "simple","text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}GET _analyze
{"analyzer": "stop","text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}#stop
GET _analyze
{"analyzer": "whitespace","text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}#keyword
GET _analyze
{"analyzer": "keyword","text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}GET _analyze
{"analyzer": "pattern","text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}#english
GET _analyze
{"analyzer": "english","text": "2 running Quick brown-foxes leap over lazy dogs in the summer evening."
}POST _analyze
{"analyzer": "icu_analyzer","text": "他說的確實(shí)在理”"
}POST _analyze
{"analyzer": "standard","text": "他說的確實(shí)在理”"
}POST _analyze
{"analyzer": "icu_analyzer","text": "這個(gè)蘋果不大好吃"
}
可以看出是按照空格、非字母的方式對輸入的文本進(jìn)行了轉(zhuǎn)換,比如對 Java 做了轉(zhuǎn)小寫,對一些停用詞也沒有去掉,比如 in,其中 token 為分詞結(jié)果;start_offset 為起始偏移;end_offset 為結(jié)束偏移;position 為分詞位置。
使用分析器進(jìn)行分詞
課程Demo
#Simple Analyzer – 按照非字母切分(符號被過濾),小寫處理
#Stop Analyzer – 小寫處理,停用詞過濾(the,a,is)
#Whitespace Analyzer – 按照空格切分,不轉(zhuǎn)小寫
#Keyword Analyzer – 不分詞,直接將輸入當(dāng)作輸出
#Patter Analyzer – 正則表達(dá)式,默認(rèn) \W+ (非字符分隔)
#Language – 提供了30多種常見語言的分詞器
#2 running Quick brown-foxes leap over lazy dogs in the summer evening
其他常用分詞器
電子郵件分詞器(UAX URL Email Tokenizer)
此分詞器主要是針對email和url地址進(jìn)行關(guān)鍵內(nèi)容的標(biāo)記。
GET _analyze
{"text":"Email me at john.smith@global-international.com","tokenizer": "uax_url_email"
}
經(jīng)典分詞器(Classic Tokenizer)
可對首字母縮寫詞,公司名稱,電子郵件地址和互聯(lián)網(wǎng)主機(jī)名進(jìn)行特殊處理,但是,這些規(guī)則并不總是有效,并且此關(guān)鍵詞生成器不適用于英語以外的大多數(shù)其他語言
特點(diǎn)
- 它最多將標(biāo)點(diǎn)符號拆分為單詞,刪除標(biāo)點(diǎn)符號,但是,不帶空格的點(diǎn)被認(rèn)為是查詢關(guān)鍵詞的一部分
- 此分詞器可以將郵件地址和URL地址識別為查詢的term(詞條)
GET _analyze
{"text":"The 2 QUICK Brown-Foxes jumped over the lazy dog's bone.","analyzer": "classic"
}
路徑分詞器(Path Tokenizer)
可以對文件系統(tǒng)的路徑樣式的請求進(jìn)行拆分,返回被拆分各個(gè)層級內(nèi)容。
GET _analyze
{"text":"/one/two/three","tokenizer":"path_hierarchy"
}
自定義分詞器
當(dāng)內(nèi)置的分詞器無法滿足需求時(shí),可以創(chuàng)建custom類型的分詞器。
配置參數(shù)
參數(shù) | 描述 |
---|---|
tokenizer | 內(nèi)置或定制的tokenizer.(必須) |
char_filter | 內(nèi)置或定制的char_filter(非必須) |
filter | 內(nèi)置或定制的token filter(非必須) |
position_increment_gap | 當(dāng)值為文本數(shù)組時(shí),設(shè)置改值會(huì)在文本的中間插入假空隙。設(shè)置該屬性,對與后面的查詢會(huì)有影響。默認(rèn)該值為100. |
- 創(chuàng)建索引
上面的示例中定義了一個(gè)名為my_custom_analyzer的分詞器
該分詞器的type為custom,tokenizer為standard,char_filter為hmtl_strip,filter定義了兩個(gè)分別為:lowercase和asciifolding
PUT my_index
{"settings": {"analysis": {"analyzer": {"my_custom_analyzer":{"type":"custom","tokenizer":"standard","char_filter":["html_strip"],"filter":["lowercase","asciifolding"]}}}}
}
- 測試使用自定義分詞
POST my_index/_analyze
{"text": "Is this <b>déjà vu</b>?","analyzer": "my_custom_analyzer"
}
中文分詞器
IKAnalyzer
IKAnalyzer是一個(gè)開源的,基于java的語言開發(fā)的輕量級的中文分詞工具包
從2006年12月推出1.0版開始,IKAnalyzer已經(jīng)推出了3個(gè)大版本,在 2012 版本中,IK 實(shí)現(xiàn)了簡單的分詞歧義排除算法,標(biāo)志著 IK 分詞器從單純的詞典分詞向模擬語義分詞衍化
使用IK分詞器
IK提供了兩個(gè)分詞算法:
- ik_smart:最少切分。
- ik_max_word:最細(xì)粒度劃分。
ik_smart 分詞算法
使用案例
原始內(nèi)容
GET _analyze
{"analyzer": "ik_smart","text": "傳智教育的教學(xué)質(zhì)量是杠杠的"
}
ik_max_word 分詞算法
GET _analyze
{"analyzer": "ik_max_word","text": "傳智教育的教學(xué)質(zhì)量是杠杠的"
}
自定義詞庫
我們在使用IK分詞器時(shí)會(huì)發(fā)現(xiàn)其實(shí)有時(shí)候分詞的效果也并不是我們所期待的
問題描述
例如我們輸入“傳智教育的教學(xué)質(zhì)量是杠杠的”,但是分詞器會(huì)把“傳智教育”進(jìn)行拆開,分為了“傳”,“智”,“教育”,但我們希望的是“傳智教育”可以不被拆開。
解決方案
對于以上的問題,我們只需要將自己要保留的詞,加到我們的分詞器的字典中即可
編輯字典內(nèi)容
進(jìn)入elasticsearch目錄plugins/ik/config中,創(chuàng)建我們自己的字典文件yixin.dic,并添加內(nèi)容:
cd plugins/ik/config
echo "傳智教育" > custom.dic
擴(kuò)展字典
進(jìn)入我們的elasticsearch目錄 :plugins/ik/config,打開IKAnalyzer.cfg.xml文件,進(jìn)行如下配置:
vi IKAnalyzer.cfg.xml
#增加如下內(nèi)容
<entry key="ext_dict">custom.dic</entry>
再次測試
重啟ElasticSearch,再次使用kibana測試
GET _analyze
{"analyzer": "ik_max_word","text": "傳智教育的教學(xué)質(zhì)量是杠杠的"
}
可以發(fā)現(xiàn),現(xiàn)在我們的詞匯”傳智教育”就不會(huì)被拆開了,達(dá)到我們想要的效果了
分詞的可配置項(xiàng)
standard 分詞器可配置項(xiàng)
選項(xiàng) | 描述 |
---|---|
max_token_length | 最大令牌長度。如果看到令牌超過此長度,則將其max_token_length間隔分割。默認(rèn)為255。 |
stopwords | 預(yù)定義的停用詞列表,例如english或包含停用詞列表的數(shù)組。默認(rèn)為none。 |
stopwords_path | 包含停用詞的文件的路徑。 |
COPY{"settings": {"analysis": {"analyzer": {"my_english_analyzer": {"type": "standard","max_token_length": 5,"stopwords": "_english_"}}}}
}
正則分詞器(Pattern Tokenizer) 可配置選項(xiàng)
可配置項(xiàng)
正則分詞器有以下的選項(xiàng)
選項(xiàng) | 描述 |
---|
|pattern |正則表達(dá)式|
|flags |正則表達(dá)式標(biāo)識|
|lowercase| 是否使用小寫詞匯|
|stopwords |停止詞的列表。|
|stopwords_path |定義停止詞文件的路徑。|
COPY{"settings": {"analysis": {"analyzer": {"my_email_analyzer": {"type": "pattern","pattern": "\\W|_","lowercase": true}}}}
}
路徑分詞器(Path Tokenizer)可配置選項(xiàng)
選項(xiàng) | 描述 |
---|---|
delimiter | 用作路徑分隔符的字符 |
replacement | 用于定界符的可選替換字符 |
buffer_size | 單次讀取到術(shù)語緩沖區(qū)中的字符數(shù)。默認(rèn)為1024。術(shù)語緩沖區(qū)將以該大小增長,直到所有文本都被消耗完為止。建議不要更改此設(shè)置。 |
reverse | 正向還是反向獲取關(guān)鍵詞 |
skip | 要忽略的內(nèi)容 |
COPY{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "my_tokenizer"}},"tokenizer": {"my_tokenizer": {"type": "path_hierarchy","delimiter": "-","replacement": "/","skip": 2}}}}
}
語言分詞(Language Analyzer)
ES 為不同國家語言的輸入提供了 Language Analyzer 分詞器,在里面可以指定不同的語言