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中由于logging模块误用导致的内存泄露
Apr 23 Python
python爬虫爬取网页表格数据
Mar 07 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
python将list转为matrix的方法
Dec 12 Python
Python OpenCV对本地视频文件进行分帧保存的实例
Jan 08 Python
Python3中urlencode和urldecode的用法详解
Jul 23 Python
Python函数参数类型及排序原理总结
Dec 19 Python
将python包发布到PyPI和制作whl文件方式
Dec 25 Python
Python双链表原理与实现方法详解
Feb 22 Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 Python
python如何快速拼接字符串
Oct 28 Python
python小技巧——将变量保存在本地及读取
Nov 13 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
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
php实现两表合并成新表并且有序排列的方法
2014/12/05 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
详谈symfony window下的安装 安装时候出现的问题以及解决方法
2017/09/28 PHP
javascript 写类方式之五
2009/07/05 Javascript
让FireFox支持innerText的实现代码
2009/12/01 Javascript
javascript 控制input只允许输入的各种指定内容
2014/06/19 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
Bootstrap Table的使用总结
2016/10/08 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
Python中的filter()函数的用法
2015/04/27 Python
python将字符串转换成数组的方法
2015/04/29 Python
Python3 模块、包调用&路径详解
2017/10/25 Python
python画折线图的程序
2018/07/26 Python
详解Python中的内建函数,可迭代对象,迭代器
2019/04/29 Python
sklearn+python:线性回归案例
2020/02/24 Python
PyQt5+Pycharm安装和配置图文教程详解
2020/03/24 Python
浅谈Python3多线程之间的执行顺序问题
2020/05/02 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
ASOS西班牙官网:英国在线时尚和美容零售商
2020/01/10 全球购物
中医药大学市场营销专业自荐信
2013/09/29 职场文书
商场促销活动策划方案
2014/08/18 职场文书
党委书记群众路线对照检查材料思想汇报
2014/10/04 职场文书
廉政承诺书
2015/01/19 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
2016教师廉洁从教心得体会
2016/01/13 职场文书
logback如何自定义日志存储
2021/08/30 Java/Android
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python