天天看點

【Pyhton 資料分析】通過gensim進行文本相似度分析

環境描述

Python環境:Python 3.6.1

系統版本:windows7 64bit

檔案描述

一共有三個檔案,分别是:file_01.txt、file_02.txt、file_03.txt

file_01.txt檔案内容:

我吃過糖之後,發現我的牙齒真的很疼      

file_02.txt檔案内容:

牙疼不是病疼起來要人命.      

file_03.txt檔案内容:

我的肚子不舒服!與此同時,牙疼也讓我接近崩潰      

文本相似度分析步驟

  1. 打開并讀取文檔内容
  2. 對要進行分析的文檔分詞
  3. 格式化文檔
  4. 計算詞頻(可以過濾詞頻較小的詞)
  5. 通過語料庫建立字典
  6. 加載要對比的文檔
  7. 将要對比的文檔通過doc2bow轉化為稀疏向量
  8. 對稀疏向量進行進一步處理,得到新語料庫
  9. 将新語料庫通過tfidfmodel進行處理,得到tfidf
  10. 通過token2id得到特征數
  11. 稀疏矩陣相似度,進而建立索引
  12. 得到相似度結果

實作代碼

#-*- coding:utf-8 -*-

#導入所需的子產品
from gensim import corpora,models,similarities
import jieba
from collections import defaultdict

#打開并讀取檔案
f1 = "D:/reptile/file/file_01.txt"
f2 = "D:/reptile/file/file_02.txt"

content1 = open(f1,encoding='UTF-8').read()
content2 = open(f2,encoding='UTF-8').read()

#對文檔進行分詞
data1 = jieba.cut(content1)
data2 = jieba.cut(content2)

#整理文檔格式,格式為:"詞語1 詞語2 ... 詞語n "(詞語之間用空格分隔)
str1 = ""
for item in data1:
    str1+=item+" "
#print(str1)
str2 = ""
for item in data2:
    str2+=item+" "
#print(str2)

#split預設分隔符為空格
str_all = [str1,str2]
text = [[word for word in str3.split()]
        for str3 in str_all]

#計算詞語頻率
frequency = defaultdict(int)
for i in text:
    for token in i:
        frequency[token]+=1
#過濾詞頻為3的
'''
texts=[[word for word in text if frequency[token]>3]
 for text in texts]
'''
#通過語料庫建立詞典
dictionary = corpora.Dictionary(text)
dictionary.save("D:/reptile/file/dict1.txt")

#加載要對比的文檔
f3 = "D:/reptile/file/file_03.txt"
content3 = open(f3,encoding='UTF-8').read()
data3 = jieba.cut(content3)

str3 = ""
for item in data3:
    str3+=item+" "
new_data = str3

#doc2bow将檔案變成一個稀疏矩陣
new_vec = dictionary.doc2bow(new_data.split())

#對字典進行docbow處理,得到新的語料庫
corpus = [dictionary.doc2bow(j) for j in text]

#将corpus語料庫持久化到磁盤中,詞句可以删除
#corpora.MmCorpus.serialize("D:/reptile/file/New_Yuliaoku.mm",corpus)

#将新的語料庫通過TfidfModel處理,得到tfidf
tfidf = models.TfidfModel(corpus)

#求特征數
featureNum = len(dictionary.token2id.keys())

#SparseMatrixSimilarity 稀疏矩陣相似度
index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featureNum)

#得到結果
sim = index[tfidf[new_vec]]

#列印結果
print(sim)      

運作結果

[ 0.58554006  0.15430336]

該結果說明:file_03檔案與file_02的相似度為0.15430336,與file_01的相似度為0.58554006

作者:奔跑的金魚