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中使用strip()方法删除字符串中空格的教程
May 20 Python
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
Python中定时任务框架APScheduler的快速入门指南
Jul 06 Python
python遍历小写英文字母的方法
Jan 02 Python
机器学习实战之knn算法pandas
Jun 22 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
python-sys.stdout作为默认函数参数的实现
Feb 21 Python
python numpy--数组的组合和分割实例
Feb 24 Python
在python3中使用shuffle函数要注意的地方
Feb 28 Python
如何基于Python爬取隐秘的角落评论
Jul 02 Python
python爬虫请求头设置代码
Jul 28 Python
一篇文章教你用python画动态爱心表白
Nov 22 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 中的类
2006/10/09 PHP
生成sessionid和随机密码的例子
2006/10/09 PHP
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
php实现rc4加密算法代码
2012/04/25 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
Js四则运算函数代码
2012/07/21 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
原生ajax处理json格式数据的实例代码
2016/12/25 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
javascript与PHP动态往类中添加方法对比
2018/03/21 Javascript
js实现GIF图片的分解和合成
2019/10/24 Javascript
详解vue高级特性
2020/06/09 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
在Python中利用Pandas库处理大数据的简单介绍
2015/04/07 Python
Python类属性与实例属性用法分析
2015/05/09 Python
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
Python常用的爬虫技巧总结
2016/03/28 Python
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
简单了解django缓存方式及配置
2019/07/19 Python
Python通过TensorFLow进行线性模型训练原理与实现方法详解
2020/01/15 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
Wiggle美国:英国骑行、跑步、游泳、铁人三项商店
2018/10/27 全球购物
销售辞职报告范文
2014/01/12 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
2014年党员整改措施
2014/10/24 职场文书
通报表扬范文
2015/01/17 职场文书
财务会计岗位职责
2015/02/03 职场文书
客户经理岗位职责大全
2015/04/09 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
纪检部部长竞选稿
2015/11/21 职场文书
python munch库的使用解析
2021/05/25 Python
java设计模式--原型模式详解
2021/07/21 Java/Android