主题模型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

相关文章

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

C#TextBox设置提示文本方式(SetHintText)

《C#TextBox设置提示文本方式(SetHintText)》:本文主要介绍C#TextBox设置提示文本方式(SetHintText),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录C#TextBox设置提示文本效果展示核心代码总结C#TextBox设置提示文本效果展示核心代

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis