hadoop小學生
圣騎士
圣騎士
  • 注冊日期2018-09-13
  • 發帖數145
  • QQ3234520070
  • 火幣330枚
  • 粉絲0
  • 關注0
閱讀:684回復:0

elasticsearch教程--中文分詞器作用和使用

樓主#
更多 發布于:2019-06-12 10:25
概述    

本文都是基于elasticsearch安裝教程 中的elasticsearch安裝目錄(/opt/environment/elasticsearch-6.4.0)為范例
環境準備
·全新最小化安裝的centos 7.5
·elasticsearch 6.4.0
認識中文分詞
在博文elasticsearch分詞器中提到elasticsearch能夠快速的通過搜索詞檢索出對應的文章歸功于倒排索引,下面通過中文舉例看看倒排索引。
中文分詞器作用以及效果
中文分詞器是做什么的呢? what? 通過名字就知道了啊,為什么還要問。。。下面通過三個文檔示例,看看它是如何分詞的
文檔1: 我愛偉大的祖國
文檔2: 祝福祖國強大繁
文檔3: 我愛藍天白云
經過中文分詞器,以上文檔均會根據分詞規則,將文檔進行分詞后的結果如下:
注意:不同的分詞規則,分詞結果不一樣,選擇根據分詞器提供的分詞規則找到適合的分詞規則
文檔1分詞結果: [我,愛,偉大,的,祖國]
文檔2分詞結果: [祝福,祖國,強大,繁盛]
文檔3分詞結果: [我,愛,藍天白云,藍天,白云]
通過上面的分詞結果,發現拆分的每個詞都是我們熟知的詞語, 但是如果不使用中文分詞,就會發現上面的文檔把每個字拆分成了一個詞,對我們中文檢索很不友好。
再看倒排索引
看到上面中文分詞器結果,就會有新的疑問,使用中文分詞器那樣分詞效果有什么好處呢? 答案就是根據分詞建立詞匯與文檔關系的倒排索引。這步都是es幫我們做的,下面通過"我","愛","祖國"三個詞看看倒排索引,如下圖:

圖片:圖1.jpg


通過上圖中的倒排索引,我們搜索"祖國"時,es通過倒排索引可以快速的檢索出文檔1和文檔3。如果沒有中文分詞器,搜索"祖國"就會被拆分"祖""國"兩個詞的倒排索引, 就會把包含"祖"的文檔都檢索出來,很明顯就會和我們想要的結果大相徑庭。
常用的中文分詞器
Smart Chinese Analysis: 官方提供的中文分詞器,
IKAnalyzer: 免費開源的java分詞器,目前比較流行的中文分詞器之一,簡單,穩定,想要特別好的效果,需要自行維護詞庫,支持自定義詞典
結巴分詞: 開源的python分詞器,github有對應的java版本,有自行識別新詞的功能,支持自定義詞典
Ansj中文分詞: 基于n-Gram+CRF+HMM的中文分詞的java實現,免費開源,支持應用自然語言處理
hanlp: 免費開源,國人自然處理語言牛人無私風險的
個人對以上分詞器進行了一個粗略對比,如下圖:

圖片:圖2.jpg




截止到目前為止,他們的分詞準確性從高到低依次是:
hanlp> ansj >結巴>IK>Smart Chinese Analysis
結合準確性來看,選用中文分詞器基于以下考慮:
官方的Smart Chinese Analysis直接可以不考慮了
對搜索要求不高的建議選用 IK 學習成本低,使用教程多,還支持遠程詞典
對新詞識別要求高的選用結巴分詞
Ansj和hanlp均基于自然處理語言,分詞準確度高,活躍度來講hanlp略勝一籌
博主選用的hanlp分詞器,目前線上運行結果來看準確性滿足需求
下面就寫一下博主對IKAnalyzer 和 hanlp分詞器的使用
IK Analyzer
截止目前,IK分詞器插件的優勢是支持自定義熱更新遠程詞典。
安裝ik分詞器插件
es插件安裝教程參考這里
ik的es插件地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
博主使用的es版本是6.4.0,下載時要注意對應es版本
在線安裝ik es插件 命令:
# /opt/apps/elasticsearch-6.4.0/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.0/elasticsearch-analysis-ik-6.4.0.zip
查看插件安裝列表
# sudo /opt/apps/elasticsearch-6.4.0/bin/elasticsearch-plugin list
IK配置
ik安裝完畢后配置文件在 {ES_HOME}/config目錄下, 本例目錄是 /opt/apps/elasticsearch-6.4.0/config/analysis-ik/IKAnalyzer.cfg.xml

