Python实现简单的文本相似度分析操作详解

 更新时间:2018年06月16日 11:15:39   作者:番番要吃肉  
这篇文章主要介绍了Python实现简单的文本相似度分析操作,结合实例形式分析了Python基于分词API库jieba及文本相似度库gensim针对文本进行相似度分析操作的实现技巧与注意事项,需要的朋友可以参考下

本文实例讲述了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中查看文件名和文件路径

    本篇文章主要介绍了Python中查看文件名和文件路径的方法。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-03-03
  • wxpython中利用线程防止假死的实现方法

    wxpython中利用线程防止假死的实现方法

    上午抽空学习了一下在wxpython中启用线程的方法,将GUI和功能的执行分开,果然程序运行起来杠杠滴。因为我那个软件的代码暂时不能公开,这里专门写个小程序,作为今天的笔记吧
    2014-08-08
  • python的运算符与表达式你真的了解吗

    python的运算符与表达式你真的了解吗

    这篇文章主要为大家介绍了python的运算符与表达式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Pandas||过滤缺失数据||pd.dropna()函数的用法说明

    Pandas||过滤缺失数据||pd.dropna()函数的用法说明

    这篇文章主要介绍了Pandas||过滤缺失数据||pd.dropna()函数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片

    TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片

    今天小编就为大家分享一篇关于TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 教你使用Psycopg2连接openGauss的方法

    教你使用Psycopg2连接openGauss的方法

    Psycopg是一种用于执行SQL语句的PythonAPI,可以为PostgreSQL、openGauss数据库提供统一访问接口,应用程序可基于它进行数据操作,这篇文章主要介绍了教你使用Psycopg2连接openGauss的方法,需要的朋友可以参考下
    2022-11-11
  • 使用python模块plotdigitizer抠取论文图片中的数据实例详解

    使用python模块plotdigitizer抠取论文图片中的数据实例详解

    这篇文章主要介绍了使用python模块plotdigitizer抠取论文图片中的数据,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Python类和对象的定义与实际应用案例分析

    Python类和对象的定义与实际应用案例分析

    这篇文章主要介绍了Python类和对象的定义与实际应用,结合三个具体案例形式分析了Python面向对象程序设计中类与对象的定义、应用、设计模式等相关操作技巧,需要的朋友可以参考下
    2018-12-12
  • Python利用pandas和matplotlib实现绘制圆环图

    Python利用pandas和matplotlib实现绘制圆环图

    在可视化的过程中,圆环图是一种常用的方式,特别适合于展示各类别占比情况,本文将介绍如何使用 Python中的 pandas 和 matplotlib 库,来制作一个店铺销量占比的圆环图,需要的可以参考下
    2023-11-11
  • python基础教程之五种数据类型详解

    python基础教程之五种数据类型详解

    这篇文章主要介绍了python基础教程之五种数据类型详解的相关资料,这里对Python 的数据类型进行了详细介绍,需要的朋友可以参考下
    2017-01-01

最新评论