tf-idf關鍵詞提取演算法
tf-idf簡介
在資訊提取的應用場景之中,我們往往需要一些文字中的重要的詞而不是文字中的所有詞語來進行分析,即使原文字已經進行了去停用詞的處理。
那麼什麼樣的詞算是文字中的關鍵詞呢?一方面,這個詞應該在文字中出現的次數比較多;另一方面,這個詞應該不那麼常見,若是這個詞在很多文件中都有出現,這個詞顯然不能用來作為代表某個文件的重要詞彙。一個合適的演算法便是tf-idf演算法。
tf-idf是term frequency–inverse document frequency的縮寫。該演算法用一種統計學的方法來衡量一個詞語在文字中的重要程度,常被用於資訊提取、文字挖掘等場景之中。該演算法的核心便是計算一個文字中某個詞語的tf值與idf值。
tf計算
tf是term frequency的縮寫,指文字中的詞頻。衡量一個詞語在文件中的出現頻率有很多方法,最簡單也足夠有效的,便是直接計算這個詞出現的次數,來作為這個詞的tf值。
idf計算
idf是inverse document frequency的縮寫,指“逆文件頻率”,是一個用來衡量一個詞常見程度的值。這個值的計算不應該基於單個文件,而應該考慮所有要進行分析的文件,來得出結果。
idf值的計算方法也有很多,這裡僅提供一個常見的公式:
分母處加一,是為了防止某個詞從未出現過而導致分母為0。
演算法實現
上面的兩個值顯然都與一個詞的重要程度正相關,所以將其直接相乘,以乘積比較不同詞之間的重要程度差異。下面是使用python的實現:
def idf(corpus):
idfs = {}
d = 0.0
# 統計詞出現次數
for doc in corpus:
d += 1
counted = []
for word in doc:
if not word in counted:
counted.append(word)
if word in idfs:
idfs[word] += 1
else :
idfs[word] = 1
# 計算每個詞逆文件值
for word in idfs:
idfs[word] = math.log(d/float(idfs[word]))
return idfs
if __name__ == '__main__':
# 獲取需要的語料庫,根據實際情況自行更改
# 這裡獲取的語料庫是每個文件的分詞結果列表的列表
corpus = getCorpus()
idfs = idf(corpus)
for doc in corpus:
tfidfs = {}
for word in doc:
if word in tfs:
tfidfs[word] += 1
else:
tfidfs[word] = 1
for word in tfidfs:
tfidfs[word] *= idfs[word]
'''
在這裡實現你要做的事
'''
實際應用中,有時tf-idf還會與別的演算法相結合,比如根據詞語出現的位置附加一些評判詞語重要程度的資訊等。
總結
tf-idf演算法非常簡單,但其有一個極為致命的缺陷,就是沒有考慮詞語的語義資訊,無法處理一詞多義與一義多詞的情況。
在過去,往往通過結合一些外部資訊如“知網”(WordNet)或者使用可以表達隱藏資訊的概率模型來處理這一缺陷。
2013年,Google開源了其Word2Vec演算法,通過計算上下文來將詞語進行向量化表示,在正常的訓練結果下語義相近的詞語向量距離較近而語義較遠的詞語距離向量較遠。結合這一深度學習的新演算法,tf-idf的傳統問題得到了很好的解決。