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脚本来控制Windows Azure的简单教程
Apr 16 Python
Python的Django框架中settings文件的部署建议
May 30 Python
菜鸟使用python实现正则检测密码合法性
Jan 05 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
python编写朴素贝叶斯用于文本分类
Dec 21 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
python实现类之间的方法互相调用
Apr 29 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
Python 实现两个列表里元素对应相乘的方法
Nov 14 Python
Python 图像处理: 生成二维高斯分布蒙版的实例
Jul 04 Python
在Python中os.fork()产生子进程的例子
Aug 08 Python
python dumps和loads区别详解
Feb 04 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格式化工具Beautify PHP小小BUG
2008/04/24 PHP
php include和require的区别深入解析
2013/06/17 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
Laravel框架表单验证详解
2014/09/04 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
javascript中关于执行环境的杂谈
2011/08/14 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
js常用DOM方法详解
2017/02/04 Javascript
jquery实现图片平滑滚动详解
2017/03/22 jQuery
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
vue-cli 3.x 修改dist路径的方法
2018/09/19 Javascript
详解vue中使用protobuf踩坑记
2019/05/07 Javascript
RxJS的入门指引和初步应用
2019/06/15 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
python验证码识别的实例详解
2016/09/09 Python
用python实现百度翻译的示例代码
2018/03/09 Python
对pandas的行列名更改与数据选择详解
2018/11/12 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
Python学习之路安装pycharm的教程详解
2020/06/17 Python
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
西班牙在线宠物食品和配件商店:bitiba
2019/10/11 全球购物
大学应届毕业生个人求职信
2013/09/23 职场文书
测试工程师岗位职责
2013/11/28 职场文书
酒吧创业计划书
2014/01/18 职场文书
公司总经理工作职责管理办法
2014/02/28 职场文书
团队精神的演讲稿
2014/05/14 职场文书
健康状况证明模板
2014/10/23 职场文书
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python