文本嵌入的应用示例

文本嵌入通过提供捕捉语义意义的密集向量表示,彻底改变了自然语言处理。在上一篇教程中,您学习了如何使用 Transformer 模型生成这些嵌入。在本篇文章中,您将学习文本嵌入的高级应用,这些应用超越了诸如语义搜索和文档聚类等基本任务。
具体来说,您将学习

  • 如何使用文本嵌入构建推荐系统
  • 如何使用多语言嵌入实现跨语言应用
  • 如何使用基于嵌入的特征创建文本分类系统
  • 如何开发零样本学习应用
  • 如何可视化和分析文本嵌入

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

让我们开始吧。

文本嵌入的应用示例
照片来源:Christina Winter。部分权利保留。

概述

本文分为五个部分,它们是:

  • 推荐系统
  • 跨语言应用
  • 文本分类
  • 零样本分类
  • 可视化文本嵌入

推荐系统

可以通过查找与目标项目最相似的几个项目来创建一个简单的推荐系统。在自然语言处理的例子中,当用户阅读一篇文章时,您可以找到一些类似的“您可能还喜欢”的文章。

实现这一点的方法有很多。但最简单的方法是检查两篇文章的相似程度。您可以将所有文章转换为上下文嵌入。在上下文嵌入中相似度最高的两篇文章在内容上是相似的。这可能不是您期望的推荐效果,但有时很有用,而且是一个好的起点。

让我们按照以下方式实现它

您在代码开头设置了一个语料库,因为这是一个玩具示例。在实际应用中,您可能希望从数据库或文件系统中检索语料库。

在此程序中,您使用了 all-MiniLM-L6-v2 模型,并使用 SentenceTransformer 进行了实例化。这是一个可以对文本进行编码以生成上下文嵌入的预训练模型。您获取了语料库中定义的所有文章,并在 create_article_embeddings() 函数中将每篇文章转换为上下文嵌入。输出是向量的向量,即一个矩阵。在此特定实现中,语料库中有 5 个项目,嵌入向量有 384 个维度。输出 embeddings 是一个形状为 (5, 384) 的矩阵。

get_recommendations() 中,您计算了一个嵌入与所有其他嵌入之间的余弦相似度。scikit-learn 中的 cosine_similarity() 函数需要两个向量列表,并返回一个矩阵,说明每对向量的相似度。由于您正在比较一个与其他所有项,因此输出矩阵只有一行。然后,在 np.argsort(similarities) 中,您以升序获取了相似度得分的索引。由于余弦相似度在向量相同时为 1,在正交时(即完全不同)为 0,因此您反转结果以按降序排列相似度得分。然后,最相似的项目是此列表开头的项目,第一个项目除外,它是文章本身。

一旦获得了最相似项目的索引,就使用 for 循环打印推荐结果。

运行此代码时,您将获得

这些推荐将基于语义相似性,而不仅仅是关键字匹配,因此即使文章不包含“深度学习”这个确切短语,您也会得到关于神经网络或机器学习的文章。通过整合用户偏好、协同过滤或混合方法,可以将此方法扩展到更复杂的推荐系统。

跨语言应用

现代 Transformer 模型的一个强大功能是它们能够为多种语言的文本生成嵌入。这使得跨语言应用成为可能,您可以在不同语言之间比较或处理文本。

让我们来实现一个简单的跨语言语义搜索系统

在此示例中,我们使用了多语言 Sentence Transformer 模型(paraphrase-multilingual-MiniLM-L12-v2)来为不同语言的文档创建嵌入。语料库包含多种语言和多种主题。上面的程序用于实现一个问答系统,但问题可能会在不同语言中找到答案。

上面的例子与上一节的例子非常相似。语料库首先被转换为嵌入。然后,以嵌入形式的查询通过余弦相似度与语料库进行比较。打印前 3 个结果。运行此代码将为您提供

最高答案是意大利语,而问题“什么是机器学习?”是英语。之所以这样工作,是因为嵌入向量代表了文本的语义含义,而与语言无关。这种跨语言能力对于多语言搜索引擎等应用尤其有用。

文本分类

想象一下,您有大量文本数据,并且这些数据每天都在增长。这可能是因为您正在收集新的文章或电子邮件。您想将它们分类到不同的类别中。这可以通过使用文本嵌入来完成。

