分享好友 最新动态首页 最新动态分类 切换频道
6.文档相似度分析
2024-12-27 00:25

将尝试分析文档之间的相似度指出。到目前为止,相比已经知道了文档的定义是可以由句子或文本段落组成的文本体。为了分析文档相似度,将使用 utils 模块的 build_feature_matrix() 函数从文档中提取特征。将使用文档的 TF-IDF 相似度对文档进行向量化,在之前的分类文本文档和归纳整个文档时曾使用过该方法。有了各种文档的向量表示之后,将使用几个距离或相似度度量来计算文档之间的相似度。如下度量:

6.文档相似度分析

  • 余弦相似度。
  • 海灵格-巴塔恰亚(Helinger-Bhattacharya)距离。
  • Okapi BM25 排名。

像以往一样,将介绍每个度量背后的概念,其属性表达形式和定义,然后使用 Python 实现它们。还将使用一个包含九个文档的小语料库和一个包含三个文档(也是查询文档)的独立语料库进行测试。对于这三个文档中的每一个,都将尝试从包含九个文档的语料库中找出最相似的文档,小语料库将作为查询索引。可以把这一过程想象成对搜索过程的一个微型模型——当你使用句子进行搜索时,最相关的结果将从搜索引擎的网页索引中返回给你。在用例中,待索引的内容是三个文档,将根据相似度度量返回九个文档中相关文档的索引。

接下来,从加载必要的依赖关系和用来测试各种度量指标的文档语料库开始着手,如下面的代码段所示:

从该代码段可以看出,在语料库索引中有各种各样的文档,设计天空、程序语言和动物。此外,还有三个查询文档,希望根据相似度计算从 toy_corpus 索引中获取与其最相关的文档。在开始介绍度量之前,首先要规范化文档并通过提取 TF-IDF 特征将其向量化,如下代码段所示:

现在,已经完成了文档规范化并使用基于 TF-IDF 的向量表示方式实现了文档向量化,接下来将研究如何计算每个向量的相似度值。

继续使用相同的概念来计算文档的余弦相似度得分,采用基于词袋模型的文档向量,并用 TF-IDF 数值替换词频。在这里,同样只采用一元分词形式,但是也可以在向量化过程中尝试采用二元分词等方式,并将其作为文档特征。对于三个查询文档中的每一个,都将使用 toy_corpus 中的纠葛文档计算其相似度,并返回 n 个最相似的文档,其中 n 为用户输入参数。

将定义一个函数,它的输入是向量化的语料库和需要计算相似度的文档语料库。使用点积运算获得相似度得分,并以倒序的方式对文档进行排序,以获得相似度最高的 n 个文档。下面的函数实现了上述功能:

在该函数中,corpus_features 是位于 toy_corpus 索引中的向量化文档。这些文件将根据与 doc_features 的相似度得分进行抓取,doc_features 代表了属于每个 query_doc 的向量化文档,如下代码段所示:

结果:

由于余弦相似度得分,上面的输出给出了与每个查询文档最相关的两个文档,可以看到输出是符合预期的。关于动物的文档与提及狐狸与狗的文档相似;关于 Python 和 Java 的文档与乞讨这两种程序语言的查询文档相似;美丽的蓝天也确实类似于谈论填空是蓝色而美丽的文档!

还要注意前面输出中的余弦相似度得分,其中 1.0 表示完全相似,0.0 表示不相似,它们之间的分数表示不同的相似度水平(基于得分多少)。例如,最后一个例子中,主要文档向量是['sky','blue','beautiful'], 因为它们都与语料库中的第一个文档匹配,所以获得了 1.0 或 100% 的相似度得分,只有 ['sky', 'blue'] 与第二个最相似的文档匹配,因为得到了 0.70 或 70% 的相似度得分。应该还记得前面的内容里,简单的提及了余弦相似度使用基于词袋的向量,仅仅考虑标识的权重,而不考虑词项的顺序。这在大型文档中是非常可取的,因为相同的内容可能会以不同的方式描绘,所以捕获词语序列可能会导致信息丢失,从而导致不希望看到的误匹配。

建议使用 cikit-learn 的 cosine_similarity() 函数,可以在 sklearn.metrics.pairwise 模块中找到它。它使用类似的逻辑实现以上功能,但是相比之下性能更优,并在大型文档上表现良好。还可以直接使用 gensim.matutils 模块中提供的 gensim 相似度(similarities) 模块或 cossim() 函数。

海灵格-巴塔恰亚(Hellinger-Bhattacharya)距离(HB距离)也称为海灵格距离或巴塔恰亚距离。巴塔恰亚距离有巴塔恰亚(A. Bhattacharya)提取,用于测量两个离散或连续概率分布之间的相似度。海灵格(E. Hellinger)在 1909 年提出了海灵格积分,用于计算海灵格距离。总的来说,海灵格-巴塔恰亚距离是一个 f 散度(f-divergence),f 散度在概率论中定义为函数 Dƒ(P||D),可用于测量 P 和 Q 概率分布之间的差异。有多种 f 散度的实例,包括 KL 散度和 HB 距离。请记住,KL 散度不是一个距离度量,因为它不符合将距离测量值作为度量所需的四个条件。

对于连续和离散的概率分布,均可以计算 HB 距离。在例子中,将会使用基于 TF-IDF 的向量作为文档的概率分布。该分布为离散分布,因为对于特定的特征项有特定的 TF-IDF 值,即数值不连续。海灵格-巴塔恰亚距离的数学定义为:

其中 hdb(u,v) 表示文档向量 u 和 v 之间的海灵格-巴塔恰亚距离,并且它等于向量的平方根差的欧几里得或 L2 范数除以 2 的平方根。考虑到文档向量 u 和 v 是具有 n 个特征的离散量,可以进一步扩展上式为:

其中 u = (u1,u2,...,un) 和 v = (v1,v2,...,vn) 的长度为 n 的文档向量,n 表示有 n 个特征,它们是文档中各类词项的 TF-IDF 权重。与前面的余弦相似度计算类似,以相同的原理建立函数;会将文档向量语料库和单个文档向量作为输入,这些单个文档向量正是我们希望基于 HB 距离从语料库获取 n 个最相似文档的文档向量。如下函数使用 Python 语言实现了上述概念:

从上述实现过程中可以看出,按照得分对文档进行升序排列,因为与余弦相似度不同(其中 1.0 表示完全相似),这里是分布之间的距离度量,得分为 0 表示完全相似,而较高的数值则表示存在一些不相似之处。现在可以将此函数应用于示例语料库计算 HB 距离,可以在如下代码段中看到结果:

结果:

上述输出可以看出,具有较低 HB 距离得分的文档与查询文档更为相似,输出文档结果与使用余弦相似度获得的输出非常相似。请比较结果,并使用更大的语料库验证这些函数!在构建大型的相似度分析系统时,推荐使用在 gensim.matutils 模块(它的逻辑与前述函数相同)中的 hellinger() 函数。

目前,在信息索引和搜索引擎领域中,有几种非常受欢迎的技术,包括 pageRank 和 Okapi BM25 ,缩写词 BM 代表 最佳匹配。这种技术也称为 BM25,但是为了完整起见,将其称为 Okapi BM25,因为最初 BM25 函数的概念只存在于理论上,伦敦城市大学在 20 世纪 80 年代至 90 年代建立了 Okapi 信息检索系统,才真正实现了这种技术,并用来监测现实世界里真实的文件数据。这种技术也称为基于概率相关性的框架或模型,并由 20 世纪 70 年代至 80 年代由记为科学家提出,包括计算机科学家 S • 罗伯森(S. Robertson) 和 K • 琼斯(K. Jones)。有一些函数可以根据不同的因素对文档进行排名,BM25 是其中之一,其较新的变体是 BM25F,其他变体包括 BM15 和 BM25+。

