使用词向量以数学方式查找具有相似含义的单词

摄影:Nika Charakova

一、说明

        简而言之,词向量只不过是表示自然语言词含义的一系列实数。这项技术是有用的NLP功能的重要推动力,使机器能够“理解”人类语言。本文讨论如何使用词向量以编程方式计算文本的语义相似性,例如,如果您需要根据文本涵盖的主题对这些文本进行分类,这将非常有用。它从一个概念视图和示例开始,然后说明如何使用spaCy(一个领先的NLPPython库)来确定文本的语义相似性。

二、词向量的概念

        因此,让我们从概念上看一下词向量,以便您可以基本了解如何在数学上计算以向量形式表示的词之间的语义相似性。然后,您将查看spaCy的similarity()方法,该方法比较容器对象(Doc,Span,Token)的词向量以确定其含义的接近程度。

        在统计建模中,将单词映射到反映单词语义相似性的实数向量。您可以将词向量空间想象成一个云,其中具有相似含义的单词向量位于附近。例如,表示单词“苹果”的向量应该更接近单词“梨”的矢量,而不是单词“car”的矢量。由于前两个是指可食用的水果,而后者是指四轮公路车辆。要生成这些向量,您需要对这些单词的含义进行编码。实际上,有几种编码含义的方法。

三、用坐标定义意义

        生成有意义的词向量的一种方法是将现实世界中的对象或类别分配给词向量的每个坐标。例如,假设您正在为以下单词生成词向量:罗马、意大利、雅典和希腊。词向量应该在数学上反映罗马是意大利首都的事实,并且与意大利的关系与雅典不同。同时,它们应该反映雅典和罗马是首都,希腊和意大利是国家的事实。

        下图说明了此向量空间以矩阵的形式可能是什么样子。

        在这里,您将每个单词的含义分布在四维空间中的坐标之间,表示类别“国家”、“首都”、“希腊”和“意大利语”。在此简化示例中,坐标值可以是 1 或 0,指示相应的单词是否属于该类别。

        一旦你有一个向量空间,其中的数字向量捕获对应单词的含义,你就可以在这个向量空间上使用向量算术来深入了解单词的含义。要找出雅典是哪个国家的首都,您可以使用以下等式,其中每个标记代表其相应的向量,X 是未知向量:

        意大利 — 罗马 = X — 雅典

        这个等式表达了一个类比,其中X表示与雅典具有相同关系的词向量,就像意大利与罗马的关系一样。要求解 X,您可以像这样重写等式:

        X = 意大利 — 罗马 + 雅典

        首先通过减去相应的矢量元素,从矢量意大利中减去矢量罗马。然后,将生成的向量和向量雅典的总和相加。下图中的图表总结了此计算。

        通过从意大利的单词向量中减去罗马的单词向量,然后添加雅典的单词向量,您可以得到一个等于向量希腊的向量。

四、使用维度来表示意义

        虽然您刚刚创建的向量空间只有四个类别,但现实世界的向量空间可能需要数万个这样的类别。这种大小的向量空间对于大多数应用程序来说是不切实际的,因为它需要一个巨大的词嵌入矩阵。例如,如果要编码 10,000 个类别和 1,000,000 个实体,则需要 10,000 个× 1,000,000 个嵌入矩阵。

        减小嵌入矩阵大小的明显方法是减少向量空间中的类别数量。词向量空间的实际实现不是使用坐标来表示所有类别,而是使用向量之间的距离来量化和分类语义相似性。各个维度通常没有固有的含义。相反,它们表示向量空间中的位置,向量之间的距离表示相应单词含义的相似性。要查看实向量空间的示例,您可以在 English word vectors · fastText 下载 fastText 词向量库,该库在 300 维词向量空间中分发单词的含义。

五、spaCy's Similarity() 方法

        在spaCy中,每种类型的容器对象都有一个相似性方法,允许您通过比较它们的词向量来计算任何类型的两个容器对象之间的语义相似性估计。为了计算没有自己的词向量的跨度和文档的相似性,spaCy 会平均它们包含的标记的词向量。

        可以计算两个容器对象的语义相似性,即使这两个对象不同。例如,可以将 Token 对象与 Span 对象进行比较,将 Span 对象与 Doc 对象进行比较,等等。

        以下示例计算 Span 对象与 Doc 对象的相似程度:

>>> doc=nlp(‘I want a green apple.’)
>>> doc.similarity(doc[2:5])
0.7305813588233471

        此代码计算句子“我想要一个青苹果”和从同一句子派生的短语“一个青苹果”之间的语义相似性估计。如您所见,计算出的相似度足够高,可以认为两个对象的内容相似(相似度范围从 0 到 1)。毫不奇怪,当您将对象与自身进行比较时,similarity() 方法返回 1:

>>> doc.similarity(doc)
1.0
>>> doc[2:5].similarity(doc[2:5])
1.0

六、后记

        注意:本文中使用的示例取自我最近由No Starch Press(https://nostarch.com/)出版的《Python and spaCy (https://nostarch.com/NLPPython)自然语言处理》(Natural Language Processing with Python and spaCy一书。

猜你喜欢

转载自blog.csdn.net/gongdiwudu/article/details/132325632