文本相似度分析

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中实现,可以实现简单文本相似度的计算。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值