Okapi BM25 的正式定义是采用一个基于词袋的模型,根据用户输入检索相关文档的文档排名和检索函数。该查询本身可以是包含句子或句子集合的文档,也可以只是几个单词。实际上,Okapi BM25 不仅仅是一个函数,而是由一整套评分功能组合在一起构成的一个框架。假设有一个查询文档 QD,其中 QD=(q1,q2,...,qn) 包含 n 个词项或关键字,同时在文档语料库中有一个语料库文档 CD,希望使用相似度得分从中获取与查询文档最相关的文档,正如我们之前所做的那样。那么,可以在数学上定义这两个文档直接的 DM25 得分:

上试中函数 bm25(CD,QD)基于查询文档 QD 计算文档 CD 的 DM 25 排名或得分。函数 idf(qi) 给出了在包含 CD 的语料库(希望从其中检索相关文档的语料库)中的词项 qi 的逆文档频率(IDF)。在前面实现 TF-IDF 特征提取器时计算过 IDF,它的表达式如下:

其中 idf(t) 表示词项 t 的 idf,C 表示语料库中的总文档数,df(t) 表示包含词项 t 的文档数量的频率。实现 idf 还有其他各种各样的方法,但是在这里将使用这种方法,需要说明的是,不同实现方法最终得出的结果是非常相似的。函数 f(qi,CD) 给出了语料库文档 CD 中词频 qi 的频率。|CD| 表示通过字数测量得到的文档 CD 的总长度,avgdl 表示待检索文档的语料库中文档的平均长度。此外,还会观察到有两个自由参数 k1 和 b,k1的取值范围通常为 [1.2, 2.0],b 则通常取 0.75。将在实际执行中将 k1 的值设为 1.5。

通过以下几个步骤来计算文档的 BM25 得分:

  1. 建立一个函数以获得语料库中词项的逆文档频率(IDF)值。
  2. 构建一个计算查询文档和语料库文档的 BM25 得分的函数。
  3. 为语料库文档和查询文档获取基于词袋的特征。
  4. 使用第 1 步中的函数计算语料库文档的平均长度和语料库文档中词项的 IDF 值。
  5. 使用第 2 步中的函数计算 BM25 得分、为相关文档排序为每个查询文档去前 n 个最相关的文档。

从实现一个提取和计算文档语料库中所有词项的逆文档频率的函数开始着手,该函数使用包含词项的词袋特征,然后使用前述公式将其转换为 IDF。如下函数所示:

现在,要实现基于查询文件的、对语料库中所有文档的 BM25 得分进行计算的主要函数,并根据文档的 BM25 得分从语料库中检索前 n 个最相关的文档。以下函数实现了 BM25 评分框架:

函数里的注释十分简单明了,它们解释了函数如何实现 BM25 的评分功能。简单来说,首先计算 BM25 数学表达式中的分子,然后计算其分母。最后,将分子除以分母,获得所有语料库文档的 BM25 得分。最后按降序顺序,并返回前 n 个具有最高 BM25 的分的相关文档。在下面的代码中,将在示例语料库中对函数进行测试,并查看它们对每个查询文档的执行情况:

结果:

现在可以看出,对于每个查询文档,是如何获得与查询文档内容相似的文档的。可以看到该结果与前面测试结果非常相似,当然了,因为它们都是相似度和排名指标,并且预期就会返回类似的结果。请注意,相关文件的 BM25 得分越高,文档越相关。不幸的是,无法再 nltk 或 scikit-learn 中找到任何成熟的、可扩展的  BM25 排名框架实现方法。但是,在 gensim.summarization 包下,gensim 似乎有一个 bm25 模块,如果有兴趣的话,可以尝试一下。

