請選擇 進入手機版 | 繼續訪問電腦版

台灣粉絲俱樂部

資源 | Synonyms:一個開源的中文近義詞工具包

[複製鏈接]
本文作者:『機器之心』 | 發表於:2018-1-14 13:33:04
機器之心整理

參與:蔣思源

  近日,Hai Liang Wang 和胡小夕在 GitHub 開放了一個中文近義詞工具包 Synonyms,它可用於如文本對齊、推薦算法、相似度計算、語義偏移、關鍵字提取、概念提取、自動摘要、搜索引擎等很多 NLP 任務。該工具包目前能搜索近義詞和比較語句相似度等任務,且詞匯量達到了 125,792。機器之心也嘗試使用 Synonyms 搜索一段中文的近義詞,並有非常不錯的反饋。

項目地址:https://github.com/huyingxi/Synonyms

該中文近義詞工具包采用的基本技術是 Word2vec,因此在介紹該工具的同時我們會簡要介紹詞嵌入方法。此外,Synonyms 的安裝十分便捷,我們可以直接使用命令 pip install -U synonyms 完成。該工具包兼容 Python 2 和 Python 3,且目前的穩定版為 v2.0,以下是使用 Synonyms 工具的效果:







如果我們想把單詞輸入機器學習模型,除非使用基於樹的方法,否則需要把單詞轉換成一些數值向量。一種直接的方法是使用「one-hot encoding」方法將單詞轉換為稀疏表示,如下所示向量中只有一個元素設置為 1,其餘為 0。







這種方法的缺點在於一個詞的向量長度等於詞匯表的大小,且非常稀疏。不僅如此,這種方法剝離了單詞的所有局部語境,我們不能通過向量表示這個詞的概念。因此,我們需要使用更高效的方法表示文本數據,而這種方法可以保存單詞的上下文的信息。這是 Word2Vec 方法的初衷。

一般來說,Word2Vec 方法由兩部分組成。首先是將高維 one-hot 形式表示的單詞映射成低維向量。例如將 10,000 列的矩陣轉換為 300 列的矩陣,這一過程被稱為詞嵌入。第二個目標是在保留單詞上下文的同時,從一定程度上保留其意義。Word2Vec 實現這兩個目標的方法有 skip-gram 和 CBOW 等,skip-gram 會輸入一個詞,然後嘗試估計其它詞出現在該詞附近的概率。還有一種與此相反的被稱為連續詞袋模型(Continuous Bag Of Words,CBOW),它將一些上下文詞語作為輸入,並通過評估概率找出最適合(概率最大)該上下文的詞。

對於連續詞袋模型而言,Mikolov 等人運用目標詞前面和後面的 n 個詞來同時預測這個詞。他們稱這個模型為連續的詞袋(CBOW),因為它用連續空間來表示詞,而且這些詞的先後順序並不重要。







連續的詞袋(Mikolov 等人,2013 年)

CBOW 可以看作一個具有先知的語言模型,而 skip-gram 模型則完全改變將語言模型的目標:它不像 CBOW 一樣從周圍的詞預測中間的詞;恰恰相反,它用中心語去預測周圍的詞:







Skip-gram(Mikolov 等人,2013)

在加載 Synonyms 中,我們可以看到會打印出「loaded (125796, 100) matrix from...」,因此 Synonyms 采用的詞向量維度為 100。

用法 輸出近義詞向量:

                         import synonyms

                print("人臉: %s" % (synonyms.nearby("人臉")))

                print("識別: %s" % (synonyms.nearby("識別")))

                print("NOT_EXIST: %s" % (synonyms.nearby("NOT_EXIST")))

         

synonyms.nearby(WORD) 會返回一個包含兩項的列表:

[[nearby_words], [nearby_words_score]],nearby_words 是 WORD 的近義詞向量,也以列表的方式存儲,並且按照距離的長度由近及遠排列,nearby_words_score 是 nearby_words 中對應詞的距離分數,分數在 (0-1) 區間內,越接近於 1,代表越相近。比如:



                         synonyms.nearby(人臉) = [

                 ["圖片", "圖像", "通過觀察", "數字圖像", "幾何圖形", "臉部", "圖象", "放大鏡", "面孔", "Mii"],

                 [0.597284, 0.580373, 0.568486, 0.535674, 0.531835, 0.530

                095, 0.525344, 0.524009, 0.523101, 0.516046]]

         

在出現集外詞的情況下,返回 [[], []],目前的字典大小: 125,792。

