常用的中文分詞器
Smart Chinese Analysis: 官方提供的中文分詞器,不好用今膊。
IKAnalyzer: 免費(fèi)開(kāi)源的java分詞器,目前比較流行的中文分詞器之一,簡(jiǎn)單,穩(wěn)定,想要特別好的效果,需要自行維護(hù)詞庫(kù),支持自定義詞典撒遣。
結(jié)巴分詞: 開(kāi)源的python分詞器,github有對(duì)應(yīng)的java版本,有自行識(shí)別新詞的功能,支持自定義詞典。
Ansj中文分詞: 基于n-Gram+CRF+HMM的中文分詞的java實(shí)現(xiàn),免費(fèi)開(kāi)源,支持應(yīng)用自然語(yǔ)言處理竟宋。
hanlp: 免費(fèi)開(kāi)源,國(guó)人自然處理語(yǔ)言牛人無(wú)私奉獻(xiàn)的凳兵。
對(duì)以上分詞器進(jìn)行了一個(gè)粗略對(duì)比:
分詞器 | 優(yōu)勢(shì) | 劣勢(shì) |
---|---|---|
Smart Chinese Analysis | 官方插件 | 中文分詞效果慘不忍睹 |
IKAnalyzer | 簡(jiǎn)單易用履腋,支持自定義詞典和遠(yuǎn)程詞典 | 詞庫(kù)需要自行維護(hù)系奉,不支持詞性識(shí)別 |
結(jié)巴分詞 | 新詞識(shí)別功能 | 不支持詞性識(shí)別 |
Ansj中文分詞 | 分詞精準(zhǔn)度不錯(cuò)檬贰,支持詞性識(shí)別 | 對(duì)標(biāo)hanlp詞庫(kù)略少,學(xué)習(xí)成本高 |
Hanlp | 目前詞庫(kù)最完善缺亮,支持的特性非常多 | 需要更優(yōu)的分詞效果翁涤,學(xué)習(xí)成本高 |
截止到目前為止,他們的分詞準(zhǔn)確性從高到低依次是:
hanlp> ansj >結(jié)巴>IK>Smart Chinese Analysis
結(jié)合準(zhǔn)確性來(lái)看,選用中文分詞器基于以下考慮:
官方的Smart Chinese Analysis直接可以不考慮了
對(duì)搜索要求不高的建議選用 IK 學(xué)習(xí)成本低,使用教程多,還支持遠(yuǎn)程詞典
對(duì)新詞識(shí)別要求高的選用結(jié)巴分詞
Ansj和hanlp均基于自然處理語(yǔ)言,分詞準(zhǔn)確度高,活躍度來(lái)講hanlp略勝一籌
IK Analyzer
截止目前,IK分詞器插件的優(yōu)勢(shì)是支持自定義熱更新遠(yuǎn)程詞典。
安裝ik分詞器插件
ik的es插件地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
環(huán)境es版本是6.4.0,下載時(shí)要注意對(duì)應(yīng)es版本
上傳到linux環(huán)境解壓
[root@elk elk]# unzip elasticsearch-analysis-ik-6.4.0.zip
去es的plugins目錄下創(chuàng)建ik文件夾
cd your-es-root/plugins/ && mkdir ik
解壓插件到ik文件夾內(nèi)
unzip plugin to folder your-es-root/plugins/ik
重啟elasticsearch
還可以在線安裝
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.0/elasticsearch-analysis-ik-6.4.0.zip
做一個(gè)測(cè)試:
1創(chuàng)建一個(gè)index
PUT test_chinese
2創(chuàng)建一個(gè)mapping映射萌踱,設(shè)置哪個(gè)key使用ik分詞
GET test_chinese/_mapping/doc
{
"properties":{
"content":{
"type":"text",
"analyzer":"ik_max_word",
"search_analyzer":"ik_smart"
}
}
}
注意:
要在put數(shù)據(jù)之間創(chuàng)建mapping葵礼,存在數(shù)據(jù)以后再創(chuàng)建會(huì)報(bào)錯(cuò),若不創(chuàng)建mapping虫蝶,es會(huì)使用默認(rèn)分詞器對(duì)中文進(jìn)行分詞。
3插入模擬數(shù)據(jù)
逐條插入語(yǔ)法:
PUT test_chinese/doc/1
{
"content":"美國(guó)留給伊拉克的是個(gè)爛攤子嗎"
}
PUT test_chinese/doc/2
{
"content":"公安部:各地校車將享最高路權(quán)"
}
PUT test_chinese/doc/3
{
"content":"中韓漁警沖突調(diào)查:韓警平均每天扣1艘中國(guó)漁船"
}
PUT test_chinese/doc/4
{
"content":"中國(guó)駐洛杉磯領(lǐng)事館遭亞裔男子槍擊 嫌犯已自首"
}
bulk批量操作語(yǔ)法:
POST _bulk
{ "index" : { "_index" : "test_ik", "_type" : "doc", "_id" : "1" } }
{ "content":"美國(guó)留給伊拉克的是個(gè)爛攤子嗎" }
{ "index" : { "_index" : "test_ik", "_type" : "doc", "_id" : "2" } }
{ "content":"公安部:各地校車將享最高路權(quán)" }
{ "index" : { "_index" : "test_ik", "_type" : "doc", "_id" : "3" } }
{ "content":"中韓漁警沖突調(diào)查:韓警平均每天扣1艘中國(guó)漁船" }
{ "index" : { "_index" : "test_ik", "_type" : "doc", "_id" : "4" } }
{ "content":"中國(guó)駐洛杉磯領(lǐng)事館遭亞裔男子槍擊 嫌犯已自首" }
4查詢測(cè)試
GET test_chinese/_search
{
"query": {
"match": {
"content": "中國(guó)"
}
}
}
IK自定義詞典
配置文件IKAnalyzer.cfg.xml倦西。
如果是在線安裝方式IKAnalyzer.cfg.xml的位置在{conf}/analysis-ik/IKAnalyzer.cfg.xml
離線安裝在{plugins}/elasticsearch-analysis-ik-*/config/IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 擴(kuò)展配置</comment>
<!--用戶可以在這里配置自己的擴(kuò)展字典 -->
<entry key="ext_dict">custom/mydict.dic;custom/single_word_low_freq.dic</entry>
<!--用戶可以在這里配置自己的擴(kuò)展停止詞字典-->
<entry key="ext_stopwords">custom/ext_stopword.dic</entry>
<!--用戶可以在這里配置遠(yuǎn)程擴(kuò)展字典 -->
<entry key="remote_ext_dict">location</entry>
<!--用戶可以在這里配置遠(yuǎn)程擴(kuò)展停止詞字典-->
<entry key="remote_ext_stopwords">http://xxx.com/xxx.dic</entry>
</properties>
ik文本詞典均是以dic結(jié)尾,換行符作為分隔,示例如下:
[elk@elk analysis-ik]$ vim myDic.dic
修改ik配置文件,將自定義的詞典添加到ik配置中
重啟es,注意一定要重啟es
通過(guò)前面教程中,我們發(fā)現(xiàn)短語(yǔ)"我愛(ài)中國(guó)",會(huì)被分詞為, "我","愛(ài)","中國(guó)"三個(gè)詞, 如果按照上面詞典定義后, "我愛(ài)中國(guó)"會(huì)被當(dāng)成一個(gè)詞語(yǔ)不被分詞能真。
常見(jiàn)問(wèn)題
1.自定義詞典為什么沒(méi)有生效?
請(qǐng)確保你的擴(kuò)展詞典的文本格式為 UTF8 編碼
2.ik_max_word 和 ik_smart 什么區(qū)別?
ik_max_word: 會(huì)將文本做最細(xì)粒度的拆分扰柠,比如會(huì)將“中華人民共和國(guó)國(guó)歌”拆分為“中華人民共和國(guó),中華人民,中華,華人,人民共和國(guó),人民,人,民,共和國(guó),共和,和,國(guó)國(guó),國(guó)歌”粉铐,會(huì)窮盡各種可能的組合,適合 Term Query卤档;
ik_smart: 會(huì)做最粗粒度的拆分蝙泼,比如會(huì)將“中華人民共和國(guó)國(guó)歌”拆分為“中華人民共和國(guó),國(guó)歌”,適合 Phrase 查詢劝枣。
hanlp 中文分詞器
安裝hanlp中文分詞器插件
hanlp的elasticsearch插件眾多,這里選用了這個(gè),這個(gè)插件支持的分詞模式要多一些,截止現(xiàn)在此插件最新支持7.0.0,由于插件中包含很大的詞典文件,建議此插件采用離線安裝
- 下載安裝ES對(duì)應(yīng)Plugin Release版本
方式一
a. 下載對(duì)應(yīng)的release安裝包
b. 將相關(guān)內(nèi)容解壓至ES_HOME/plugins/analysis-hanlp
unzip -n elasticsearch-analysis-hanlp-6.4.0.zip -d /data01/elk/elasticsearch-6.4.0/plugins/analysis-hanlp
c. 將config目錄下的文件移動(dòng)至ES_HOME/config/analysis-hanlp
d. 解壓出的data目錄為詞典目錄
方式二
a. 使用elasticsearch插件腳本安裝command如下:
./bin/elasticsearch-plugin install https://github.com/KennFalcon/elasticsearch-analysis-hanlp/releases/download/v6.4.0/elasticsearch-analysis-hanlp-6.4.0.zip
- 安裝數(shù)據(jù)包
release包中存放的為HanLP源碼中默認(rèn)的分詞數(shù)據(jù)汤踏,若要下載完整版數(shù)據(jù)包,請(qǐng)查看HanLP Release
數(shù)據(jù)包目錄:ES_HOME/analysis-hanlp
注:因原版數(shù)據(jù)包自定義詞典部分文件名為中文舔腾,這里的hanlp.properties中已修改為英文溪胶,請(qǐng)對(duì)應(yīng)修改文件名
- 重啟Elasticsearch
注:上述說(shuō)明中的ES_HOME為自己的ES安裝路徑,需要絕對(duì)路徑
提供的分詞方式說(shuō)明
hanlp: hanlp默認(rèn)分詞
hanlp_standard: 標(biāo)準(zhǔn)分詞
hanlp_index: 索引分詞
hanlp_nlp: NLP分詞
hanlp_n_short: N-最短路分詞
hanlp_dijkstra: 最短路分詞
hanlp_crf: CRF分詞(在hanlp 1.6.6已開(kāi)始廢棄)
hanlp_speed: 極速詞典分詞
樣例
創(chuàng)建index
PUT /test_hanlp
創(chuàng)建mapping映射稳诚,設(shè)置哪個(gè)字段使用hanlp分詞
GET test_hanlp/_mapping/doc
{
"properties":{
"text":{
"type":"text",
"analyzer":"hanlp",
"search_analyzer":"hanlp"
}
}
}
插入一條數(shù)據(jù)
PUT test_hanlp/doc/1
{
"text": "美國(guó)阿拉斯加州發(fā)生8.0級(jí)地震"
}
輸入查詢條件查詢
GET test_hanlp/_search
{
"query": {
"match": {
"text": "美國(guó)"
}
}
}
按
美國(guó)
查詢可以查出結(jié)果哗脖,按國(guó)
查不出結(jié)果,說(shuō)明分詞成功
還可以看一下hanlp對(duì)美國(guó)阿拉斯加州發(fā)生8.0級(jí)地震
這句話是如何分詞的
POST /test_hanlp/_analyze
{
"text": "美國(guó)阿拉斯加州發(fā)生8.0級(jí)地震",
"tokenizer": "hanlp"
}
分詞結(jié)果
{
"tokens": [
{
"token": "美國(guó)",
"start_offset": 0,
"end_offset": 2,
"type": "nsf",
"position": 0
},
{
"token": "阿拉斯加州",
"start_offset": 0,
"end_offset": 5,
"type": "nsf",
"position": 1
},
{
"token": "發(fā)生",
"start_offset": 0,
"end_offset": 2,
"type": "v",
"position": 2
},
{
"token": "8.0",
"start_offset": 0,
"end_offset": 3,
"type": "m",
"position": 3
},
{
"token": "級(jí)",
"start_offset": 0,
"end_offset": 1,
"type": "q",
"position": 4
},
{
"token": "地震",
"start_offset": 0,
"end_offset": 2,
"type": "n",
"position": 5
}
]
}
效果很不錯(cuò)了