ElasticSearch6.2.2 ansj分詞插件使用和其它比較

大綱

一、elasticsearch6 ansj分詞簡介

二、elasticsearch6 ansj分詞安裝

三、elasticsearch6 ansj分詞配置

四、elasticsearch6 ansj分詞使用

五,總結

 

一  ansj介紹 

nsj_seg分詞器個人覺得是開源分詞器裏最強悍功能最豐富的。ansj_seg基於中科院的 ictclas 中文分詞算法,智能、高效。雖然現在已經有ictclas 的for java版本,但是 ansj_seg從實現到使用來說要強大的多,很多細節和小功能都有考慮,在索引和自然語言分析方面都有很優秀的表現。ansj_seg可以作爲ictclas 算法實現的分詞器的代表。 

ansj分詞插件的說明
es5.0版本之前配置ansj均是在elasticsearch.yml中配置
es5.0版本及之後,均不支持配置文件方式,僅支持api方式進行設置
ansj分詞插件的安裝
分詞插件的下載
從github開源網址下載
https://github.com/NLPchina/elasticsearch-analysis-ansj/releases/download/v6.2.2/elasticsearch-analysis-ansj-6.2.2.0-release.zip

二 ansj分詞安裝

分詞插件的配置步驟
1 將下載下來的zip包,拷貝到es_home/plugins下
2 將zip解壓到當前目錄下

3 將之前的es-ansj的zip包刪除掉。
4 重啓es(使之加載分詞器配置,使之具備分詞的能力,此時還不能生效和使用)

三 ansj分詞配置

通過es提供的api方式配置ansj分詞插件
1、首先關閉索引服務(分詞配置不支持動態設置,須關閉索引服務後纔可以進行設置分詞)
curl -XPOST ‘127.0.0.1:9200/_all/_close’
2、設置分詞方式
curl -XPUT 'http://127.0.0.1:9200/_all/_settings?preserve_existing=true' -H 'Content-Type: application/json' -d '{
  "index.analysis.analyzer.default.type" : "index_ansj",
  "index.analysis.analyzer.default_search.type" : "query_ansj"
}'
4 關於分詞方式的說明、
索引分詞
    儘可能分出所有的分詞結果,儘量提高召回率

召回率
    官方定義:搜索結果的正確內容條目佔文檔中所有相關內容條目的比例
    白話解釋:應該被搜索出來的東西,儘可能都被搜索出來,即hit命中的比例
搜索分詞
   一定是索引分詞的一個子集,儘量保證準確率
5  準確率
    官方定義:搜索結果中的正確內容條目佔搜索出來的內容條目的比例
    白話解釋:儘量保證搜索出來的內容條目,對的越多越好。

6  打開索引服務,對外正常提供搜索服務
curl -XPOST ‘127.0.0.1:9200/_all/_open’

7 ansj分詞插件安裝成功後的測試

web http請求接口說明
/_cat/ansj: 執行分詞
/_cat/ansj/config: 顯示全部配置
/_ansj/flush/config: 刷新全部配置
/_ansj/flush/dic: 更新全部詞典。包括用戶自定義詞典,停用詞典,同義詞典,歧義詞典,crf
web http請求接口測試
http://127.0.0.1:9200/_cat/ansj?text=長春市長春節講話&type=index_ansj

 問題發現

索引分詞效果並不理想,分的不夠細,會直接影響搜索效果。

 主要原因:開源版es-ansj分詞的配置有bug,沒有加載完全詞庫導致的。


 解決方法
a、下載ansj分詞最新版,獲取其最新分詞庫和配置文件

 下載地址-1:https://github.com/NLPchina/ansj_seg/releases,找最新版即可

 不知道是什麼原因,半天沒下下來。可以在git上只下載需要的文件即可。

b、解壓縮後,拿到其library目錄和ansj_library.properties文件
c、將如上2個文件,拷貝到es_home根目錄下
d、重啓es即可生效
web http請求接口再測試,依然以之前的示例作爲比較,即可獲取理想的索引和搜索分詞的效果。

四 ansj分詞使用

