利用相似度推送文章

相似度使用算法:TF-IDF

相似度使用的包:gensim/jieba

相似度的计算步骤:

           1)读取文档
     2)对要计算的文档进行分词
     3)对文档进行整理成指定格式,方便后续的计算
     4)计算出词语的频率  
         5)【可选】对频率低的词语进行过滤
       6)通过语料库(corpus从文本中提取出的语言材料)建立词典
       7)加载要对比的另一个文档
         8)将要对比的文档通过doc2bow转化为稀疏向量
           9)对稀疏向量进行进一步处理,得到新语料库,将新语料库进行处理
           10)通过models将新语料库通过TF-IDF模型进行处理,得到TF-IDF
             11)通过token2id得到特征数
       12)通过similarties得出稀疏矩阵相似度,从而建立索引
       13)得到最终相似度结果


相似度计算代码:

#文本相似度计算
from gensim import corpora,models,similarities
import jieba
from collections import defaultdict    #数据类型容器模块
#1)读取文档
doc = 'F:\\anacondadaima\\shujuchuli\\d1.txt'
doc2 = 'F:\\anacondadaima\\shujuchuli\\d2.txt'
d1 = open(doc,'r',encoding = 'utf-8').read()
d2 = open(doc2,'r',encoding = 'utf-8').read()
# 2)对要计算的文档进行分词
data = jieba.cut(d1)
data2 = jieba.cut(d2)

# 3)对文档进行整理成指定格式,方便后续的计算(词语1 词语2 ... 词语n)
data11 = ""
for item1 in data:
     data11 += item1 +" "
     print(item1)
data21 = ""
for item2 in data2:
     data21 += item2 +" "
     print(item2)
documents = [data11,data21]   #将文本存为列表

#4)计算出词语的频率  
texts = [[word for word in document.split()]
         for document in documents]
frequency = defaultdict(int)     #初始化字典(构建词典dictionary对象),即使键不存在也能返回一个int值
for text in texts:               #token键的频率
     for token in text:
          frequency[token] += 1

#5)过滤频率低的词语(词汇多的情况下使用)
texts = [[word for word in text if frequency[token]>3]
 for text in texts]

#6)通过语料库建立词典
dictionary = corpora.Dictionary(texts)
dictionary.save('F:\\anacondadaima\\shujuchuli\\wenben1.txt')#保存词典

#7)加载要对比的另一个文档
doc3 = 'F:\\anacondadaima\\shujuchuli\\d3.txt'
d3 = open(doc3,'r',encoding = 'utf-8').read()
data3 = jieba.cut(d3)
data31 = ""
for item in data3:
     data31 += item +" "
     print(item)
new_doc = data31
#8)转化为稀疏向量,9)再进一步处理得到新的语料库
new_vec = dictionary.doc2bow(new_doc.split())#转为稀疏向量
corpus = [dictionary.doc2bow(text) for text in texts]#建立新的语料库(稀疏向量)
corpora.MmCorpus.serialize('F:\\anacondadaima\\shujuchuli\\d3.mm',corpus)#保存语料库
#10)通过models将新语料库通过TF-IDF模型进行处理,得到TF-IDF
tfidf = models.TfidfModel(corpus)
#11)通过token2id得到特征数
featureNum = len(dictionary.token2id.keys())
#12)通过similarties得出稀疏矩阵相似度,从而建立索引
index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features = featureNum) #tfidf通过语料库corpus和特征数feature
sim = index[tfidf[new_vec]]  #通过索引计算相似性(结果是d3与d1的相似度为0.17(偏小),d3与d1的相似度为0.43(偏大))



 
 

猜你喜欢

转载自blog.csdn.net/weixin_41988628/article/details/80258575
今日推荐