本文实例讲述了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数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

python 拼音相似度_Python实现简单的文本相似度分析操作详解相关推荐

  1. python列表切片后得到剩余列表_python列表切片和嵌套列表取值操作详解

    python列表切片和嵌套列表取值操作详解 给出列表切片的格式: [开头元素::步长] # 输出直到最后一个元素,(最后一个冒号和步长可以省略,下同) [开头元素:结尾元素(不含):步长] # 其中, ...

  2. python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

  3. python抽奖滚动界面_Python使用Tkinter实现转盘抽奖器的步骤详解

    我使用 Python 中的 Tkinter 模块实现了一个简单的滚动抽奖器,接下来继续写一个简单的转盘抽奖器. 滚动抽奖器与点名的场景相似,是从一群人中抽出中奖的人,奖品是提前确定了的,抽奖只是确定中 ...

  4. python 录制web视频_Python django框架 web端视频加密的实例详解

    视频加密流程图: 后端获取保利威的视频播放授权token,提供接口api给前端 参考文档:http://dev.polyv.net/2019/videoproduct/v-api/v-api-play ...

  5. python类的命名空间_Python之关于类变量的两种赋值区别详解

    我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = ...

  6. python列表浅复制_Python列表的深复制和浅复制示例详解

    一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码: l1 = [5, 4, 3, 2, 1] # 用 ...

  7. python list 深复制_Python列表的深复制和浅复制示例详解

    免费资源网,https://freexyz.cn/ 一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码 ...

  8. python决策评价模型_Python大规模建模的特征值选择和性能评估方法详解

    大量的特征变量,很多的模型,模型也有很多参数,如何选择合适的特征.合适的模型和合适的模型参数,这对建模是很重要的,但也是很困难的.并且选择最优的方案,方法也是很多的,这里将其中一种方法尽量描述清楚: ...

  9. python中setup函数_Python包管理工具setuptools之setup函数参数详解

    ***对所学内容的简单汇总 在安装python依赖库时,我们使用pip install 或者python setup.py install. pip 会自己搜索适合的版本,python setup.p ...

最新文章

  1. SAP MM初阶之ERS功能展示
  2. c++中多线程传递参数原理分析
  3. 学习 lodash 源码整体架构,打造属于自己的函数式编程类库
  4. WannaCry病毒横行Windows,Mac用户不应幸灾乐祸!
  5. android action bar 风格,自定义ActionBar的风格
  6. IDEA : IDEA 打开使用内存监控
  7. Zabbix(二)通过API在zabbix系统中查看、删除及创建监控主机
  8. tcp_nodelay memcached java_spymemcached 的 useNagle 问题与 TCP/IP延迟发送数据
  9. JavaScript简单入门教程学习篇
  10. 计算机中单位换算tb,计算机中容量单位B、KB、MB、GB和TB的关系
  11. html5 判断手机横竖屏,移动端判断横竖屏的5种解决方案
  12. LibEvent中文帮助文档
  13. 永洪科技贺新颖:业务中台+数据中台,赋能企业核心业务
  14. Mybatis官方网站
  15. 人脸识别概述-opencv中文文档
  16. 预训练权重到底是个啥
  17. Linux操作系统渗透测试
  18. Illustrator CC 2019 Essential Training Illustrator CC 2019基础教程 Lynda课程中文字幕
  19. oracle 用Sqlplus连接的时候中文出现乱码“?胧淙胗没?”的解决方案
  20. 一键万能搜索框,这个chrome插件有点好用!

热门文章

  1. 网件R6400内网穿透最简单的实现方式
  2. 一文详解共模电感原理及选型
  3. 一缕烟香起 静中闻鸿蒙,三款新品香烟大爆料 到底是口粮烟还是外观党?
  4. Android:Android9.0使用 AndroidVideoCache时不能缓存播放视频的解决
  5. 周建华:弘扬雷锋精神 我的志愿服务2022
  6. Easydict 简洁易用的翻译词典,带你轻松优雅地查找单词或翻译文本。
  7. 商显市场谁主沉浮 液晶拼接屏独占鳌头
  8. 六轴EtherCAT总线伺服涂布收卷机程序,采用六个伺服+变频器+编码器,动态测量频率
  9. Codeforces Round #842 (Div. 2)-C. Elemental Decompress
  10. 【2022-1-21】Batchnorm