Python实现简单的文本相似度分析操作详解


Posted in Python onJune 16, 2018

本文实例讲述了Python实现简单的文本相似度分析操作。分享给大家供大家参考,具体如下:

学习目标:

1.利用gensim包分析文档相似度
2.使用jieba进行中文分词
3.了解TF-IDF模型

环境:

Python 3.6.0 |Anaconda 4.3.1 (64-bit)

工具:

jupyter notebook

注:为了简化问题,本文没有剔除停用词“stop-word”。实际应用中应该要剔除停用词。

首先引入分词API库jieba、文本相似度库gensim

import jieba
from gensim import corpora,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 = []
for doc in all_doc:
  doc_list = [word for word in jieba.cut(doc)]
  all_doc_list.append(doc_list)

把分词后形成的列表显示出来:

print(all_doc_list)

[['我', '不', '喜欢', '上海'],
['上海', '是', '一个', '好', '地方'],
['北京', '是', '一个', '好', '地方'],
['上海', '好吃', '的', '在', '哪里'],
['上海', '好玩', '的', '在', '哪里'],
['上海', '是', '好', '地方'],
['上海', '路', '和', '上海', '人'],
['喜欢', '小吃']]

以下把测试文档也进行分词,并保存在列表doc_test_list中

doc_test_list = [word for word in jieba.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) for doc in all_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=lambda item: -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 除法小技巧
Sep 06 Python
Python操作sqlite3快速、安全插入数据(防注入)的实例
Apr 26 Python
使用Python读写及压缩和解压缩文件的示例
Jul 08 Python
一个基于flask的web应用诞生(1)
Apr 11 Python
python中利用zfill方法自动给数字前面补0
Apr 10 Python
python操作excel的方法
Aug 16 Python
Python Selenium 之关闭窗口close与quit的方法
Feb 13 Python
python 用所有标点符号分隔句子的示例
Jul 15 Python
简单分析python的类变量、实例变量
Aug 23 Python
Python 中list ,set,dict的大规模查找效率对比详解
Oct 11 Python
PyQt5 控件字体样式等设置的实现
May 13 Python
Python操作Word批量生成合同的实现示例
Aug 28 Python
Django跨域请求问题的解决方法示例
Jun 16 #Python
Python for循环生成列表的实例
Jun 15 #Python
Python把csv数据写入list和字典类型的变量脚本方法
Jun 15 #Python
Python对象属性自动更新操作示例
Jun 15 #Python
numpy使用fromstring创建矩阵的实例
Jun 15 #Python
详解Python 协程的详细用法使用和例子
Jun 15 #Python
在NumPy中创建空数组/矩阵的方法
Jun 15 #Python
You might like
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
php中session与cookie的比较
2015/01/27 PHP
HTML中嵌入PHP的简单方法
2016/02/16 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
学习ExtJS accordion布局
2009/10/08 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
jquery数组过滤筛选方法grep()简介
2014/06/06 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
微信JS接口大全
2016/08/25 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
2016/11/16 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
Vue插件之滑动验证码
2019/09/21 Javascript
通过实例解析jQ Ajax操作相关原理
2020/09/23 Javascript
Python中每次处理一个字符的5种方法
2015/05/21 Python
python使用thrift教程的方法示例
2019/03/21 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
Python print不能立即打印的解决方式
2020/02/19 Python
Django rest framework分页接口实现原理解析
2020/08/21 Python
python使用ctypes库调用DLL动态链接库
2020/10/22 Python
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
大学生涯自我鉴定
2014/01/16 职场文书
团支书竞选演讲稿
2014/04/28 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
小学家长意见怎么写
2015/06/03 职场文书
python操作xlsx格式文件并读取
2021/06/02 Python
Django使用echarts进行可视化展示的实践
2021/06/10 Python
Python 快速验证代理IP是否有效的方法实现
2021/07/15 Python
python 判断文件或文件夹是否存在
2022/03/18 Python