6.文档相似度分析

   日期:2024-12-27    作者:nuqi6 移动:http://oml01z.riyuangf.com/mobile/quote/57445.html

将尝试分析文档之间的相似度指出。到目前为止,相比已经知道了文档的定义是可以由句子或文本段落组成的文本体。为了分析文档相似度,将使用 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 模块,如果有兴趣的话,可以尝试一下。


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号