Python数据挖掘学习笔记(2)文本相似度分析

        关于使用Python进行文本相似度分析,网上的相关博客已经非常多了,因此本文仅进行简单的讲解,直接上代码,方便不想过多理解概念即要实现文本相似度分析的网友使用。

一、相关理论:

语料库的定义:https://baike.baidu.com/item/语料库/11029908?fr=aladdin

稀疏向量的定义:https://baike.baidu.com/item/稀疏向量

TF-IDF算法:可参考https://baike.baidu.com/item/tf-idf/8816134?fr=aladdin

二、文本相似度分析的流程:

1、读取文本数据1(文本数据1可以是多个
2、对文本数据1进行分词
3、将文本数据1整理成指定格式,方便后续进行计算
4、计算各分词的频率
5、对频率低的词语进行过滤。
6、通过语料库建立词典。
7、加载要进行对比的文本数据2。
8、将要对比的文本数据2通过doc2bow转化为稀疏向量。
9、对稀疏向量进行进一步处理,得到新的语料库。
10、将新语料库通过tfidfmodel进行处理,得到tfidf。
11、通过token2id得到特征数。
12、计算稀疏矩阵相似度,从而建立索引。
13、计算最终的相似度结果。

三、代码及详细解析:

#语料库、模型、相似度
from gensim import corpora,models,similarities
#结巴分词
import jieba
#defaultdict:用于数据过滤的词典
from collections import defaultdict

#doc1、doc2代表了流程中的文本数据1
doc1="D:d1.txt"
doc2="D:d2.txt"

#读取文本数据1
d1=open(doc1).read()
d2=open(doc2).read()

#对文本数据1进行分词
data1=jieba.cut(d1)
data2=jieba.cut(d2)

#将文本数据1整理成指定格式,方便后续进行计算
#格式:"词语1 词语2 词语3 … 词语n"
data11=""
for item in data1:
    data11+=item+" "
data21=""
for item in data2:
    data21+=item+" "

#将两个文本数据1的词语集放在一个列表中
documents=[data11,data21]

#将两个文本数据1的每个词语提取出来存放在一个texts中
texts=[[word for word in document.split()]
       for document in documents]      
#texts格式:[[doc1的每个分词词语],[doc2的每个分词词语]]

#计算各分词的频率
frequency=defaultdict(int)
for text in texts:
    for token in text:
        frequency[token]+=1

#过滤掉词频较低(小于3)的词语
texts=[[word for word in text if frequency[word]>3]
 for text in texts]

#通过语料库建立词典
dictionary=corpora.Dictionary(texts)

#保存词典(可选)
dictionary.save("D:/dictionary.txt")

#加载用于对比的文本数据2
doc3="D:/d3.txt"
d3=open(doc3).read()

#同样需进行分词
data3=jieba.cut(d3)
#同样要整理格式
data31=""
for item in data3:
    data31+=item+" "

#将要对比的文本数据2通过doc2bow转化为稀疏向量。
new_doc=data31
new_vec=dictionary.doc2bow(new_doc.split())

#对稀疏向量进行进一步处理,得到新的语料库
corpus=[dictionary.doc2bow(text) for text in texts]

#保存语料库(可选)
corpora.MmCorpus.serialize("D:/yuliaoku.txt",corpus)

#将新语料库通过tfidfmodel进行处理,得到tf-idf模型
tfidf=models.TfidfModel(corpus)

#通过token2id得到特征数
featureNum=len(dictionary.token2id.keys())

#计算稀疏矩阵相似度,从而建立索引
index=similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featureNum)

#计算最终的相似度结果并输出
sim=index[tfidf[new_vec]]
print(sim)

     输出的结果:[文本数据1各个文档的相似度],本例为[0.24568865,0.39459877],代表了doc3与doc1,doc3与doc2的相似度。 若只需计算两个文档的文本相似度,去掉本文的doc2的相关内容即可。

你可能感兴趣的:(Python)