python數據分析-文本相似度分析

由於本文設計較多知識點,在編寫代碼之前需要搞清楚這些知識點的含義。

1。知識點解釋

  • Gensim是一款開源的第三方Python工具包,用於從原始的非結構化的文本中,無監督地學習到文本隱層的主題向量表達。它支持包括TF-IDF,LSA,LDA,和word2vec在內的多種主題模型算法,支持流式訓練,並提供了諸如相似度計算,信息檢索等一些常用任務的API接口。
    gensim 以“文集”——文本文檔的集合——作爲輸入,並生成一個“向量”來表徵該文集的文本內容,從而實現語義挖掘。
  • TF-IDF.對於提取一篇文章的關鍵詞,如果某個詞很重要,它應該在這篇文章中多次出現。於是,我們進行”詞頻”(Term Frequency,縮寫爲TF)統計。現次數最多的詞是—-“的”、”是”、”在”—-這一類最常用的詞。它們叫做”停用詞”(stop words),表示對找到結果毫無幫助、必須過濾掉的詞。而對於我們需要的關鍵詞,例如對於上篇博文中的《豐乳肥臀》,出現最多的前十個詞中包括如:上官,女人,一個,地說,母親。顯然對於關鍵詞:一個,地說,對反應文章的特性並沒有其餘幾個好,這時,就是在詞頻的基礎上,要對每個詞分配一個”重要性”權重。最常見的詞(”的”、”是”、”在”)給予最小的權重,較常見的詞(”一個”)給予較小的權重,較少見的詞(”上官”、”女人”)給予較大的權重。這個權重叫做”逆文檔頻率”(Inverse Document Frequency,縮寫爲IDF),它的大小與一個詞的常見程度成反比。知道了”詞頻”(TF)和”逆文檔頻率”(IDF)以後,將這兩個值相乘,就得到了一個詞的TF-IDF值。某個詞對文章的重要性越高,它的TF-IDF值就越大。這裏寫圖片描述這裏寫圖片描述+1爲了防止分母出現0。瞭解了TF-IDF之後,又出現了新的詞:語料庫。參考一
  • 語料庫(corpus)。理論上語料越大越好 ,百度百科的解釋:⒈語料庫中存放的是在語言的實際使用中真實出現過的語言材料,因此例句庫通常不應算作語料庫;⒉語料庫是承載語言知識的基礎資源,但並不等於語言知識;⒊真實語料需要經過加工(分析和處理),才能成爲有用的資源。
  • 餘弦相似性。簡單的說,對於要要計算相似度的兩個句子,步驟:分詞-計算詞頻-將詞頻寫成向量形式-計算向量相似程度(向量夾角)。這裏寫圖片描述
    計算方式如下:
    這裏寫圖片描述
    這裏寫圖片描述
    假定a向量是[x1, y1],b向量是[x2, y2],那麼可以將餘弦定理改寫成下面的形式。
    這裏寫圖片描述
    餘弦的這種計算方法對n維向量也成立。假定A和B是兩個n維向量,A是 [A1, A2, …, An] ,B是 [B1, B2, …, Bn] ,則A與B的夾角θ的餘弦等於:
    這裏寫圖片描述
    餘弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫”餘弦相似性”。

    參考

    所以,對於要計算的兩篇文章的相似度:
    (1)使用TF-IDF算法,找出兩篇文章的關鍵詞;
    (2)每篇文章各取出若干個關鍵詞(比如20個),合併成一個集合,計算每篇文章對於這個集合中的詞的詞頻(爲了避免文章長度的差異,可以使用相對詞頻);
    (3)生成兩篇文章各自的詞頻向量;
    (4)計算兩個向量的餘弦相似度,值越大就表示越相似。

2。代碼

#!/user/bin/env python
#-*- coding:utf-8 -*-
#author:M10
import jieba
from gensim import corpora,models,similarities
from collections import defaultdict
doc1 = '/Users/wangxingfan/Desktop/doc1.txt'
doc2 = '/Users/wangxingfan/Desktop/doc2.txt'
d1 = open(doc1).read()
d2 = open(doc2).read()
data1 = jieba.cut(d1)
data2 = jieba.cut(d2)
list1 = []
list2 = []
list = []
for i in data1:
    list1.append(i)
for i in data2:
    list2.append(i)
list = [list1,list2]
frequency = defaultdict(int)#如果鍵不存在則返回N/A,而不是報錯,獲取分詞後詞的個數
for i in list:
    for j in i:
        frequency[j] +=1
#創建詞典
dictionary = corpora.Dictionary(list)
#詞典保存到本地
dictionary.save('/Users/wangxingfan/Desktop/dic1.txt')
doc3 = '/Users/wangxingfan/Desktop/doc3.txt'
d3 = open(doc3).read()
data3 = jieba.cut(d3)
data31 = []
for i in data3:
    data31.append(i)
new_doc = data31
#稀疏向量.dictionary.doc2bow(doc)是把文檔doc變成一個稀疏向量,[(0, 1), (1, 1)],表明id爲0,1的詞彙出現了1次,至於其他詞彙,沒有出現。
new_vec = dictionary.doc2bow(new_doc)
#獲取語料庫
corpus = [dictionary.doc2bow(i) for i in list]
tfidf = models.TfidfModel(corpus)
#特徵數
featureNUM = len(dictionary.token2id.keys())
#通過TfIdf對整個語料庫進行轉換並將其編入索引,以準備相似性查詢
index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featureNUM)
#計算向量相似度
sim = index[tfidf[new_vec]]
print(sim)

輸出結果[ 0. 0.7104941]
參考:
gensim教程
gensim:相似性查詢
如何計算兩個文檔的相似度(二)

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