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解析JSON数据的基本方法
Oct 15 Python
python高手之路python处理excel文件(方法汇总)
Jan 07 Python
Python字符串切片操作知识详解
Mar 28 Python
Python环境下搭建属于自己的pip源的教程
May 05 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
python的pdb调试命令的命令整理及实例
Jul 12 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
使用Python OpenCV为CNN增加图像样本的实现
Jun 10 Python
pycharm新建一个python工程步骤
Jul 16 Python
python3实现elasticsearch批量更新数据
Dec 03 Python
python 使用cx-freeze打包程序的实现
Mar 14 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Jun 03 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 adodb分页实现代码
2009/03/19 PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
基于php-fpm的配置详解
2013/06/03 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
让您的菜单不离网站
2006/10/03 Javascript
top.location.href 没有权限 解决方法
2008/08/05 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
JavaScript中关键字 in 的使用方法详解
2016/10/17 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
使用webpack构建应用的方法步骤
2019/03/04 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
python实现带验证码网站的自动登陆实现代码
2015/01/12 Python
Django1.7+python 2.78+pycharm配置mysql数据库
2016/10/09 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
详解python中的生成器、迭代器、闭包、装饰器
2019/08/22 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
台湾良兴购物网:EcLife
2019/12/01 全球购物
教师党性分析材料
2014/02/04 职场文书
小学信息技术教学反思
2014/02/10 职场文书
国贸专业自荐信范文
2014/03/02 职场文书
租房协议书范文
2014/08/20 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
课程设计的心得体会
2014/09/03 职场文书
2014年个人师德工作总结
2014/12/04 职场文书
尊师重教主题班会
2015/08/14 职场文书
PostgreSQL事务回卷实战案例详析
2022/03/25 PostgreSQL