简易版计算文本相似度

我简单地计算《后宫甄嬛传》和《冷月如霜》的文本相似度,还有《后宫甄嬛传》和《寂寞空庭春欲晚》的文本相似度,并没有去掉标点符号,停用词等。

使用了TF-IDF,TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。这是百度查到的解释。另外,dictionary.doc2bow方法是把文档变成一个稀疏向量。稀疏向量既可以用Id+频数,也可以用indices和values表示。

最后的结果:


步骤:1、读取要计算的文档

2、进行分词

3、对文档进行整理成["词语","",......,""]

4、计算各个词的频率

5、对于数据量很大,过滤掉出现低频次的词

6、建立词典通过新的语料库

7、加载要进行对比的文档,重复2、3步

8、将要对比的文档转成稀疏向量

9、依据稀疏向量得到新的语料库

10、对新的语料库进行TFIDF模型的计算,得到TFIDF的值

11、依据语料库,特征数建立索引

12、依据索引得到最终的相似度

from gensim import corpora, models, similarities
import jieba
import urllib.request
from collections import defaultdict

doc1 = "D:/xx/xx/lengyueru.txt"
doc2 = "D:/xx/xx/jimochun.txt"
d1 = open(doc1,'r',encoding='utf-8').read()
d2 = open(doc2,'r',encoding='utf-8').read()

data1 = jieba.cut(d1)
data2 = jieba.cut(d2)


'''
for item in data1:
    print(item)
for item in data2:
    print(item)
'''

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]
#split()默认以空格分开
#这个是循环嵌套,外层循环从右往左读,内层循环从后往前读,就是在遍历documents中,依次遍历document,得到的值赋给word
frequency = defaultdict(int)
#建立一个类似于字典的对象,其中values都是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("D:/xx/xx/cidian.txt")
doc3 = "D:/xx/xx/hougongzhenhuan.txt"
d3 = open(doc3,'r',encoding='utf-8').read()

#进行分词整理成["","",......,""]
data3 = jieba.cut(d3)

data31 = " "


for item in data3:
    data31 += item + " "

newdoc = data31
newvec =dictionary.doc2bow(newdoc.split())
corpus = [
    dictionary.doc2bow(text) for text in texts]

#corpora.MmCorpus.serialize("D:/xx/xx/d3.mm",corpus)


tfidf =models.TfidfModel(corpus)
#得到特征数通过token2id
featurenum = len(dictionary.token2id.keys())
#依据语料库,特征数计算稀疏矩阵的相似度,从而建立索引
index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=featurenum)
sim = index[tfidf[newvec]]

print(sim)

阅读更多
文章标签: 文本相似度
上一篇KNN分类算法代码
下一篇UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