機器之心嘗試將一整段關於 Word2vec 的中文分割為一個個單詞,再使用 Synonyms 工具對分詞的結果取近義詞,以下是試驗結果:





                         Word2Vec : [[], []]

                方法 : [['方式', '手段', '新方法', '原理', '工具', '步驟', '算法', '分析方法', '演算法', '方法有'], [0.770168, 0.698663, 0.696657, 0.693642, 0.690686, 0.687199, 0.675024, 0.673502, 0.657432, 0.656965]]

                由 : [[], []]

                兩 : [[], []]

                部分 : [['部份', '大部分', '一小', '其餘部分', '外', '大多', '之外', '大部份', '以外', '均'], [0.819274, 0.77532, 0.696557, 0.630384, 0.625031, 0.617763, 0.609703, 0.600958, 0.599957, 0.592684]]

                組成 : [['構成', '分成', '組合成', '組合而成', '都由', '組建', '分為', '都是由', '成員', '合組'], [0.672614, 0.633627, 0.622906, 0.601468, 0.579645, 0.576105, 0.56926, 0.558928, 0.555657, 0.55275]]

                。 : [[], []]

                首先 : [[], []]

                是 : [[], []]

                將 : [[], []]

                高維 : [['蕭士達', '浦羅哥', '希爾伯特', '龐加萊', '歐拉', '幾何', '群論', '圖論', '高斯', '線性代數'], [0.585315, 0.570614, 0.52954, 0.507108, 0.503025, 0.501703, 0.49944, 0.496649, 0.495397, 0.488994]]

                獨熱 : [[], []]

                形式 : [['方式', '型式', '性質', '表現形式', '表達方式', '概念', '媒介', '內容', '規則', '簡單'], [0.748891, 0.621915, 0.6181, 0.617813, 0.617308, 0.611825, 0.583548, 0.578797, 0.574129, 0.569158]]

                表示 : [['回應', '指出', '透露', '表達', '聲稱', '對此', '暗示', '否認', '說明', '問到'], [0.733619, 0.718644, 0.700614, 0.69215, 0.669181, 0.663752, 0.65325, 0.648804, 0.64028, 0.632011]]

                的 : [[], []]

                單詞 : [['單字', '詞語', '短語', '字詞', '詞根', '詞組', '句子', '音節', '詞匯', '前綴'], [0.819558, 0.793184, 0.779852, 0.775173, 0.771767, 0.767386, 0.747697, 0.733435, 0.722758, 0.715587]]

                映射 : [['同構', '拓撲', '等價', '同態', '算子', '流形', '給定', '子集', '函數', '向量'], [0.751925, 0.737796, 0.736626, 0.723419, 0.72286, 0.717205, 0.70084, 0.699233, 0.698332, 0.682505]]

                成 : [['出', '變成', '成為', '演變成', '變為', '起來', '轉成', '形成', '已成', '轉變成'], [0.626685, 0.597042, 0.578111, 0.554632, 0.55223, 0.538277, 0.498342, 0.482658, 0.480671, 0.479747]]

                低 : [['較低', '較高', '高', '更高', '極低', '很低', '低於', '高於', '偏高', '較差'], [0.880493, 0.829336, 0.814844, 0.751234, 0.744953, 0.73976, 0.715566, 0.715089, 0.709287, 0.686807]]

                維向量 : [[], []]

                。 : [[], []]

                例如 : [[], []]

                將 : [[], []]

                 : [[], []]

                10 : [[], []]

                , : [[], []]

                000 : [[], []]

                 列 : [[], []]

                的 : [[], []]

                矩陣 : [['行列式', '乘積', '向量', '乘法', '算子', '特征值', '線性', '函數', 'formula_', '實數'], [0.78328, 0.743294, 0.7416, 0.735933, 0.705292, 0.697315, 0.697315, 0.690086, 0.689624, 0.683013]]

                轉換 : [['切換', '變換', '轉換成', '疊加', '匹配', '類比', '傳輸', '交換', '操作', '簡化'], [0.733128, 0.718899, 0.715552, 0.628927, 0.621122, 0.612286, 0.611997, 0.609811, 0.604056, 0.603366]]

                為 : [[], []]

                 : [[], []]

                300 : [[], []]

                 列 : [[], []]

                的 : [[], []]

                矩陣 : [['行列式', '乘積', '向量', '乘法', '算子', '特征值', '線性', '函數', 'formula_', '實數'], [0.78328, 0.743294, 0.7416, 0.735933, 0.705292, 0.697315, 0.697315, 0.690086, 0.689624, 0.683013]]

                。 : [[], []]

                這個 : [[], []]

                過程 : [['步驟', '流程', '處理過程', '操作過程', '現實生活', '程序', '機制', '方法', '方式', '每一次'], [0.654057, 0.627095, 0.612206, 0.588535, 0.587763, 0.584512, 0.570078, 0.56342, 0.556587, 0.555285]]

                被 : [[], []]

                稱為 : [['稱作', '稱之為', '被稱作', '稱做', '專指', '統稱', '叫作', '叫做', '稱呼', '特指'], [0.931905, 0.888719, 0.883803, 0.833798, 0.741266, 0.73327, 0.725112, 0.720903, 0.714699, 0.695307]]

                詞 : [['詞語', '該詞', '名詞', '用法', '詞匯', '用語', '含義', '辭匯', '字詞', '術語'], [0.865391, 0.833362, 0.817649, 0.810989, 0.79878, 0.752893, 0.741603, 0.730943, 0.727771, 0.725913]]

                嵌入 : [['映射', '內嵌', '填充', '封裝', '插入', '存儲', '鏈接', '浸入', '粘貼', '構造'], [0.640392, 0.630447, 0.618274, 0.60825, 0.604815, 0.59937, 0.566457, 0.55673, 0.554925, 0.554157]]

                。 : [[], []]

                第二 : [[], []]

                個 : [[], []]

                目標 : [['目的', '最終目標', '能夠', '盡可能', '戰略目標', '策略', '能力', '遠距離', '任務', '必須'], [0.743574, 0.66224, 0.652209, 0.625992, 0.595744, 0.595451, 0.586327, 0.585261, 0.582277, 0.579012]]

                是 : [[], []]

                在 : [[], []]

                保留 : [['保有', '保存', '留存', '沿用', '原有', '延續', '存留', '更改', '恢復', '維持'], [0.741621, 0.70751, 0.695012, 0.667181, 0.644165, 0.609553, 0.57785, 0.558837, 0.55696, 0.554073]]

                單詞 : [['單字', '詞語', '短語', '字詞', '詞根', '詞組', '句子', '音節', '詞匯', '前綴'], [0.819558, 0.793184, 0.779852, 0.775173, 0.771767, 0.767386, 0.747697, 0.733435, 0.722758, 0.715587]]

                上下文 : [['語義', '語句', '字符串', 'codice_', '句子', '正則表達式', '變量', '表達式', '子句', '自然語言'], [0.777081, 0.745407, 0.737112, 0.710487, 0.706909, 0.700924, 0.693529, 0.688357, 0.682883, 0.678303]]

                的 : [[], []]

                同時 : [[], []]

                , : [[], []]

                從 : [[], []]

                一定 : [[], []]

                程度 : [['水平', '因素', '高度', '素質', '層面', '能力', '狀況', '相對', '情況', '原因'], [0.643124, 0.635219, 0.627448, 0.624889, 0.619942, 0.602435, 0.599929, 0.598476, 0.596007, 0.594679]]

                上 : [[], []]

                保留 : [['保有', '保存', '留存', '沿用', '原有', '延續', '存留', '更改', '恢復', '維持'], [0.741621, 0.70751, 0.695012, 0.667181, 0.644165, 0.609553, 0.57785, 0.558837, 0.55696, 0.554073]]

                其 : [[], []]

                意義 : [['涵義', '含義', '意涵', '內涵', '象征意義', '本質', '含意', '意味', '概念', '性質'], [0.784661, 0.767263, 0.758177, 0.749875, 0.734564, 0.730683, 0.671735, 0.670497, 0.666011, 0.658259]]

                。 : [[], []]

         

