【Natural Language Processing】詞彙相似度(Word similarity)計算

        以下詞彙相似度計算方法的實現是基於WordSimilarity-353進行,即根據相關方法計算得到給定詞彙的相似度後,再使用斯皮爾曼等級相關判定來計算所得的詞彙相似度與已人工標註好的相似度之間的相關性。

一、基於語義詞典的方法

        常用的語義詞典是WordNet,一般直接在Python裏面使用,即通過pip install nltk來安裝NLTK之後,再下載nltk-data放在相應文件夾即可(官方推薦的方法下載特別慢),以下實現是根據Wu-Palmer 提出的最短路徑計算兩者的path_similarity(具體可以查看:http://nltk.googlecode.com/svn/trunk/doc/howto/wordnet.html。),並且取其中最大的詞彙相似度最爲結果。

# -*- coding: utf-8 -*-

from nltk.corpus import wordnet as wn
import pandas as pd
import numpy as np
from scipy import stats

def WordSimibywup_simi():
    data = pd.read_csv("combined.csv")
    wordsList = np.array(data.iloc[ :, [ 0, 1 ] ])
    simScore = np.array(data.iloc[ :, [ 2 ] ])
    predScore = np.zeros((len(simScore), 1))
    for i, (word1, word2) in enumerate(wordsList):
        print("process #%d:%s and %s" % (i, word1, word2))
        synsets1 = wn.synsets(word1)
        synsets2 = wn.synsets(word2)
        for synset1 in synsets1:
            for synset2 in synsets2:
                temp = synset1.wup_similarity(synset2)
                if temp is not None and temp>score:
                    score=temp
        predScore[ i, 0 ] = score
    submitData = np.hstack((wordsList, simScore, predScore))
    (pd.DataFrame(submitData)).to_csv("WordSimbywup_simi.csv", index=False,\
                                      header=[ "Word1", "Word2", "OriginSimi", "PredSimi" ])
    (coef1, pvalue) = stats.spearmanr(simScore, predScore)
    print("WordSimibywup_simi:", 'correlation=', coef1, 'pvalue=', pvalue)

if __name__=='__main__':
    WordSimibywup_simi()
    # (WordSimibywup_simi: correlation= 0.339297340633 pvalue= 5.85303993897e-11)

二、基於GoogleNews語料計算詞彙相似度

        這是Google利用Word2vec提前訓練谷歌新聞得到的詞向量模型,裏面包含了很多很多很多的單詞的詞向量,網上一搜GoogleNews-vectors-negative300.bin.gz下載下來解壓就好了,這裏採用gensim這個工具來實現,可以通過pip install gensim來安裝,代碼如下:

# -*- coding:utf-8 -*-

import pandas as pd
import numpy as np
import gensim
from scipy import stats

def WordSimibyGoogleNews():
    set = pd.read_csv('combined.csv')
    data = np.array(set.iloc[ :, [ 0, 1 ] ])
    simScore = np.array(set.iloc[ :, [ 2 ] ])
    Prescore = np.zeros((len(data), 1))
    model=gensim.models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
    for i,(word1, word2) in enumerate(data):
        print("process #%d:%s and %s" % (i, word1, word2))
        Prescore[ i, 0 ] = model.similarity(word1,word2)
    (coef1, pvalue) = stats.spearmanr(simScore, Prescore)
    submitData = np.hstack((data, simScore, simScore))
    (pd.DataFrame(submitData)).to_csv("wordsimbypath_GoogleNews.csv", index=False,
                                      header=[ "Word1", "Word2", "OriginSimi", "PredSimi" ])
    print("WordSimibyCS:", 'correlation=', coef1, 'pvalue=', pvalue)

if __name__=='__main__':
    WordSimibyGoogleNews()
    #(WordSimibyCS: correlation= 0.700016648627 pvalue= 2.86866666051e-53)

        以上只是用了最簡單的兩種方法,除此之外還有很多種方法,比如可以通過爬取相應的詞彙庫,然後計算每個詞彙的TF-IDF特徵,然後直接比較兩個目標詞彙的TF-IDF特徵的餘弦相似度,甚至可以是基於檢索相應詞彙返回頁面數量等方法。

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