Chinese Synonyms for Natural Language Processing and Understanding.
最好的中文近義詞庫。
最近需要做一個基於知識圖譜的檢索,但是因為知識圖譜中存儲的都是標準關鍵詞,所以需要對用戶的輸入進行標準關鍵詞的匹配。目前很缺乏質量好的中文近義詞庫,於是便考慮使用word2vec訓練一個高質量的同義詞庫將"非標準表述" 映射到 "標準表述",這就是Synonyms的起源。
在經典的信息檢索系統中,相似度的計算是基於匹配的,而且是Query經過分詞後與文檔庫的嚴格的匹配,這種就缺少了利用詞彙之間的「關係」。而word2vec使用大量數據,利用上下文信息進行訓練,將詞彙映射到低維空間,產生了這種「關係」,這種「關係」是基於距離的。有了這種「關係」,就可以進一步利用詞彙之間的距離進行檢索。所以,在算法層面上,檢索更是基於了「距離」而非「匹配」,基於「語義」而非「形式」。
下面我們來仔細聊聊Synonyms(https://github.com/huyingxi/Synonyms)。
首先需要語料,我們採用了開放的大規模中文語料——維基百科中文語料。
(1)下載維基百科中文語料。
(2)繁簡轉換。
(3)分詞。
具體操作訪問wikidata-corpus
使用gensim自帶的word2vec包進行詞向量的訓練。
(1)下載gensim。
(2)輸入分詞之後的維基語料進行詞向量訓練。
(3)測試訓練好的詞的近義詞。
具體操作訪問
wikidata-corpus
gensim.word2vec官方文檔
pip install -U synonyms
獲取近義詞列表及對應的分數
import synonyms
print("人臉: %s" % (synonyms.nearby("人臉"))) # 獲取近義詞
print("識別: %s" % (synonyms.nearby("識別")))
print("NOT_EXIST: %s" % (synonyms.nearby("NOT_EXIST")))
synonyms.nearby(WORD)返回一個list,list中包含兩項:[[nearby_words], [nearby_words_score]],nearby_words是WORD的近義詞們,也以list的方式存儲,並且按照距離的長度由近及遠排列,nearby_words_score是nearby_words中對應位置的詞的距離的分數,分數在(0-1)區間內,越接近於1,代表越相近。
人臉: [['圖片', '圖像', '通過觀察', '數字圖像', '幾何圖形', '臉部', '圖象', '放大鏡', '面孔', 'Mii'], [0.597284, 0.580373, 0.568486, 0.535674, 0.531835, 0.530095, 0.525344, 0.524009, 0.523101, 0.516046]]
識別: [['辨識', '辨別', '辨認', '標識', '鑑別', '標記', '識別系統', '分辨', '檢測', '區分'], [0.872249, 0.764099, 0.725761, 0.702918, 0.68861, 0.678132, 0.663829, 0.661863, 0.639442, 0.611004]]
獲得兩個句子的相似度
sen1 = "旗幟引領方向"
sen2 = "道路決定命運"
assert synonyms.compare(sen1, sen2) == 0.0, "the similarity should be zero"
sen1 = "發生歷史性變革"
sen2 = "取得歷史性成就"
assert synonyms.compare(sen1, sen2) > 0, "the similarity should be bigger then zero"
返回值:[0-1],並且越接近於1代表兩個句子越相似。
詳細的文檔。
場景推薦。將用戶輸入進行近義詞分析,可以推薦給用戶相關的關鍵詞。
搜索。將用戶非標準化輸入轉換為標準化輸入,進而進行資料庫/知識庫檢索。
相似度計算。解決在自然語言處理任務中常見的詞語語義相似度計算問題。
Why Synonyms1、準確率高。
從上面的示例可以看到synonyms作為開放領域的同義詞庫,已經有較優的表現。
2、快速使用。
即安即用,方便開發者直接調用。
3、方便搭建。
Hu Ying Xi
hain
給 Synonyms 點讚。