上下文向量的进一步应用

上下文向量是 transformer 模型生成的强大表示,它们捕获了单词在特定上下文中的含义。在我们之前的教程中,我们探讨了如何生成这些向量以及一些基本应用。现在,我们将重点构建利用上下文向量解决现实问题的实际应用。

在本教程中,我们将实现几个应用来展示上下文向量的强大功能和多功能性。我们将使用 Hugging Face transformers 库从预训练模型中提取上下文向量,并围绕它们构建应用程序。具体来说,您将学习:

  • 使用上下文向量构建语义搜索引擎
  • 创建文档聚类和主题建模应用程序
  • 开发文档分类系统

通过我的书籍《Hugging Face Transformers中的NLP》快速启动您的项目。它提供了带有工作代码的自学教程

让我们开始吧。

上下文向量的进一步应用
照片作者:Matheus Bertelli。保留部分权利。

概述

这篇博文分为三部分;它们是:

  • 构建语义搜索引擎
  • 文档聚类
  • 文档分类

构建语义搜索引擎

如果您想在一系列文档中查找特定文档,您可能会使用简单的关键字搜索。然而,这种方法受到关键字匹配精度的限制。您可能不记得文档中使用的确切措辞,只记得它的内容。在这种情况下,语义搜索更有效。

语义搜索允许您通过含义而不是关键字进行搜索。每个文档都由捕获其含义的上下文向量表示,查询也表示为上下文向量。然后,搜索引擎使用 L2 距离或余弦相似度等相似性度量来查找与查询最相似的文档。

既然您已经学习了如何使用 transformer 模型生成上下文向量,让我们来实现一个简单的语义搜索引擎。

在此示例中,上下文向量是使用 get_context_vector() 函数创建的。您可以将文本作为字符串或字符串列表传递,然后分词器和模型会产生张量输出。此输出是形状为 (batch size, sequence length, hidden size) 的矩阵。序列中的并非所有 token 都是有效的,因此您可以使用分词器生成的注意力掩码来识别有效 token。

每个输入字符串的上下文向量通过对其所有有效 token 嵌入求平均值来计算。请注意,还有其他创建上下文向量的方法,例如使用 [CLS] token 或不同的池化策略。

在此示例中,您从一系列文档和一个查询字符串开始。您为两者生成上下文向量,在 semantic_search() 中,使用余弦相似度将查询向量与所有文档向量进行比较,以查找最相似的 top-k 文档。

以上代码的输出是:

您可以看到,语义搜索引擎理解查询背后的含义,而不仅仅是匹配关键字。但是,结果的质量取决于上下文向量表示文档和查询的程度,以及所使用的相似性度量。

文档聚类

文档聚类将相似的文档分组在一起。当组织大量文档时,这很有用。虽然您可以手动分类文档,但这种方法非常耗时。聚类是一种自动的、无监督的过程——您无需提供任何标签。算法根据它们的相似性将文档分组到群集中。

有了每个文档的上下文向量,您就可以使用任何标准的聚类算法。下面,我们使用 K-means 聚类。

在此示例中,使用与上一个示例相同的 get_context_vector() 函数为文档语料库生成上下文向量。每个文档都被转换为固定大小的上下文向量。然后,K-means 聚类算法将文档分组。群集数设置为 3,但您可以尝试其他值以查看哪个最合适。

以上代码的输出是:

聚类的质量取决于上下文向量和聚类算法。要评估结果,您可以使用主成分分析 (PCA) 将聚类可视化为 2D。PCA 将向量降至其前两个主成分,这些可以绘制在散点图中。

如果您看不到清晰的聚类——就像本例一样——这表明聚类效果不理想。您可能需要调整生成上下文向量的方式。但是,问题也可能是所有文档都与机器学习相关,因此强行将它们分成三个不同的群集可能没有意义。

总的来说,文档聚类有助于自动发现文档集中的主题。要获得良好的结果,您需要一个中等大小且多样化的语料库,其中包含清晰的主题区分。

文档分类

如果您碰巧有文档的标签,您可以使用它们来训练分类器。这比聚类更进一步。有了标签,您就可以控制文档的 agrupamento。

您可能需要更多数据来训练一个可靠的分类器。下面,我们将使用逻辑回归分类器来对文档进行分类。

上下文向量的生成方式与上一个示例相同。您不是进行聚类或手动比较相似度,而是向逻辑回归分类器提供一组标签(每个文档一个)。使用 scikit-learn 的实现,我们在训练集上训练模型,并在测试集上对其进行评估。

scikit-learn 的 classification_report() 函数提供了精确率、召回率、F1 分数和准确率等指标。结果如下所示:

要使用训练好的分类器,请遵循相同的流程:使用 get_context_vector() 函数将新文本转换为上下文向量,然后将其传递给分类器以预测类别。运行上述代码时,您应该会看到:

请注意,分类器是在上下文向量上训练的,这些向量理想情况下捕获了文本的含义,而不仅仅是表面的关键字。因此,它应该能更有效地泛化到新输入,即使是那些包含未见过关键字的输入。

总结

在这篇文章中,您探讨了如何构建利用 transformer 模型生成的上下文向量的实际应用程序。具体来说,您实现了:

  • 一个语义搜索引擎,用于查找与查询最相似的文档
  • 一个文档聚类应用程序,用于将文档分组到有意义的类别中
  • 一个文档分类系统,用于将文档分类到预定义的类别中

这些应用程序突显了上下文向量在理解和处理文本方面的强大功能和多功能性。通过利用 Transformer 模型的语义能力,您可以构建超越简单的关键词匹配或基于规则方法的复杂 NLP 系统。

想在您的NLP项目中使用强大的语言模型吗?

NLP with Hugging Face Transformers

在您自己的机器上运行最先进的模型

...只需几行Python代码

在我的新电子书中探索如何实现
使用 Hugging Face Transformers 进行自然语言处理

它涵盖了在以下任务上的实践示例实际用例文本分类、摘要、翻译、问答等等...

最终将高级NLP带入
您自己的项目

没有理论。只有实用的工作代码。

查看内容

暂无评论。

留下回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。