1. 程式人生 > >python+jieba+tfidf演算法 文字相似度

python+jieba+tfidf演算法 文字相似度

jieba是python第三方庫,用於自然語言處理,對文字進行分詞,當然也有其他的分詞庫。

gensim庫,利用TFIDF演算法來進行文字相似度計算,通過利用gensim庫的corpora,models,similarities處理後續。

  • 基本思路:jieba進行分詞,整理為指定格式->gensim庫將要對比的文件通過doc2bow轉化為稀疏向量->再通過models中的tf-idf將語料庫進行處理->特徵值和稀疏矩陣相似度建立索引->最後的到相似結果。

接下來:

我建立兩個文字檔案,作為語料庫,另外再建立一個文字檔案,作為需要對比的檔案。內容是百度隨便找的,就拿稀疏向量和稀疏矩陣的百度百科吧。分別(d1,d2)(d3)d3去對比d1,d2

import jieba
from gensim import corpora,models,similarities
from collections import defaultdict   #用於建立一個空的字典,在後續統計詞頻可清理頻率少的詞語
#1、讀取文件
doc1="./d1.txt"
doc2="./d2.txt"
d1=open(doc1,encoding='GBK').read()
d2=open(doc2,encoding='GBK').read()
#2、對要計算的文件進行分詞
data1=jieba.cut(d1)
data2=jieba.cut(d2)
#3、對分詞完的資料進行整理為指定格式
data11=""
for i in data1:
    data11+=i+" "
data21=""
for i in data2:
    data21+=i+" "
documents=[data11,data21]
texts=[[word for word in document.split()] for document in documents]
#4、 計算詞語的頻率
frequency=defaultdict(int)
for text in texts:
    for word in text:
        frequency[word]+=1
'''
#5、對頻率低的詞語進行過濾(可選)
texts=[[word for word in text if frequency[word]>10] for text in texts]
'''
#6、通過語料庫將文件的詞語進行建立詞典
dictionary=corpora.Dictionary(texts)
dictionary.save("./dict.txt")    #可以將生成的詞典進行儲存
#7、載入要對比的文件
doc3="./d3.txt"
d3=open(doc3,encoding='GBK').read()
data3=jieba.cut(d3)
data31=""
for i in data3:
    data31+=i+" "
#8、將要對比的文件通過doc2bow轉化為稀疏向量
new_xs=dictionary.doc2bow(data31.split())
#9、對語料庫進一步處理,得到新語料庫
corpus=[dictionary.doc2bow(text)for text in texts]
#10、將新語料庫通過tf-idf model 進行處理,得到tfidf
tfidf=models.TfidfModel(corpus)
#11、通過token2id得到特徵數
featurenum=len(dictionary.token2id.keys())
#12、稀疏矩陣相似度,從而建立索引
index=similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featurenum)
#13、得到最終相似結果
sim=index[tfidf[new_xs]]
print(sim)

執行效果:(由於找的內容是同一個百度百科裡的,可以看出來d3與d1,d2的相似度分別是16.6%和15.7%)

從本次記錄中可以思考一下,畢業論文查重或許也是類似原理,查重的語料庫很巨大,將你的一篇論文與它眾多論文進行對比,最後可以通過相關演算法(也許就一個平均值)來計算最終相似度。所以可以思考思考如何應對。