es-ansj插件使用介紹
通過head新建一個索引以及一個類型的mapping結構,並指定相關字段的分詞設置
原生結構
curl -XPUT http://localhost:9200/test -H 'Content-Type: application/json' -d '{
    "settings" : {
        "number_of_shards" : 1,
        "number_of_replicas" : 0

    },
    "mappings" : {
        "student" : {
            "_all" : { "enabled" : false },
            "properties" : {
                "name" : { "type" : "text", "analyzer" : "index_ansj", "search_analyzer" : "query_ansj" },
        "classname" : { "type" : "text", "analyzer" : "index_ansj", "search_analyzer" : "query_ansj" },
        "gender" : { "type" : "text" }
            }
        }
    }
}'

通過head複合頁面發送請求
{
    "settings" : {
        "number_of_shards" : 1,
        "number_of_replicas" : 0

    },
    "mappings" : {
        "student" : {
            "_all" : { "enabled" : false },
            "properties" : {
                "name" : { "type" : "text", "analyzer" : "index_ansj", "search_analyzer" : "query_ansj" },
        "classname" : { "type" : "text", "analyzer" : "index_ansj", "search_analyzer" : "query_ansj" },
        "gender" : { "type" : "text" }
            }
        }
    }
}

通過head向指定索引名稱及其指定的type新建一條數據
原生結構
curl -XPUT 'http://localhost:9200/test/student/1?pretty' -H 'Content-Type: application/json' -d '
{
    "name": "張自強",
    "classname": "計算機科技技術1班",
    "gender": "男生"
}'

通過head複合頁面發送請求
{
    "name": "張自強",
    "classname": "計算機科技技術1班",
    "gender": "男生"
}

//第2名
{
    "name": "李四",
    "classname": "計算機科技技術2班",
    "gender": "男生"
}
//第3名
{
    "name": "張萌萌",
    "classname": "軟件工程3班",
    "gender": "女生"
}

 

五 總結

1  word分詞器 
word分詞是一個Java實現的中文分詞組件,提供了多種基於詞典的分詞算法,並利用ngram模型來消除歧義。 能準確識別英文、數字,以及日期、時間等數量詞,能識別人名、地名、組織機構名等未登錄詞。 同時提供了Lucene、Solr、ElasticSearch插件。 
可參考:

2  ansj 
ansj_seg分詞器個人覺得是開源分詞器裏最強悍功能最豐富的。ansj_seg基於中科院的 ictclas 中文分詞算法,智能、高效。雖然現在已經有ictclas 的for java版本,但是 ansj_seg從實現到使用來說要強大的多,而且作者自產自銷自用,很多細節和小功能都有考慮,在索引和自然語言分析方面都有很優秀的表現。ansj_seg可以作爲ictclas 算法實現的分詞器的代表出場。 
可參考:

3   IKanalyzer 
IKanalyzer採用的是“正向迭代最細粒度切分算法”,是比較常見而且很容易上手的分詞器了。一般新手上路學習lucene或者solr都會用這個。優點是開源(其實java分詞器多是開源的,畢竟算法都是業內熟知的)、輕量、目前來看沒有太大的bug,源碼簡單易懂,做二次開發也很簡單,即使遇到solr/Lucene版本更新,只需要自己稍微修改下實現類就可以通用。缺點是過於簡單白癡,只是簡單的根據配置好的詞庫進行分詞,沒有任何智能可言,連“和服”、“和服務器”這種老梗都破不了。IKanalyzer 有兩種分詞類型。

ik_max_word:會將文本做最細粒度的拆分,會窮盡各種可能的組合;

ik_smart:會做最粗粒度的拆分。

IKanalyzer可以作爲非智能分詞器的代表出場。 
可參考:

4    mmseg4j 
mmseg4j用Chih-Hao Tsai 的MMSeg算法實現的中文分詞器,並實現lucene的analyzer和solr的TokenizerFactory以方便在Lucene和Solr中使用。 MMSeg 算法有兩種分詞方法:Simple和Complex,都是基於正向最大匹配。Complex加了四個規則過慮。 
可參考:

5   jcseg 
jcseg分詞器使用的是mmseg算法和fmm算法,這個分詞器類似ansj_seg的很多地方,智能、人性化,個人感覺體驗要超過同門師兄弟mmseg4j,所以可以作爲mmseg算法實現的分詞器的代表出場。 
可參考:

參考文獻

https://blog.csdn.net/erliang20088/article/details/81627737

https://blog.csdn.net/liyantianmin/article/details/59485799

https://www.cnblogs.com/chenmc/p/9525163.html

https://github.com/NLPchina/

 

發佈了38 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章