相似度计算步骤::
读取要计算的多篇文档
- 对要计算的文档进行分词
- 对文档进行整理成指定格式,方便后续计算
- 计算出词语的频率
- 【可选】对频率低的词语进行过滤
- 通过语料库建立词典
- 加载要对比的文档
- 将要对比的文档,通过doc2bow转化为稀疏向量
- 对我们的稀疏向量进行进一步处理得到新语料库
- 将新语料库通过tfidfmodel进行处理,得到tfidf
- 通过token2id得到特征数
- 稀疏矩阵相似度,从而建立索引,
- 得到最终相似度结果
实现代码:
from gensim import corpora,models,similarities
import jieba
from collections import defaultdict
doc1='E:/programCode/d1.txt'
doc2='E:/programCode/d2.txt'
d1=open(doc1).read()
d2=open(doc2).read()
#对文本进行分词
data1=jieba.cut(d1)
data2=jieba.cut(d2)
#对分词的我文本整理成指定格式,"词语1 词语2 词语3...词语n"
data11=''
for item in data1:
data11+=item+' '
data21=''
for item in data2:
data21+=item+' '
#存储文档到列表
documents=[data11,data21]
texts=[[word for word in document.split()]
for document in documents]
#计算词语的频率
frequency=defaultdict(int)#构建频率对象
for text in texts:
for token in text:
frequency[token]+=1
'''
#如果词汇量过多,去掉低频词
texts=[[word for word in text if frequency[token]>3]
for text in texts]
'''
#通过语料库建立词典
dictionary=corpora.Dictionary(texts)
dictionary.save('E:/programCode/wenben2.txt')
#加载要对比文档
doc3='E:/programCode/d3.txt'
d3=open(doc3).read()
data3=jieba.cut(d3)
data31=''
for item in data3:
data31+=item+' '
new_doc=data31
new_vec=dictionary.doc2bow(new_doc.split())#转换为稀疏矩阵
#得到新的语料库
corpus=[dictionary.doc2bow(text) for text in texts]
ifidf=models.TfidfModel(corpus)
featureNUm=len(dictionary.token2id.keys())#得到特征数
index=similarities.SparseMatrixSimilarity(ifidf[corpus],num_features=featureNUm)
sim=index[ifidf[new_vec]]
print(sim)
老九门、盗墓笔记和鬼吹灯相似性比较
from gensim import corpora,models,similarities
import jieba
from collections import defaultdict
doc1='E:/programCode/laojiumen.txt'
doc2='E:/programCode/guichuideng.txt'
d1=open(doc1,encoding='utf-8').read()
d2=open(doc2,encoding='utf-8').read()
#对文本进行分词
data1=jieba.cut(d1)
data2=jieba.cut(d2)
#对分词的我文本整理成指定格式,"词语1 词语2 词语3...词语n"
data11=''
for item in data1:
data11+=item+' '
data21=''
for item in data2:
data21+=item+' '
#存储文档到列表
documents=[data11,data21]
texts=[[word for word in document.split()]
for document in documents]
#计算词语的频率
frequency=defaultdict(int)#构建频率对象
for text in texts:
for token in text:
frequency[token]+=1
#如果词汇量过多,去掉低频词
texts=[[word for word in text if frequency[token]>50]
for text in texts]
#通过语料库建立词典
dictionary=corpora.Dictionary(texts)
dictionary.save('E:/programCode/wenben2.txt')
#加载要对比文档
doc3='E:/programCode/daomubiji.txt'
d3=open(doc3,encoding='utf-8').read()
data3=jieba.cut(d3)
data31=''
for item in data3:
data31+=item+' '
new_doc=data31
new_vec=dictionary.doc2bow(new_doc.split())#转换为稀疏矩阵
#得到新的语料库
corpus=[dictionary.doc2bow(text) for text in texts]
ifidf=models.TfidfModel(corpus)
featureNUm=len(dictionary.token2id.keys())#得到特征数
index=similarities.SparseMatrixSimilarity(ifidf[corpus],num_features=featureNUm)
sim=index[ifidf[new_vec]]
print(sim)