1. 程式人生 > >python資料分析-文字相似度分析

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)