圖片:圖3.png


IK自定義詞典維護
文本詞典
ik文本詞典均是以dic結尾,換行符作為分隔,示例如下:

圖片:圖4.png


重啟es,注意一定要重啟es
通過前面教程中,我們發現短語"我愛祖國",會被分詞為, "我","愛","祖國"三個詞, 如果按照上面詞典定義后, "我愛祖國"會被當成一個詞語不被分詞。
熱更新遠程詞典
   熱更新遠程詞典的優勢是,修改詞典后無需重啟es。每分鐘加載一次
修改IK配置文件如下:

圖片:圖5.png


其中 location 是指一個 url,比如 http://yoursite.com/getCustomDict,該請求只需滿足以下兩點即可完成分詞熱更新。
http 請求需要返回兩個頭部(header),一個是 Last-Modified,一個是 ETag,這兩者都是字符串類型,只要有一個發生變化,該插件就會去抓取新的分詞進而更新詞庫。
http 請求返回的內容格式是一行一個分詞,換行符用 \n 即可。
滿足上面兩點要求就可以實現熱更新分詞了,不需要重啟 ES 實例。
可以將需自動更新的熱詞放在一個 UTF-8 編碼的 .txt 文件里,放在 nginx 或其他簡易 http server 下,當 .txt 文件修改時,http server 會在客戶端請求該文件時自動返回相應的 Last-Modified 和 ETag。可以另外做一個工具來從業務系統提取相關詞匯,并更新這個 .txt 文件。
本文將遠程詞典存入數據庫,示例如下:

圖片:圖6.png


hanlp 中文分詞器
   截止目前,hanlp詞庫是最大,分詞效果是最好。使用hanlp分詞插件之前,建議先點擊此處學習一下hanlp
安裝hanlp中文分詞器插件
   hanlp的elasticsearch插件眾多,這里選用了這個,這個插件支持的分詞模式要多一些,截止現在此插件最新支持6.3.2,由于插件中包含很大的詞典文件,建議此插件采用離線安裝

圖片:圖7.png


查看插件安裝列表

圖片:圖8.png


注意: 這里有一個hanlp的警告,es版本是6.4.0, 但是插件允許的es版本是6.3.2
上面的警告需要修改一下插件配置, 本方法僅限于博主對應的版本喲,其他版本沒去試驗
# sudo vim /opt/apps/elasticsearch-6.4.0/plugins/analysis-hanlp/plugin-descriptor.properties
elasticsearch.version=6.3.2 修改為 elasticsearch.version=6.4.0,再次查看插件列表

圖片:圖9.jpg


ok,安裝成功,安裝完畢后必須重啟es喲必須重啟es喲必須重啟es喲
hanlp配置

圖片:圖10.png


hanlp自定義詞典
hanlp語料庫詞典
   hanlp語料庫地址為: https://github.com/hankcs/HanLP/releases, 本文截止目前最新版本為1.6.8
下載數據包 hanlp.linrunsoft.com/release/data-for-1.6.8.zip
解壓到配置文件中key為root的值對應目錄下
根據詞典名調整hanlp配置中的詞典配置,尤其注意CustomDictionaryPath的配置,以前采用的應用名,現在采用的中文名稱
刪除二進制緩存文件 rm -r /opt/apps/elasticsearch-6.4.0/plugins/analysis-hanlp/data/dictionary/custom/CustomDictionary.txt.bin, 如果自定義詞典變更了,一點要執行這一步,否則詞典不生效
一定要重啟es!!!一定要重啟es!!!一定要重啟es!!!
hanlp自定義熱更新詞典
在配置文件中key為root的值對應目錄下找到目錄custom,進入此目錄
創建一個txt文件,示例: myDic.txt
myDic.txt文件中添加詞,分隔符為換行符, 詞典格式為: [單詞] [詞性A] [A的頻次]  ,如圖:  

圖片:圖11.jpg


刪除二進制緩存文件 rm -r /opt/apps/elasticsearch-6.4.0/plugins/analysis-hanlp/data/dictionary/custom/CustomDictionary.txt.bin, 如果自定義詞典變更了,一點要執行這一步,否則詞典不生效
一定要重啟es!!!一定要重啟es!!!一定要重啟es!!

喜歡0 評分0
DKHadoop用著還不錯!
游客

返回頂部
广东体彩26选5