这是一个类似于“主题建模”的任务。主题建模是一个无监督学习任务,它将文本文档分组到不同的主题中。它使用诸如潜在狄利克雷分配(LDA)等算法来查找分类的签名关键词。这是一个监督方法:您有一组预定义的类别和一些示例(也许您手动进行分类)。然后,您将新文本添加到集合中,并自动完成分类。

文本嵌入可以通过将文本的语义含义提取到向量中来提供帮助。然后,您可以训练一个机器学习模型将这些向量分类到不同的类别中。这样做效果更好,因为向量代表了文本的含义,而不是文本本身。因此,它比使用词袋模型或 TF-IDF 特征更好。

实现机器学习分类器的方法有很多。一种简单的方法是使用 scikit-learn 中的逻辑回归。让我们在代码中实现这一点

When you run this, you will get

In this example, the corpus is annotated with one of the four categories: business, health, technology, or science. The text is converted into embeddings, which, together with the category label, are used to train a logistic regression classifier.

The classifier is trained with 80% of the corpus and then evaluated with the remaining 20%. The results are printed in the form of a classification report. You can see that Business and Science are classified accurately, but Health and Technology are not so good. When you finish the training, you can use the trained classifier on the new articles. The workflow is the same as in training: Encode the text into embeddings, then scale the embeddings using the trained scaler, and finally, use the trained classifier to predict the category.

Note that you can use other classifiers like random forest or K-Nearest Neighbors. You can try them and see which one works better.

零样本分类

In the previous example, you trained a classifier to classify the text into one of the predefined categories. If the category labels are meaningful text, why can’t you use the meaning of the label for classification? In this way, you can simply convert the text into embeddings and then compare it with the category labels’ embeddings. The text is then tagged with the most similar category label.

This is the idea of zero-shot learning. It is not a supervised learning task. Indeed, you never train a new model, but the classification and information retrieval tasks can still be done.

Let’s implement a zero-shot text classifier using text embeddings

输出如下:

The result may not be as good as the previous example because the category labels are sometimes ambiguous, and you do not have a model trained for this task. Nevertheless, it produces meaningful results.

Zero-shot learning is particularly useful for tasks where labeled training data is scarce or unavailable. It can be applied to a wide range of NLP tasks, including classification, entity recognition, and question-answering.

可视化文本嵌入

Not a particular application, but visualizing text embeddings can sometimes provide insights into the semantic relationships between texts. Since embeddings typically have hundreds of dimensions, you need dimensionality reduction techniques to visualize them in 2D or 3D.

PCA is probably the most popular dimensionality reduction technique. However, for visualization, t-SNE (t-Distributed Stochastic Neighbor Embedding) usually works better. Let’s implement a visualization of text embeddings using t-SNE

您使用了 scikit-learn 的 t-SNE 实现。它很容易使用,您只需要将嵌入向量的行传递给 tsne.fit_transform() 方法即可。输出的 embeddings 是一个 $N \times 2$ 的数组(即在二维空间中的坐标)。

然后,您使用一个 for 循环将每个转换后的嵌入绘制成散点图中的一个点。每个点根据原始文本中的标注类别进行着色。为了避免图表混乱,图例是在另一个 for 循环中稍后创建的。生成的图表如下所示:

可视化将含义相似的文本放在一起;这意味着标签对于表示文本的语义含义很有用。您可以查看图表,检查同一类别的点是否足够聚集在一起,以判断您的嵌入是否良好。

还存在其他降维技术,例如 PCA(主成分分析)或 UMAP(均匀流形逼近与投影)。您可以尝试这些方法,看看可视化是否仍然有意义。

进一步阅读

以下是一些您可能觉得有用的进一步阅读资料:

总结

在本教程中,您学习了文本嵌入的几个应用。特别是,您学习了如何

  • 使用嵌入空间中的相似性构建推荐系统
  • 使用多语言嵌入实现跨语言应用
  • 使用嵌入作为特征训练文本分类系统
  • 使用嵌入空间中的相似性度量开发零样本文本标注应用
  • 可视化和分析文本嵌入

文本嵌入是各种 NLP 任务中简单而强大的工具。它们使机器能够以捕捉语义含义的方式理解和处理文本。

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

NLP with Hugging Face Transformers

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

...只需几行Python代码

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

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

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

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

查看内容

暂无评论。

留下回复

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