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基于Tkinter实现的记事本实例
Jun 17 Python
Python 制作糗事百科爬虫实例
Sep 22 Python
Django框架model模型对象验证实现方法分析
Oct 02 Python
python实现根据文件格式分类
Oct 31 Python
基于python的docx模块处理word和WPS的docx格式文件方式
Feb 13 Python
python with语句的原理与用法详解
Mar 30 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
pandas分批读取大数据集教程
Jun 06 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 Python
Pycharm 如何一键加引号的方法步骤
Feb 05 Python
Numpy ndarray 多维数组对象的使用
Feb 10 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
2021年最新CPU天梯图
2021/03/04 数码科技
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
PHP 等比例缩放图片详解及实例代码
2016/09/18 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
php关联数组与索引数组及其显示方法
2018/03/12 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
JavaScript声明变量名的语法规则
2015/07/10 Javascript
基于jquery animate操作css样式属性小结
2015/11/27 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
2017/05/03 Javascript
JS获取字符对应的ASCII码实例
2017/09/10 Javascript
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
微信小程序用户位置权限的获取方法(拒绝后提醒)
2018/11/15 Javascript
python使用opencv读取图片的实例
2017/08/17 Python
python实现遍历文件夹修改文件后缀
2018/08/28 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
python 链接sqlserver 写接口实例
2020/03/11 Python
IE矩阵Matrix滤镜旋转与缩放及如何结合transform
2012/11/29 HTML / CSS
应届生人事助理求职信
2013/11/09 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
事业单位分类改革实施方案
2014/03/21 职场文书
毕业晚会主持词
2014/03/24 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
教师个人事迹材料
2014/12/17 职场文书
个人承诺书格式范文
2015/04/29 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书
社区志愿者服务心得体会
2016/01/22 职场文书