最新文章
漫城阅读免费版
漫城阅读免费版是一款方便、免费、无广告打扰的漫画阅读软件,拥有丰富的阅读资源和多样化的漫画题材,用户可以快速查询并下载自己喜欢的作品到收藏夹中,轻松体验阅读。该软件特色在于提供便捷的阅读环境,无广告干扰,且随时可阅读优质漫
麦克风哪个牌子最好?2024年口碑最好的领夹麦克风品牌推荐
如今,随着互联网的普及和数字媒体的繁荣,音频内容的创作和传播呈现出爆炸式的增长。从热门的短视频平台到专业的音频分享网站,我们被各种各样的声音所包围。在这个过程中,无线领夹麦克风作为一种高效、便捷的录
神马搜索引擎关键词排名原(神马优化排名关键)
搜索引擎优化的价值,不仅仅是在于获客。在一些4A品牌公司、营销策划公司、广告公司的全案中,搜索引擎优化经常会作为一个品牌传播媒介出现,品牌搜索引擎优化的价格天然也水涨船高。关于一些体量大的企业客户来说,作业词、产品词的方位靠
智能电动车锁有哪些功能?
智能电动车锁具有多种实用功能。比如遥控上锁,车辆停稳后按下锁头按钮就能开启防盗报警。遥控解锁则通过开锁按钮操作,关闭防盗报警。一键寻车功能在宽阔停车场按下摇铃键,车身会响方便寻车。免钥启动在丢失车钥匙时连按两下闪电键遥控启
荔湾网络营销推广优化实战策略解析与案例分享
荔湾网络营销推广优化策略,结合实战案例分析,旨在提升企业网络营销效果。本文深入解析优化策略,包括关键词研究、内容营销、社交媒体运用等,通过具体案例展示如何成功实施,为企业提供实操指导。随着互联网的快速发展,已成为企业推广产
喵趣漫画在线阅读入口免费下载
喵趣漫画在线阅读入口免费下载是一款专注于提供优质漫画阅读体验的软件。用户可以在应用中轻松浏览各种类型的漫画,包括热门连载、经典作品和新鲜创意。应用界面简洁直观,操作便捷,支持离线下载,让用户随时随地畅快阅读。同时,软件更新
通过阿里云 Milvus 和 LangChain 快速构建 LLM 问答系统
阿里云向量检索 Milvus 版是一款云上全托管服务,确保了与开源Milvus的100%兼容性,并支持无缝迁移。在开源版本的基础上增强了可扩展性,能提供大规模 AI 向量数据的相似性检索服务。相比于自建,目前阿里云Milvus具备易用性、可用性、安全
沃尔沃XC60涡轮增压怎么样?
沃尔沃XC60涡轮增压车型的做工、安全性还有品牌知名度方面都是不错的,缺点是该车的保有量少,维修保养还有保值性方面不是很有优势。解决涡轮增压压力高的方法有:1。DME控制单元中的数据解释不良,车辆控制程序需要重新升级;2.检查电子调
北京瑞鼎鸿业取得间歇式下水的金属天沟专利,能够增加排水管道瞬时流量,提高杂质排出效果
金融界2024年12月14日消息,国家知识产权局信息显示,北京瑞鼎鸿业建筑科技有限公司取得一项名为“一种间歇式下水的金属天沟”的专利,授权公告号CN 222140506 U,申请日期为2024年1月。专利摘要显示,本实用新型涉及天沟领域,尤其涉及一
淘宝游戏专营店铺怎样开通?购买淘宝游戏专营店铺多少米?
  游戏类商品需要加入游戏专营后才允许发布,自2016年10月28日起淘宝游戏专营市场暂停入驻。全淘宝网卖家将无法申请加入游戏专营,已经加入的卖家不受影响。目前你想开新店不太可能,可以考虑买个淘宝游戏类的老店来开。下面小编就为大家
相关文章
推荐文章
发表评论
0评