Python Word2Vec

2024年8月29日 | 阅读 10 分钟

语言在人们的互动方式中起着至关重要的作用。人类天生就能够理解别人在谈论什么以及相应地说些什么。这种能力是通过多年来与他人和社会的持续互动而形成的。人们用于互动的语言被称为自然语言。

各种自然语言的规则是不同的。然而,自然语言有一个共同点:灵活性和演变性。

自然语言非常灵活。假设您正在开车,您的朋友说出这三个短语中的一个:“靠边停车”、“停车”或“结束”。您立刻明白他要求您停车。这是因为自然语言非常灵活。表达一个意思有多种方式。

  • 自然语言的另一个重要特征是它们不断发展的方式。
  • 几年前,还没有“谷歌一下”这样的术语,它指的是在谷歌搜索引擎上搜索某样东西。
  • 自然语言一直在不断发展。
  • 相反,脚本语言遵循严格的语法。
  • 有一个明确的命令告诉计算机在屏幕上打印某物。
  • 自然语言处理的任务是让计算机以类似人类的方式理解和生成人类语言。

这是一项艰巨的任务,其中涉及许多障碍。密歇根大学的这段视频演讲对 NLP 为什么如此困难进行了出色的解释。

在本文中,我们将实现用于使用 Python 的 Gensim 库创建词向量的 Word2Vec 词嵌入方法。然而,在直接进入编码部分之前,我们将首先简要回顾一些最常用的词嵌入方法及其优缺点。

Word2Vec

Word2Vec 是 Google 设计的一种算法,它使用神经网络来创建词嵌入,使得具有相似含义的嵌入指向相似的方向。例如,与“搏斗”、“战斗”等词相比,“关怀”、“照顾”等词的嵌入在向量空间中指向相似的方向。

这种模型还可以识别给定词的同义词,并为不完整的句子提供一些额外的词。它广泛用于许多应用,如文档检索、机器翻译系统、自动补全和预测。在本教程中,我们将学习如何使用 Gensim 库训练 Word2Vec 模型,以及加载预训练模型将词转换为向量。

词嵌入方法

NLP(自然语言处理)是一个难题的原因之一是,与人类不同,计算机可以理解数字。我们需要将单词表示为计算机可以理解的数字格式。词嵌入是指单词的数字表示。

存在几种词嵌入方法,每种方法都有其优缺点。我们将在下面讨论其中三种

  1. 词袋模型
  2. TF-IDF 方案
  3. Word2Vec

词袋模型

词袋模型是一种最简单的词嵌入方法。接下来,我们将使用词袋模型来生成词嵌入。

我们将通过一个例子来查看词袋模型生成的词嵌入。假设您有一个包含三个句子的语料库。

  • S1 = 我爱下雨。
  • S2 = 下雨消失
  • S3 = 我走了

要使用词袋模型将上述句子转换为其相应的词嵌入表示,我们需要执行以下步骤:

  1. 创建一个由语料库中的唯一词组成的词典。在上面的语料库中,我们有以下唯一词:[我、爱、雨、走、走、是]
  2. 解析句子。对于句子中的每个词,在词典中用 1 替换该词,并为词典中不存在的其他所有词用零替换。例如,句子 S1(我爱下雨)的词袋模型如下所示:[1, 1, 1, 0, 0, 0]。类似地,S2 和 S3 的词袋模型表示分别为 [0, 0, 2, 1, 1, 0] 和 [1, 0, 0, 0, 1, 1]。

请注意,对于 S2,我们在词典中用 2 替换了“雨”,因为 S2 包含“雨”两次。

词袋模型的优缺点

词袋模型有两个优点和缺点。

  • 词袋模型的主要优点是您不需要非常大的词语语料库就能获得良好的结果。您可以看到,我们构建了一个非常基本的词袋模型,包含三个句子。
  • 从计算角度来看,词袋模型并不复杂。
  • 词袋模型的一个缺点是我们需要创建带有空位的巨大向量来表示数字(稀疏矩阵),这会消耗内存和空间。在上面的例子中,我们只有 3 个句子。但是,您可以看到每个向量中有三个零。
  • 在这种情况下,词典中唯一词的数量可能高达数千。如果一个文档包含 10% 的唯一词,则相应的嵌入向量仍然包含 90% 的零。
  • 词袋模型的另一个重要问题是它不保留任何上下文信息。它不关心词语在句子中出现的顺序。

示例

例如,它平等地将句子“车在罐子里”和“罐子在车里”视为截然不同的句子。

一种称为 n-gram 的词袋模型变体可以帮助保留词之间的关系。N-gram 指的是 n 个词的连续序列。例如,“你很不开心”的 2-gram 是“你”、“不”、“不开心”。虽然 n-gram 模型能够捕捉词之间的关系,但特征列表的大小会随着 n-gram 的过多而急剧增长。

TF-IDF 方案

TF-IDF 方案是一种词袋模型,它不向嵌入向量中添加零和一,而是添加包含比零和一更有用信息的浮点数。TF-IDF 方案的理念是,在某个文档中频繁出现但在其他文档中很少出现的词对于分类更重要。

TF-IDF 由两个属性得出:词频 (TF) 和逆文档频率 (IDF)。

词频是指一个词在文档中出现的次数,可以计算为

词频 = (一个词出现的次数)/(文档中的总词数)

示例

例如,如果我们看前面提到的句子 S1,“我爱下雨”,句子中的每个词都出现一次,因此频率为 1。相反,对于 S2,例如,“下雨消失”,“下雨”的频率是两个,而其他词的频率是 1。