兩個句子的相似度比較:



                          sen1 = "發生歷史性變革"

                 sen2 = "發生歷史性變革"

                 r = synonyms.compare(sen1, sen2, seg=True)

         

其中,參數 seg 表示 synonyms.compare 是否對 sen1 和 sen2 進行分詞,默認為 True。返回值:[0-1],並且越接近於 1 代表兩個句子越相似。





                         旗幟引領方向 vs 道路決定命運: 0.429

                旗幟引領方向 vs 旗幟指引道路: 0.93

                發生歷史性變革 vs 發生歷史性變革: 1.0

                         句子相似度準確率



在 SentenceSim 上進行測試:



SentenceSim 地址:https://github.com/fssqawj/SentenceSim/blob/master/dev.txt



                         測試語料條數為:7516條.

                設定閾值 0.5:

                 相似度 > 0.5, 返回相似;

                 相似度

                        

評測結果:





                         正確 : 6626,錯誤 : 890,準確度 : 88.15%

                         關於距離計算和閥值選取,參考 Synonyms/issues/6。

以友好的方式打印近義詞,方便調試,display 調用了 synonyms#nearby 方法:





                         >>> synonyms.display("飛機")

                '飛機'近義詞:

                 1. 架飛機:0.837399

                 2. 客機:0.764609

                 3. 直升機:0.762116

                 4. 民航機:0.750519

                 5. 航機:0.750116

                 6. 起飛:0.735736

                 7. 戰機:0.734975

                 8. 飛行中:0.732649

                 9. 航空器:0.723945

                 10. 運輸機:0.720578

                        

最後,Synonyms 項目的作者胡小夕是北京郵電大學研究生,目前實習於今日頭條 AI LAB。從事自然語言處理方向研究,在智能客服,知識圖譜等領域都有相關研究開發經驗。研發模型在文體分類權威數據集 TREC 上達到目前最優精度,申請深度學習與自然語言處理結合的國家發明專利 5 項。



@online{Synonyms:hain2017, author = {Hai Liang Wang, Hu Ying Xi}, title = {中文近義詞工具包Synonyms}, year = 2017, url = {https://github.com/huyingxi/Synonyms}, urldate = {2017-09-27} }

內容來源皆為自媒體,轉貼請附上原文連結。
原文轉發,文章內金額部分多以人民幣為單位。
投稿或版權問題,請您聯繫:service#taiwanfansclub.com ( # ~> @ )
姓名標示─非商業性─相同方式分享
快速回復 返回頂部 返回列表