数据挖掘之比较两个文本的相似度

一、文本相似度分析


我们这里想看一下某篇论文是否抄袭了别人的论文,就可以通过两篇论文的相似度来分析一下。看看两篇文章的相似度是多少。
这里写图片描述
言归正传,想分析什么还是交给你们吧,我们这里演示一下遮天这本小说的第三章和第一章、第二章的相似度是多少。需要用到下面的模块:

  1. jieba分词:不会jieba的朋友可以看看我的另一篇文章 https://blog.csdn.net/weixin_42898819/article/details/81476851#0-qzone-1-75431-d020d2d2a4e8d1a374a433f596ad1440
  2. gensim下的corpora,models,similarities分别代表语料库方法,模型方法,相似度方法
  3. collections下的defaultdict 来计算单词频率

二、TF-IDF算法


1.简介:
TF-IDF是一种统计方法,用以评估字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。
2.原理:
TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。具体的说明请自己看原理https://baike.so.com/doc/433640-459181.html
3.在python中该算法封装在gensim中,所以我们只要大概了解它的原理,学会如何使用即可。

三、相似度分析步骤及其代码


好啦,下面我通过具体的步骤来讲解每一个步骤要用到的东西:

1.读取文档 :读取遮天小说的 第一章和第二章进来.

import jieba
from  gensim import corpora,models,similarities #语料库方法,模型方法,相似度方法
from collections import defaultdict #计算单词频率
#1.读取文档
doc1='C:/Users/dell/Desktop/python练习/data fenxi/wenben1.txt' #第一个文档
doc2='C:/Users/dell/Desktop/python练习/data fenxi/wenben2.txt' #第二个文档
d1=open(doc1,encoding='utf-8').read()
d2=open(doc2,encoding='utf-8').read()

将打开的第一章、第二章文件赋给d1,d2.

2.对文档进行分词

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

采用默认的精准模式分词.

3.整理分词后的文档,整理成这样 >>>>’ 词语1空格 词语2 空格 词语3空格 ….空格 词语n’

data11=''  #定义空字符串,用来放置整理后的词语
for item in data1:  #遍历data1 在每个词语后面加一个空格
    data11+=item+' '
data22=''
for item in data2:
    data22+=item+' '
print('data22:',data22)

打印看一下是否满足我们的需求:
这里写图片描述
我们发现确是在分词的后面都加上了空格,接下来我们把里面的词提取出来,并整理成列表格式,方便后续遍历。

documents=[data11,data22]  #得到的赋给documents
#提取里面的单词出来,整理为列表格式
texts=[[word for word in documents.split()] for documents in documents ]
print('texts:',texts)

我们看一下打印出来的信息:
这里写图片描述
4.计算词语的频率,对词语整理

frequency=defaultdict(int)#用defaultdict(上面导入的,用来计算词频)创建一个变量 
for text in texts: #遍历texts,因为texts有两层,所以两层循环
    for token in text:
        #词语出现一次就+1
        frequency[token]+=1
print(frequency)

看一下结果:
这里写图片描述
可以发现texts中的词语都统计出在这一章中出现的频次。
5.通过语料库建立词典

dictionary=corpora.Dictionary(texts)
dictionary.save('C:/Users/dell/Desktop/python练习/data fenxi/yuliaoku.txt') #保存语料库

6.加载要对比的文档,遮天第三章

doc3='C:/Users/dell/Desktop/python练习/data fenxi/wenben3.txt' #要对比的文档
d3=open(doc3,encoding='utf-8').read()
data3=jieba.cut(d3)
data33=''
for item in data3:
    data33+=item+' '
new_doc=data33  #将处理完的文档赋给new_doc

7.将要对比的文档通过doc2bow转化为稀疏向量

new_vec=dictionary.doc2bow(new_doc.split())

稀疏向量:https://baike.so.com/doc/7005197-7228079.html
8.对稀疏向量进一步处理,得到新语料库

corpus=[dictionary.doc2bow(text) for text in texts]

9.通过tf-idf模型处理新语料库,得到tfidf值

tfidf=models.TfidfModel(corpus)

10.通过token2id得到特征数(字典里面的键的个数)

feature_Num=len(dictionary.token2id.keys())

11.计算稀疏矩阵相似度,建立一个索引

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

12.根据索引得到最终的相似度

sim=index[tfidf[new_vec]]  #通过tfidf和要对比的文本的稀疏向量计算相似度
print('相似度:',sim)

看一下最后计算出来的相似度,可以发现第三章和第一章的相似度有0.1524,第三章跟第二章的相似度有0.7261。这样就完成了文本的相似度分析。
这里写图片描述
想要源代码的可以在下方留言,谢谢支持。

猜你喜欢

转载自blog.csdn.net/weixin_42898819/article/details/81532513