主题模型Gensim入门系列之四:文本相似度查询

2024-08-24 01:48

本文主要是介绍主题模型Gensim入门系列之四:文本相似度查询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列目录:

(1)主题模型Gensim入门系列之一:核心概念

(2)主题模型Gensim入门系列之二:语料和向量空间

(3)主题模型Gensim入门系列之三:主题和变换

(4)主题模型Gensim入门系列之四:文本相似度查询

————————————————————————————

 

本文主要介绍如何从一个语料库中,查询一个指定文本的相似文本。

 

1、创建语料

创建语料和之前的三节相似,代码如下:

from collections import defaultdict
from gensim import corporadocuments = ["Human machine interface for lab abc computer applications","A survey of user opinion of computer system response time","The EPS user interface management system","System and human system engineering testing of EPS","Relation of user perceived response time to error measurement","The generation of random binary unordered trees","The intersection graph of paths in trees","Graph minors IV Widths of trees and well quasi ordering","Graph minors A survey",
]# remove common words and tokenize
stoplist = set('for a of the and to in'.split())
texts = [[word for word in document.lower().split() if word not in stoplist]for document in documents
]# remove words that appear only once
frequency = defaultdict(int)
for text in texts:for token in text:frequency[token] += 1texts = [[token for token in text if frequency[token] > 1]for text in texts
]dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

 

2、相似度接口

在02-Gensim系列之二:语料和向量空间和03-Gensim系列之三:主题和变换 中,介绍如何创建向量空间的语料,以及如何在不同的向量空间的转换。这是查询文档之间相似性的基础。

接下来通过上述的语料来说明如何实现相似度查询,以LSI模型为例:

from gensim import models
lsi = models.LsiModel(corpus, id2word=dictionary, num_topics=2)

在本示例中,不对LSI模型作详细解释,只对两点加以说明:(1)LSI为一个向量变换模型,它将文本从一个向量空间转换到另外一个向量空间。(2)LSI可以识别文本的模式和文本中单词之间的关系和主题。下面的LSI是一个2维向量空间,即包含2个主题,但是主题的数量是可以任意设置的。更多关于LSI模型的介绍可以参考:Latent Semantic Indexing:

现在,假设有一个用户输入一个查询 "Human computer interaction",则根据和查询的相似度,对原始语料中的9个文本进行排序。不像现在的搜索引擎,这里的相似度搜索仅仅为文本在概率上的相似性——没有语义上的、没有超链接等。

doc = "Human computer interaction"
vec_bow = dictionary.doc2bow(doc.lower().split())
vec_lsi = lsi[vec_bow]  # 将查询文本转换到LSI模型的向量空间
print(vec_lsi)# 输出
"""
[(0, 0.4618210045327158), (1, 0.07002766527900064)]
"""

另外,我们将考虑使用余弦距离来计算两个向量之间的相似度。余弦相似度是计算向量举例的一种常用方法,但是在向量表示概率分布的时候,使用 different similarity measures可能是更好的选择。

 

3、初始化查询结构

为了准备后续的查询,我们需要对用于查询的语料进行处理。在本样例中,9个文本均用于LSI模型的训练,此处将它们都转换到2-D的LSA向量空间。当然我们也可以用训练好的模型,将非训练集的样本进行转换。

from gensim import similarities
index = similarities.MatrixSimilarity(lsi[corpus])  # 将语料转换到LSI空间并建立索引

值得注意的是,similarities.MatrixSimilarity 类将把所有的向量导入内存,举例来说,一个100万规模的语料如果转换为256维的向量可能需要2GB的内存。如果不想消耗这么大的内存,可以使用 similarities.Similarity 类,这种方法只占用固定的内存(较小的内存),通过将语料文件切分成多个部分。这个类的内部使用 similarities.MatrixSimilarity 和 similarities.SparseMatrixSimilarity,所以这个方法仍然很快,但是稍微复杂一点。

建立的索引可以通过 save() 和 load() 两个方法进行保存和加载。

index.save("lsi_index.index")
index=similarities.MatrixSimilarity。load("lsi_index.index")

上述的保存和加载方法对所有的索引类都有效(包括similarities.Similarity,similarities.MatrixSimilarity和   similarities.SparseMatrixSimilarity)。如果出现异常,可以尝试使用 similarities.Similarity,它的兼容性最好,且支持增量索引。

 

4、进行查询

在将查询转换到LSI空间,且将原始语料转换到LSI空间并建立索引之后,就可以获取查询文本和语料中文本的相似度了,代码如下:

sims = index[vec_lsi]  # 获取查询文本和语料中文本的相似度
print(list(enumerate(sims)))  # 打印 (文本序号, 文本相似度) 2元元组#输出
"""
[(0, 0.998093), (1, 0.93748635), (2, 0.9984453), (3, 0.9865886), (4, 0.90755945), (5, -0.12416792), (6, -0.10639259), (7, -0.09879464), (8, 0.050041765)]"""

由于余弦举例在(-1,1)之间,因此查询文本和语料中的第一个文本的相似度得分为 0.99809301,对语料中的文本根据相似度进行排序:

sims = sorted(enumerate(sims), key=lambda item: -item[1])
for i, s in enumerate(sims):print(s, documents[i])# 输出
"""
(2, 0.9984453) Human machine interface for lab abc computer applications
(0, 0.998093) A survey of user opinion of computer system response time
(3, 0.9865886) The EPS user interface management system
(1, 0.93748635) System and human system engineering testing of EPS
(4, 0.90755945) Relation of user perceived response time to error measurement
(8, 0.050041765) The generation of random binary unordered trees
(7, -0.09879464) The intersection graph of paths in trees
(6, -0.10639259) Graph minors IV Widths of trees and well quasi ordering
(5, -0.12416792) Graph minors A survey
"""

值得注意的是,假如采用标准的全文搜索的话,第3个文档 "The EPS user interface management system" 和第4个文档”Relation of user perceived response time to error measurement“ 将不会返回,因为他们和查询文本"Human computer interaction"没有 任何相同的关键词,但是在使用了LSI之后,这两个文本和查询文本的相似度都非常高,这也比较符合我们的直觉。事实上,这也是我们为什么要采用主题模型并进行变换的原因。

 

翻译和编辑自:Similarity Queries

这篇关于主题模型Gensim入门系列之四:文本相似度查询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101104

相关文章

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

从入门到精通详解Python虚拟环境完全指南

《从入门到精通详解Python虚拟环境完全指南》Python虚拟环境是一个独立的Python运行环境,它允许你为不同的项目创建隔离的Python环境,下面小编就来和大家详细介绍一下吧... 目录什么是python虚拟环境一、使用venv创建和管理虚拟环境1.1 创建虚拟环境1.2 激活虚拟环境1.3 验证虚

Java实现复杂查询优化的7个技巧小结

《Java实现复杂查询优化的7个技巧小结》在Java项目中,复杂查询是开发者面临的“硬骨头”,本文将通过7个实战技巧,结合代码示例和性能对比,手把手教你如何让复杂查询变得优雅,大家可以根据需求进行选择... 目录一、复杂查询的痛点:为何你的代码“又臭又长”1.1冗余变量与中间状态1.2重复查询与性能陷阱1.

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

Java List 使用举例(从入门到精通)

《JavaList使用举例(从入门到精通)》本文系统讲解JavaList,涵盖基础概念、核心特性、常用实现(如ArrayList、LinkedList)及性能对比,介绍创建、操作、遍历方法,结合实... 目录一、List 基础概念1.1 什么是 List?1.2 List 的核心特性1.3 List 家族成

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员