Python实现简单的文本相似度分析操作详解
本文实例讲述了Python实现简单的文本相似度分析操作。分享给大家供大家参考,具体如下:
学习目标:
1.利用gensim包分析文档相似度
2.使用jieba进行中文分词
3.了解TF-IDF模型
环境:
Python3.6.0|Anaconda4.3.1(64-bit)
工具:
jupyternotebook
注:为了简化问题,本文没有剔除停用词“stop-word”。实际应用中应该要剔除停用词。
首先引入分词API库jieba、文本相似度库gensim
importjieba fromgensimimportcorpora,models,similarities
以下doc0-doc7是几个最简单的文档,我们可以称之为目标文档,本文就是分析doc_test(测试文档)与以上8个文档的相似度。
doc0="我不喜欢上海"
doc1="上海是一个好地方"
doc2="北京是一个好地方"
doc3="上海好吃的在哪里"
doc4="上海好玩的在哪里"
doc5="上海是好地方"
doc6="上海路和上海人"
doc7="喜欢小吃"
doc_test="我喜欢上海的小吃"
分词
首先,为了简化操作,把目标文档放到一个列表all_doc中。
all_doc=[] all_doc.append(doc0) all_doc.append(doc1) all_doc.append(doc2) all_doc.append(doc3) all_doc.append(doc4) all_doc.append(doc5) all_doc.append(doc6) all_doc.append(doc7)
以下对目标文档进行分词,并且保存在列表all_doc_list中
all_doc_list=[] fordocinall_doc: doc_list=[wordforwordinjieba.cut(doc)] all_doc_list.append(doc_list)
把分词后形成的列表显示出来:
print(all_doc_list)
[['我','不','喜欢','上海'],
['上海','是','一个','好','地方'],
['北京','是','一个','好','地方'],
['上海','好吃','的','在','哪里'],
['上海','好玩','的','在','哪里'],
['上海','是','好','地方'],
['上海','路','和','上海','人'],
['喜欢','小吃']]
以下把测试文档也进行分词,并保存在列表doc_test_list中
doc_test_list=[wordforwordinjieba.cut(doc_test)] doc_test_list
['我','喜欢','上海','的','小吃']
制作语料库
首先用dictionary方法获取词袋(bag-of-words)
dictionary=corpora.Dictionary(all_doc_list)
词袋中用数字对所有词进行了编号
dictionary.keys()
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]
编号与词之间的对应关系
dictionary.token2id
{'一个':4,
'上海':0,
'不':1,
'人':14,
'北京':8,
'和':15,
'哪里':9,
'喜欢':2,
'在':10,
'地方':5,
'好':6,
'好吃':11,
'好玩':13,
'小吃':17,
'我':3,
'是':7,
'的':12,
'路':16}
以下使用doc2bow制作语料库
corpus=[dictionary.doc2bow(doc)fordocinall_doc_list]
语料库如下。语料库是一组向量,向量中的元素是一个二元组(编号、频次数),对应分词后的文档中的每一个词。
[[(0,1),(1,1),(2,1),(3,1)],
[(0,1),(4,1),(5,1),(6,1),(7,1)],
[(4,1),(5,1),(6,1),(7,1),(8,1)],
[(0,1),(9,1),(10,1),(11,1),(12,1)],
[(0,1),(9,1),(10,1),(12,1),(13,1)],
[(0,1),(5,1),(6,1),(7,1)],
[(0,2),(14,1),(15,1),(16,1)],
[(2,1),(17,1)]]
以下用同样的方法,把测试文档也转换为二元组的向量
doc_test_vec=dictionary.doc2bow(doc_test_list) doc_test_vec
[(0,1),(2,1),(3,1),(12,1),(17,1)]
相似度分析
使用TF-IDF模型对语料库建模
tfidf=models.TfidfModel(corpus)
获取测试文档中,每个词的TF-IDF值
tfidf[doc_test_vec]
[(0,0.08112725037593049),
(2,0.3909393754390612),
(3,0.5864090631585919),
(12,0.3909393754390612),
(17,0.5864090631585919)]
对每个目标文档,分析测试文档的相似度
index=similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=len(dictionary.keys())) sim=index[tfidf[doc_test_vec]] sim
array([0.54680777,0.01055349,0.,0.17724207,0.17724207,
0.01354522,0.01279765,0.70477605],dtype=float32)
根据相似度排序
sorted(enumerate(sim),key=lambdaitem:-item[1])
[(7,0.70477605),
(0,0.54680777),
(3,0.17724207),
(4,0.17724207),
(5,0.013545224),
(6,0.01279765),
(1,0.010553493),
(2,0.0)]
从分析结果来看,测试文档与doc7相似度最高,其次是doc0,与doc2的相似度为零。大家可以根据TF-IDF的原理,看看是否符合预期。
最后总结一下文本相似度分析的步骤:
1、读取文档
2、对要计算的多篇文档进行分词
3、对文档进行整理成指定格式,方便后续进行计算
4、计算出词语的词频
5、【可选】对词频低的词语进行过滤
6、建立语料库词典
7、加载要对比的文档
8、将要对比的文档通过doc2bow转化为词袋模型
9、对词袋模型进行进一步处理,得到新语料库
10、将新语料库通过tfidfmodel进行处理,得到tfidf
11、通过token2id得到特征数
12、稀疏矩阵相似度,从而建立索引
13、得到最终相似度结果
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。