功能簡介
在全文搜索引擎如OpenSearch和Elasticsearch中,分詞器是其核心功能。分詞器負責將輸入的字符流分割成獨立的詞元,這些詞元是后續搜索和索引操作的基礎。通過分詞,連續的文本被轉換為一系列便于計算機處理的單元,從而實現全文搜索。
OpenSearch和Elasticsearch提供了一些默認的分詞器,但是只支持英文分詞,對中文分詞不友好。
OpenSearch和Elasticsearch有相關的開源中文分詞插件,如IK分詞器和HanLP分詞器。然而開源版本的中文分詞器在處理中文文本時仍然會出現一些歧義問題或未登錄詞匯的情況,因此天翼云云搜索服務對中文分詞進行了增強。
天翼云云搜索服務中的OpenSearch和Elasticsearch對HanLP分詞器進行中文分詞增強,這是對其文本處理和搜索能力的一項重要增強。通過增強中文分詞能力,搜索引擎能夠在處理中文文本時更加精準地分詞,從而提升搜索結果的準確性和用戶體驗。
核心原理
在OpenSearch和Elasticsearch中,中文分詞器負責將輸入的中文文本(如文檔內容)分割成獨立的詞元,處理后的詞元被存儲在Elasticsearch的倒排索引中,以便后續的搜索操作能夠快速檢索到相關文檔。搜索階段,用戶輸入的查詢字符串同樣需要經過分詞器的處理,分詞器將查詢字符串分割成詞元,這些詞元將用于在倒排索引中查找匹配的文檔。搜索過程可能會涉及多個詞元的組合查詢,搜索引擎會根據查詢語句的語法和邏輯,執行相應的搜索算法來找到匹配的文檔。中文分詞器的選擇和配置對搜索效果和性能具有重要影響。用戶需要根據文本的語言、特點和需求,選擇合適的分詞器。
天翼云云搜索服務提供的中文分詞器
IK分詞器
天翼云云搜索服務中的IK分詞器是開源分詞器,包括最大化分詞模式(ik_max_word)、最小化分詞模式(ik_smart)。允許自定義詞典,支持定制化的分詞處理,適應特定場景和行業的需求。
IK插件包含2種分詞器:ik_smart和 ik_max_word。
- ik_smart模式:智能分詞模式,采用較為靈活的中文分詞算法,能夠對中文文本進行智能的切分,以保留盡可能多的語義信息。適用于一般的全文搜索、文本分析和檢索需求。
- ik_max_word模式:最大化分詞模式,會盡可能多地將文本切分成單個詞語,從而獲取盡可能多的候選詞。適用于對文本進行細粒度的分析和處理。
HanLP分詞器
HanLP分詞器是源于一個開源且功能強大的HanLP自然語言處理工具包,它由一系列模型和算法組成。目前天翼云云搜索服務中的HanLP分詞器是基于開源HanLP分詞器對hanlp、hanlp_crf等分詞器進行了一定程度的優化,以適應不同的場景。
目前HanLP插件提供hanlp、hanlp_crf、hanlp_nlp、hanlp_speed等分詞器,針對不同的應用場景,可以選擇使用不同的分詞器。
- hanlp分詞器,基于詞典的分詞。當需要快速處理大量文本,且對分詞精度要求不是特別高時,詞典分詞是一個很好的選擇。它側重于分詞速度,能夠每秒處理數千萬字符,非常適合對實時性要求較高的場景;在內存資源有限的環境下,詞典分詞由于其較低的內存占用,也是一個理想的選擇。另外hanlp分詞器經過優化分詞效果也比較不錯,適合通用的場景,平衡了分詞精度和分詞速度。
- hanlp_crf和hanlp_nlp分詞器,基于模型的分詞器。hanlp_crf和hanlp_nlp分詞器在處理復雜文本結構時表現出色,能夠準確識別并處理句子中的長距離依賴關系。由于其較強的泛化能力,在處理特定領域的文本時(如新聞、法律、醫療等),能夠提供更全面、準確的文本分析結果。適用于對分詞準確程度要求很高,不追求分詞速度的場景下,且比較消耗內存資源。
- hanlp_speed,極速詞典分詞。在需要極快速度處理文本的場景下,極速詞典分詞是最佳選擇,它通過優化詞典結構和算法實現了超高的分詞速度。在內存資源非常有限的環境下,極速詞典分詞由于其低內存占用特性而更具優勢。適合追求分詞速度,而對精度要求不是很高的情況下。
- hanlp_n_short和hanlp_dijkstra:構建詞圖并尋找最短路徑的方式來實現分詞,能夠較好地識別并處理新詞和未登錄詞。對于包含大量新詞、縮寫、專業術語等復雜文本,能夠提供更準確的分詞結果,效率不如詞典分詞,優于算法分詞。
- hanlp_index和 ik_max_word類似:會盡可能多地將文本切分成單個詞語,從而獲取盡可能多的候選詞。適用于對文本進行細粒度的分析和處理。
中文分詞增強的優勢
相比開源中文分詞器,優化后的部分中文分詞器在搜索結果上更具有優勢。另外,天翼云云搜索服務中文分詞增強模塊內置了多種中文分詞器,可以適應不同的場景,用戶可以添加自定義詞庫來提高未登陸詞的分詞精度。
使用示例:
測試分詞器分詞效果:
GET _analyze
{
"text": "美國阿拉斯加州發生8.0級地震",
"analyzer": "hanlp"
}
返回結果:
{
"tokens": [{
"token": "美國",
"start_offset": 0,
"end_offset": 2,
"type": "nsf",
"position": 0
}, {
"token": "阿拉斯加州",
"start_offset": 2,
"end_offset": 7,
"type": "nsf",
"position": 1
}, {
"token": "發生",
"start_offset": 7,
"end_offset": 9,
"type": "v",
"position": 2
}, {
"token": "8.0",
"start_offset": 9,
"end_offset": 12,
"type": "m",
"position": 3
}, {
"token": "級",
"start_offset": 12,
"end_offset": 13,
"type": "q",
"position": 4
}, {
"token": "地震",
"start_offset": 13,
"end_offset": 15,
"type": "n",
"position": 5
}]
}
使用其他分詞器可以在analyzer字段指定。
創建mappings的時候可以在字段中指定分詞器:
PUT demo
{
"mappings": {
"properties": {
"field1": {
"type": "text",
"analyzer": "hanlp"
}
}
}
}
返回結果:
{
"acknowledged": true,
"shards_acknowledged": true,
"index": "demo"
}