1. 程式人生 > >文字相似度分析

文字相似度分析

1 演算法小結

     相信有些人在閒暇時間喜歡讀小說,至於什麼小說在這就不一而論了。就拿我來說最近讀的“一寸山河一寸血”和“混在三國當軍閥”這兩本書,本人感覺很相似,但具體相似多少就需要量化,因此想通過電腦來分析一下。接下來就不廢話直接上原理和具體演算法。

   用到演算法的概述:通過TF-IDF計算文字的關鍵詞,如果某個詞很重要,它應該在這篇文章中多次出現,我們進行”詞頻”(Term Frequency,縮寫為TF)統計;另外要對每個詞分配一個”重要性”權重。最常見的詞(”的”、”是”、”在”)給予最小的權重,較常見的詞(”一個”)給予較小的權重,較少見的詞給予較大的權重。這個權重叫做”逆文件頻率,它的大小與一個詞的常見程度成反比。知道了”詞頻”(TF)和”逆文件頻率”(IDF)以後,將這兩個值相乘,就得到了一個詞的TF-IDF值。得到tf-idf通過token2id得到特徵數(可以用來計算的特徵)然後計算稀疏矩陣相似度,從而建立索引,最後計算相似度結果。(TF-IDF演算法就不詳細及介紹哈,這個很多可以查到)

2 具體的步驟:

    詳細過程:1)讀取文件(1-6分析文件);2)對要計算的多篇文件進行分詞;3)對文件進行整理成指定格式,方便後續進行計算;4)計算出詞語的頻率;5)對頻率低的詞語進行過濾(看資料量決定);6)通過語料庫建立詞典;7)載入要對比的文件(計算要分析的文件7-13);8)將要對比的文件通過doc2bow轉化為稀疏向量;9)對稀疏向量進行進一步處理,得到新語料庫;10)將新語料庫通過tfidfmodel進行處理,得到tfidf;11)通過token2id得到特徵數(可以用來計算的特徵);12)稀疏矩陣相似度,從而建立索引;13)得到最終相似度結果

3 具體例項

import jieba
from gensim import corpora,models,similarities
from collections import defaultdict
doc1 = 'C:/Users/test2/Desktop/hzsgdjf.txt'
d1 = open(doc1,'r',encoding="utf-8").read()
data1 = jieba.cut(d1)
list1 = []
list = []
for i in data1:
    list1.append(i)
list = [list1]
frequency = defaultdict(int)#如果鍵不存在則返回N/A,而不是報錯,獲取分詞後詞的個數
for i in list:
    for j in i:
        frequency[j] +=1
#建立詞典
dictionary = corpora.Dictionary(list)
#詞典儲存到本地
dictionary.save('C:/Users/test2/Desktop/dic1.txt')
doc3 = 'C:/Users/test2/Desktop/ycshycx.txt'
d3 = open(doc3,'r',encoding="utf-8").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)

以上程式可以在jupyter中實現,可以實現簡單文字相似度的計算。