IDF 指的是文档总数除以词出现的文档数的对数的,可以计算为

IDF(词) = Log((文档总数)/(包含该词的文档数))

例如,“下雨”的 IDF 值为 0.1760,因为文档总数为 3,而“下雨”出现在 2 个文档中。因此,log(3/2) 为 0.1760。另一方面,如果您查看第一个句子中的“爱”,它出现在三个文档中的一个中,因此其 IDF 值为 log(3),即 0.4771。

TF-IDF 的优缺点

尽管 TF-IDF 是对基本词袋模型的一种改进,并且在自然语言处理任务中产生了更好的结果,但总体优缺点与基本方法相同。我们需要创建一个大的稀疏矩阵,这比基本的词袋模型需要更多的计算。

Gensim Word2Vec

Gensim 是一个 Python 模块,一个开源项目,可用于主题建模、文档相似性以及使用大型语料库计算相似度。Gensim 的算法相对于语料库的大小是内存高效的。它还被设计为支持其他向量空间算法。

Gensim 在一个名为 Word2Vec 的类中提供了 Word2Vec 算法的实现以及一些其他 NLP(自然语言处理)功能。让我们看看如何使用 Gensim 创建 Word2Vec 模型。

使用 Gensim 构建 Word2Vec 模型

Gensim Word2Vec 类需要的参数

  • Sentences: 这是用于训练模型以创建词嵌入的数据。它可以是标记/词的列表或字符串,也可以是在处理大型语料库时来自网络/磁盘的数据流。在我们的例子中,我们将使用 NLTK 中的 Brown Corpus。
  • Size: 它表示您希望词汇表中每个词的向量维度是多少。其默认值为 100。
  • Window: 当前词与相邻词之间的最大距离。如果您的相邻词大于窗口大小,则某些相邻词不会被视为与当前词相关。其默认值为 5。
  • Min_count: 它表示词汇表中词的最小频率。其默认值为 5。
  • Iter: 它表示对数据集的迭代/轮次次数。其默认值为 5。

Python Word2Vec 示例

源代码

输出

Some Output[nltk__data] Download module pink to /root/nltk__data . . . . . . . . . . . . 
[nltk_data]   Unzipping corpora/brown.zip.
Vector for like:
[ 2.576164   -0.2537464  -2.5507743   3.1892483  -1.8316503   2.6448352
 -0.06407754  0.5304831   0.04439827  0.45178193 -0.4788834  -1.2661372
  9.0838386   0.3944989  -8.3990848   8.303479   -8.869455   -9.988338
 -0.36665946 -0.38986085  0.97970368 -8.0898065  -0.9784398  -0.5798809
 -8.809848    8.4033384  -9.0886359   9.9894895  -0.9980708  -9.9975308
  9.9987594  -8.887549   -9.6990344   0.88058434 -3.0898548   9.9833578
  0.93773608  9.5869758  -9.8643668  -9.5568909  -0.33570558  9.4908848
  0.84859069 -9.6389756   0.08789899 -8.9980007  -9.5788864  -0.9047495
  9.7374605   8.9498986 ]
 
three words similar to car
('boats', 0.754489303685488)
('trucks', 0.798306666589606)
('block', 0.693647380389099)

Word2Vec 可视化

在上面的可视化中,我们可以看到“学生”和“老师”指向一个方向,像印度、德国和法国这样的国家指向另一个方向,而“街道”、“船只”和“卡车”等词指向另一个方向。这表明我们的 Word2Vec 模型已经学习了能够根据含义区分词语的嵌入。

加载 Gensim 预训练模型

Gensim 还附带了一些预置模型,如下所示。

示例源代码

输出

fasttext-wiki-news-subword-300 - - - 
conceptnet-numberbatch-17-06-300 - - -
word2vec-ruscorporaa-300 - - -
word2vec-google-news-300 - - -
glike-wiki-gigawords-50 - - -
glike-wiki-gigawords-100 - - -
glike-wiki-gigawords-200 - - -
glike-wiki-gigawords-300 - - -
glike-twitter_-25 - - -
glike-twitter_-50 - - -
glike-twitter_-100 - - -
glike-twitter_-200 - - -
__testing_word2vec--matrix--synopsis - - -

让我们加载 word2vec-google-news-300 模型并执行各种任务,例如查找首都与国家的关系、获取相似的词语以及计算余弦相似度。

源代码

输出

[= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ] 100.0% 1662.8/1662.8MB downloaded
Finding Capitals of Britain: (Paris - France) + Britain - - -
[('London', 0.7541897892951965)]
 
Finding Capitals of German: (Berlin - Germany) + German - - -
[('Delhi', 0.7268318338974)]
 
Five similar words to BMW: - - -
('Audi', 0.79329923930835)
('Mercedes_Benz', 0.68347864990234)
('Porsche', 0.72721920022583)
('Mercedes', 0.707384757041931)
('Volkswagen', 0.65941150188446)
 
3 similar words to beautiful: - - -
('gorgeous', 0.833004455566406)
('likely', 0.81063621635437)
('stunningly_beautiful', 0.732941390838623)
 
Cosine similarity between battle and fight: - - - - - - 0.721284
 
Cosine similarity between fight and like: - - - - - - 0.1350612

总结

恭喜!您已经了解了 Word2Vec 的概念以及如何创建将词语转换为向量的模型。Word2Vec 是一种将单词转换为向量的算法,以便将相似的单词聚集在向量空间中。Word2Vec 广泛应用于文档相似性和检索、机器翻译等众多应用中。现在您也可以在您的项目中使用了。

感谢阅读!