词嵌入和 Word2Vec 示例

⚡ 智能摘要

词嵌入和 Word2Vec 将文本转换为稠密的数值向量,以便机器学习模型识别含义相近的词语。本资源解释了这项技术,包括其 CBOW 和 Skip-Gram 架构、激活函数,以及一个完整的 Gensim 实现,可用于实际应用。

  • 🔢 核心定义: 词嵌入将词汇表映射到实值向量,将语义相似的词语在向量空间中放置在一起。
  • 🧠 Word2Vec模型: 连续词袋模型根据上下文预测单词,而 Skip-Gram 模型根据单个单词预测其周围上下文。
  • ⚙️ 训练机制: Softmax、分层softmax和负采样能够有效地激活神经元,并优化大型词汇表的学习。
  • 🔗 NLTK集成: NLTK 执行分词和词形还原等预处理,而 Word2Vec 则捕获语义和句法关系。
  • 🛠️ Gensim实现: Gensim 库构建、保存和重新加载 Word2Vec 模型,以计算真实数据上的词语相似度。

词嵌入和 Word2Vec 模型

什么是词嵌入?

单词嵌入 词嵌入是一种词表示类型,它允许机器学习算法理解含义相近的词语。它是一种语言建模和特征学习技术,利用神经网络、概率模型或对词共现矩阵进行降维,将词语映射到实数向量。一些词嵌入模型包括 Word2vec(Google)、GloVe(斯坦福大学)和fastText(Facebook)。

词嵌入也称为分布式语义模型、分布式表示模型、语义向量空间或向量空间模型。当你阅读这些名称时,你会遇到“词”这个词。 语义这意味着将相似的词语归类在一起。例如,苹果、芒果和香蕉等水果应该放在一起,而书籍则会远离这些词语。更广义地说,词嵌入会创建一个水果向量,该向量与书籍的向量表示相距甚远。

Word Embedding 用在什么地方?

词嵌入有助于特征生成、文档聚类、文本分类和自然语言处理等任务。让我们列举这些应用并逐一讨论。

  • 计算相似的词: 词嵌入用于向预测模型预测的词语推荐相似词。此外,它还会推荐不相似的词语以及最常用的词语。
  • 创建一组相关词: 它用于语义组ping它将具有相似特征的事物归为一类,并将不相似的事物推到一边。
  • 文本分类的特征: 文本被映射到向量数组,这些数组被输入到模型中进行训练和预测。基于文本的分类器模型无法直接在字符串上进行训练,因此需要将文本转换为机器可训练的形式。其语义构建功能进一步有助于基于文本的分类。
  • 文档聚类: 这是词嵌入和 Word2vec 被广泛应用的另一个领域。
  • 自然语言处理: 在许多应用中,词嵌入都非常有用,并且优于特征提取。trac词性标注、情感分析和句法分析等分析阶段。

既然你已经了解了词嵌入的应用领域,那么让我们来看看用于创建这些嵌入的最流行的模型。

什么是 Word2vec?

词向量 词嵌入是一种用于生成词向量的技术或模型,旨在更好地表示词语。它是一种自然语言处理方法,能够捕捉大量精确的句法和语义词语关系。它是一个浅层的两层神经网络,经过训练后,可以检测同义词并为不完整的句子提供补充词语建议。

在继续之前,请先看一下浅层神经网络和深度神经网络之间的区别,如下图所示的词嵌入示例图:

浅层神经网络仅在输入层和输出层之间包含一个隐藏层,而深度神经网络则在输入层和输出层之间包含多个隐藏层。输入层由节点组成,而隐藏层和输出层均包含神经元。

浅层学习与深度学习
浅层学习与深度学习

Word2vec 是一个两层网络,其中包含一个输入层、一个隐藏层和一个输出层。

Word2vec是由Tomas Mikolov领导的一组研究人员开发的。 GoogleWord2vec 比潜在语义分析模型更好、更高效。

为什么使用 Word2vec?

Word2vec 将词语表示为向量空间形式。词语以向量的形式呈现,向量的排列方式使得含义相近的词语彼此靠近,含义不同的词语则彼此远离。这也被称为语义关系。神经网络无法理解文本,它们只能理解数字。词嵌入提供了一种将文本转换为数值向量的方法。

Word2vec 能够重构词语的语言语境。在深入探讨之前,我们先来了解一下什么是语言语境。通常情况下,当我们说话或写作进行交流时,其他人会试图理解句子的目的。例如,“印度的气温是多少?” 这句话的语境是用户想知道“印度的气温”。简而言之,句子的主要目的是提供语境。围绕口语或书面语的词语或句子有助于确定语境的含义。Word2vec 正是通过这些语境来学习词语的向量表示。

Word2vec 的作用是什么?

词嵌入之前

了解词嵌入出现之前使用的方法及其缺点至关重要,接下来我们将探讨词嵌入如何利用 Word2vec 方法克服这些缺点。最后,我们将深入讲解 Word2vec 的工作原理,因为理解其运作机制非常重要。

潜在语义分析方法

这是词嵌入出现之前使用的方法。它采用了词袋模型(Bag of Words)的概念,将单词表示为编码向量。这是一种稀疏向量表示,其维度等于词汇表的大小。如果单词出现在词典中,则计入统计;否则,不计入统计。要了解更多信息,请参阅下面的程序。

Word2vec 示例

Word2vec 示例

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
data_corpus = ["guru99 is the best site for online tutorials. I love to visit guru99."]
vocabulary = vectorizer.fit(data_corpus)
X = vectorizer.transform(data_corpus)

print(X.toarray())
print(vectorizer.get_feature_names_out())

输出:

[[1 2 1 1 1 1 1 1 1 1]]
[u'best', u'guru99', u'is', u'love', u'online', u'sitefor', u'the', u'to', u'tutorials', u'visit']

Code 说明

  1. CountVectorizer 模块用于根据单词的拟合情况存储词汇表。该模块是从 sklearn 导入的。
  2. 使用 CountVectorizer 类创建对象。
  3. 将要拟合到 CountVectorizer 中的数据写入列表。
  4. 数据适合于从 CountVectorizer 类创建的对象。
  5. 使用词袋模型,根据词汇表统计数据中的词数。如果某个词或词元不在词汇表中,则将其索引位置设为零。
  6. 第 5 行的变量 x 被转换为数组(x 有一个可用的方法)。这样就得到了第 3 行提供的句子或列表中每个标记的出现次数。
  7. 这显示了使用第 4 行数据拟合词汇表时所包含的特征。

在潜在语义方法中,行代表唯一词,列代表该词在文档中出现的次数。它以文档矩阵的形式表示词。词频-逆文档频率(TF-IDF)用于计算词在文档中的出现频率,即词在文档中的出现频率除以该词在整个语料库中的出现频率。

词袋方法的缺点

  • 它忽略单词的顺序;例如, 这不好 = 这很糟糕.
  • 它忽略了词语的上下文。假设我们写出句子“他热爱书籍。教育的最佳途径在于书籍。”它会创建两个向量:一个代表“他热爱书籍”,另一个代表“教育的最佳途径在于书籍”。它会将这两个向量视为正交向量,这使得它们相互独立,但实际上,它们是相关的。

为了克服这些局限性,人们开发了词嵌入技术,而 Word2vec 就是实现该技术的一种方法。

Word2vec 如何工作?

Word2vec 通过预测单词的上下文来学习单词。例如,我们来看单词“He”。 足球。”

我们想要计算单词的 Word2vec: .

假设:

loves = Vin. P(Vout / Vin) is calculated
where,
Vin is the input word.
P is the probability of likelihood.
Vout is the output word.

这个单词 遍历语料库中的每个词。词与词之间的句法关系和语义关系都被编码。这有助于查找相似词和类比词。

单词的所有随机特征 计算这些特征。借助某种方法,这些特征会根据相邻词或上下文词进行更改或更新。 反向传播 方法。

另一种学习方法是,如果两个词的语境相似,或者两个词具有相似的特征,那么这些词就是相关的。

词向量 Archi质地

Word2vec 使用两种架构:

  1. 连续词袋(CBOW)
  2. 跳过语法

在深入探讨之前,我们先来讨论一下从词表示的角度来看,这些架构或模型为何如此重要。词表示的学习本质上是无监督的,但训练模型需要目标/标签。Skip-gram 和 CBOW 将无监督的词表示转换为有监督的形式,以便进行模型训练。

在 CBOW 中,使用周围上下文窗口的窗口来预测当前单词。例如,如果 wI-1,WI-2,Wi + 1,Wi + 2 给定单词或上下文,该模型将提供 wi.

Skip-Gram 算法与 CBOW 算法的作用相反,它根据单词预测给定的序列或上下文。你可以反过来理解这个例子。如果 wi 如果给定,这将预测上下文,或者 wI-1,WI-2,Wi + 1,Wi + 2.

Word2vec 提供了 CBOW(连续词袋模型)和 skip-gram 两种模型选择。这些参数在模型训练过程中设置。此外,还可以选择使用负采样或分层 softmax 层。

连续的词袋

让我们绘制一个简单的 Word2vec 示例图来理解连续词袋架构。

连续词袋模型 Archi质地

连续词袋模型 Archi质地

让我们用数学方法计算一下这些方程。假设 V 是词汇表大小,N 是隐藏层大小。输入定义为 { xI-1,XI-2,Xi + 1,Xi + 2 我们通过将 V * N 相乘得到权重矩阵。另一个矩阵是通过将输入向量与权重矩阵相乘得到的。这也可以用以下等式来理解。

h = xitW

其中 xit 其中 W 分别为输入向量和权重矩阵。

要计算上下文与下一个单词的匹配度,请参考以下公式。

u = 预测表示 * h

其中,预测表示是通过上述方程中的模型获得的。

Skip-Gram 模型

Skip-Gram 方法用于根据输入词预测句子。为了更好地理解它,让我们绘制如下 Word2vec 示例中所示的图表。

Skip-Gram 模型

Skip-Gram 模型

可以将其视为连续词袋模型的逆过程,其中输入是单词,模型提供上下文或序列。我们还可以得出结论,目标词被作为输入,输出层被多次复制以容纳选定数量的上下文词。所有输出层的误差向量被求和,并通过反向传播算法调整权重。

选择哪种型号?

CBOW 的速度比 skip-gram 快数倍,并且能更好地表示常用词的频率,而 skip-gram 只需要少量训练数据,甚至还能表示罕见词或短语。下表对这两种架构进行了简要比较。

方面 CBOW 跳格
预测 根据上下文预测目标词。 根据目标词预测上下文
训练速度 更快 比较慢
常用词 精度更高 精度较低
生僻词 代表性较弱 更强的代表性
训练数据 需要更多数据 数据量较少时也能正常工作

Word2vec 与 NLTK 的关系

NLTK 是天然的 Language Tool该工具包用于文本预处理。它可以执行各种操作,例如词性标注、词形还原、词干提取、停用词去除以及去除罕见词或极少使用的词。它有助于清理文本并从有效词中提取特征。另一方面,Word2vec 用于语义(将密切相关的项放在一起)和句法(序列)匹配。使用 Word2vec,可以查找相似词、不相似词、进行降维等等。Word2vec 的另一个重要功能是将文本的高维表示转换为低维向量。

在哪里使用 NLTK 和 Word2vec?

如果要完成一些如上所述的通用任务,如分词、词性标注和句法分析,则必须使用 NLTK;而要根据上下文、主题建模或文档相似性来预测单词,则必须使用 Word2vec。

通过代码说明 NLTK 与 Word2vec 的关系

NLTK 和 Word2vec 可以结合使用,以查找相似的词表示或进行句法匹配。NLTK 工具包可以加载 NLTK 自带的许多软件包,并可以使用 Word2vec 创建模型。之后,该模型可以用于实时词的测试。以下代码展示了二者的结合应用。在进行后续处理之前,请先查看 NLTK 提供的语料库。您可以使用以下命令下载:

nltk(nltk.download('all'))

NLTK 和 Word2vec 的关系

使用 NLTK 下载语料库

请参阅屏幕截图中的代码。

import nltk
import gensim
from nltk.corpus import abc

model = gensim.models.Word2Vec(abc.sents())
X = list(model.wv.vocab)
data = model.most_similar('science')
print(data)

借助 NLTK 和 Word2vec 的关系 Code

输出:

[('law', 0.9415997266769409), ('practice', 0.9276568293571472), ('discussion', 0.9259148836135864), ('agriculture', 0.9257254004478455), ('media', 0.9232194423675537), ('policy', 0.922248125076294), ('general', 0.9166069030761719), ('undertaking', 0.916458249092102), ('tight', 0.9129181504249573), ('board', 0.9107444286346436)]

的解释 Code

  1. nltk 库已导入,您可以从中下载我们将在下一步中使用的 abc 语料库。
  2. Gensim 已导入。如果尚未安装 Gensim Word2vec,请使用命令“pip3 install gensim”进行安装。请参见以下屏幕截图。
使用 PIP 安装 Gensim

使用 PIP 安装 Gensim
  1. 导入已使用 nltk.download('abc') 下载的 abc 语料库。
  2. 将文件作为句子传递给 Word2vec 模型,该模型使用 Gensim 导入。
  3. 词汇以变量的形式存储。
  4. 该模型在样本词上进行了测试。 科学因为这些文件与科学相关。
  5. 模型预测这里出现的类似词语是“科学”。

激活器和 Word2Vec

神经元的激活函数定义了给定一组输入时该神经元的输出。它的灵感来源于我们大脑的活动,在大脑中,不同的神经元会因不同的刺激而被激活。让我们通过下图来理解激活函数。

Word2vec 中的激活函数

理解激活函数

这里 x1、x2、…、x4 是神经网络的节点。

w1、w2、w3 是节点的权重。

所有权重和节点值的总和(Σ)作为激活函数。

为什么要有激活函数?

如果没有使用激活函数,输出将是线性的,但线性函数的功能有限。为了实现诸如目标检测、图像分类等复杂功能,需要使用激活函数。ping 对于使用语音的文本以及许多其他非线性输出,都需要激活函数。

词嵌入(Word2vec)中激活层的计算方式

Softmax 层(归一化指数函数)是输出层函数,用于激活或触发每个节点。另一种方法是分层 Softmax,其复杂度为 O(log )。2而 softmax 的复杂度为 O(V),其中 V 为词汇表大小。二者的区别在于分层 softmax 层的复杂度降低。要理解其功能,请参考以下词嵌入示例:

分层 Softmax 树结构

分层softmax树状结构

假设我们要计算观察到这个词的概率 在给定特定上下文的情况下,从根节点到叶节点的流会首先流向节点 2,然后流向节点 5。因此,如果词汇量为 8,则只需要三次计算。这使得我们可以分解计算单个词的概率().

除了 Hierarchical Softmax 之外还有哪些其他可用选项?

从总体上看,可用的词嵌入选项有:微分 Softmax、CNN-Softmax、重要性采样、自适应重要性采样、噪声对比估计、负采样、自归一化和不频繁归一化。

具体来说,对于 Word2vec,我们有负样本可用。

负采样是一种训练数据采样方法。它与随机梯度下降有些类似,但也有一些区别。负采样只寻找负样本作为训练数据。它基于噪声对比估计,随机采样上下文中不存在的词。这是一种快速的训练方法,并且随机选择上下文。如果预测词出现在随机选择的上下文中,则两个向量会彼此接近。

可以得出什么结论?

激活器就像我们的神经元在受到外部刺激时一样,能够激活神经元。在词嵌入中,Softmax 层是激活神经元的输出层函数之一。在 Word2vec 中,我们可以使用分层 Softmax 和负采样等选项。利用激活器,我们可以将线性函数转换为非线性函数,并利用这些函数实现复杂的机器学习算法。

什么是 Gensim?

金西姆 是一个开源主题建模和自然语言处理工具包,实现于 Python Gensim 工具包支持 Cython 和 Word2vec。用户可以通过导入 Word2vec 进行主题建模,从而发现文本正文中隐藏的结构。Gensim 不仅实现了 Word2vec,还实现了 Doc2vec 和 FastText。

本节重点介绍 Word2vec,因此我们将围绕当前主题展开讨论。

如何使用 Gensim 实现 Word2vec

到目前为止,我们已经讨论了 Word2vec 是什么、它的不同架构、为什么从词袋模型转向 Word2vec、Word2vec 与 NLTK 以及实时代码和激活函数之间的关系。

以下是使用 Gensim 实现 Word2vec 的详细步骤:

步骤1)数据收集

实现任何机器学习模型或自然语言处理的第一步都是数据收集。

请观察数据来构建智能聊天机器人,如下面的 Gensim Word2vec 示例所示。

[{"tag": "welcome",
"patterns": ["Hi", "How are you", "Is any one to talk?", "Hello", "hi are you available"],
"responses": ["Hello, thanks for contacting us", "Good to see you here", "Hi there, how may I assist you?"]
        },
{"tag": "goodbye",
"patterns": ["Bye", "See you later", "Goodbye", "I will come back soon"],
"responses": ["See you later, thanks for visiting", "have a great day ahead", "Wish you Come back again soon."]
        },
{"tag": "thankful",
"patterns": ["Thanks for helping me", "Thank your guidance", "That's helpful and kind from you"],
"responses": ["Happy to help!", "Any time!", "My pleasure", "It is my duty to help you"]
        },
        {"tag": "hoursopening",
"patterns": ["What hours are you open?", "Tell your opening time?", "When are you open?", "Just your timing please"],
"responses": ["We're open every day 8am-7pm", "Our office hours are 8am-7pm every day", "We open office at 8 am and close at 7 pm"]
        },
{"tag": "payments",
"patterns": ["Can I pay using credit card?", "Can I pay using Mastercard?", "Can I pay using cash only?"],
"responses": ["We accept VISA, Mastercard and credit card", "We accept credit card, debit cards and cash. Please don't worry"]
        }
   ]

以下是我们从数据中得出的结论:

  • 这些数据包含三部分:标签、模式和回复。标签代表意图(讨论的主题是什么)。
  • 数据为 JSON 格式。
  • 模式是指用户会向机器人提出的问题。
  • 回复是指聊天机器人针对相应问题/模式提供的答案。

步骤2)数据预处理

处理原始数据非常重要。如果将清理过的数据输入到机器中,那么模型将做出更准确的反应,并更有效地学习数据。

此步骤包括移除停用词、词干提取、去除不必要的词语等。在继续操作之前,请务必加载数据并将其转换为数据框。请参阅以下代码。

import json
json_file = 'intents.json'
with open('intents.json', 'r') as f:
    data = json.load(f)

的解释 Code:

  1. 由于数据为JSON格式,因此导入的是JSON数据。
  2. 文件存储在变量中。
  3. 文件已打开并加载到数据变量中。

数据已导入,现在需要将数据转换为数据框。请参考以下代码了解下一步操作。

import pandas as pd
df = pd.DataFrame(data)
df['patterns'] = df['patterns'].apply(', '.join)

的解释 Code:

1. 使用上面导入的 pandas 将数据转换为数据框。

2. 它将列模式中的列表转换为字符串。

from nltk.corpus import stopwords
from textblob import Word
stop = stopwords.words('english')
df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x.lower() for x in x.split()))
df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation))
df['patterns'] = df['patterns'].str.replace('[^\w\s]', '')
df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if not x.isdigit()))
df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in stop))
df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))

Code 说明:

1. 使用 nltk 工具包中的停用词模块导入英语停用词。

2. 使用 for 循环和 lambda 函数将文本中的所有单词转换为小写。 拉姆达函数 是一个匿名函数。

3. 检查数据框中所有文本行的字符串标点符号,并筛选掉这些行。

4. 使用正则表达式删除数字或点号等字符。

5. Digits 从文本中删除。

6. 在此阶段,停用词被删除。

7. 现在对词语进行过滤,并使用词形还原法去除同一词语的不同形式。至此,数据预处理完成。

输出:

, patterns, responses, tag
0,hi one talk hello hi available,"['Hello, thanks for contacting us', 'Good to see you here', ' Hi there, how may I assist you?']",welcome
1,bye see later goodbye come back soon,"['See you later, thanks for visiting', 'have a great day ahead', 'Wish you Come back again soon.']",goodbye
2,thanks helping thank guidance thats helpful kind,"['Happy to help!', 'Any time!', 'My pleasure', 'It is my duty to help you']",thankful
3,hour open tell opening time open timing please,"[""We're open every day 8am-7pm"", 'Our office hours are 8am-7pm every day', 'We open office at 8 am and close at 7 pm']",hoursopening
4,pay using credit card pay using mastercard pay using cash,"['We accept VISA, Mastercard and credit card', 'We accept credit card, debit cards and cash. Please dont worry']",payments

步骤3)使用Word2vec构建神经网络

现在是时候使用 Gensim Word2vec 模块构建模型了。我们需要从 Gensim 导入 Word2vec 模块。导入完成后,我们将构建模型,并在最后阶段使用实时数据验证模型。

from gensim.models import Word2Vec

现在我们可以成功地使用 Word2Vec 构建模型了。请参考下一行代码,了解如何使用 Word2Vec 创建模型。模型接收的文本以列表的形式提供,因此我们将使用以下代码将数据框中的文本转换为列表。

Bigger_list = []
for i in df['patterns']:
     li = list(i.split(""))
     Bigger_list.append(li)
Model = Word2Vec(Bigger_list, min_count=1, size=300, workers=4)

的解释 Code:

1. 创建了更大的列表,并将内部列表追加到其中。这是提供给 Word2Vec 模型的数据格式。

2. 实现一个循环,并遍历数据框中 patterns 列的每个条目。

3. 列模式的每个元素都被拆分并存储在内部列表 li 中。

4. 将内部列表与外部列表合并。

5. 此列表提供给 Word2Vec 模型。让我们来了解一下这里提供的一些参数。

最小计数: 它会忽略所有总频率低于此值的词语。

规格: 它告诉了词向量的维数。

工人: 这些是用于训练模型的线程。

还有其他一些选择,下面将解释其中一些重要的选择。

窗口: 句子中当前单词和预测单词之间的最大距离。

新加坡: 这是一个训练算法:1 代表 skip-gram 模型,0 代表连续词袋模型。我们已在前面详细讨论过这些内容。

HS: 如果该值为 1,则表示我们使用分层 softmax 进行训练;如果该值为 0,则表示使用负采样。

Α: 初始学习率。

让我们在下面显示最终的代码:

# list of libraries used by the code
import string
from gensim.models import Word2Vec
import logging
from nltk.corpus import stopwords
from textblob import Word
import json
import pandas as pd
# data in json format
json_file = 'intents.json'
with open('intents.json', 'r') as f:
    data = json.load(f)
# displaying the list of stopwords
stop = stopwords.words('english')
# dataframe
df = pd.DataFrame(data)

df['patterns'] = df['patterns'].apply(', '.join)
# cleaning the data using the NLP approach
print(df)
df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x.lower() for x in x.split()))
df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in string.punctuation))
df['patterns'] = df['patterns'].str.replace('[^\w\s]', '')
df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if not x.isdigit()))
df['patterns'] = df['patterns'].apply(lambda x: ' '.join(x for x in x.split() if x not in stop))
df['patterns'] = df['patterns'].apply(lambda x: " ".join([Word(word).lemmatize() for word in x.split()]))
# taking the outer list
bigger_list = []
for i in df['patterns']:
    li = list(i.split(" "))
    bigger_list.append(li)
# structure of data to be taken by the model.word2vec
print("Data format for the overall list:", bigger_list)
# custom data is fed to machine for further processing
model = Word2Vec(bigger_list, min_count=1, size=300, workers=4)

步骤4)模型保存

模型可以保存为二进制文件(bin)或模型文件。二进制文件是二进制格式。请参考以下代码保存模型。

model.save("word2vec.model")
model.save("model.bin")

上面代码的解释

1. 模型以 .model 文件的形式保存。

2. 模型以 .bin 文件的形式保存。

我们将使用此模型进行实时测试,例如相似词、不相似词和最常用词。

步骤5)加载模型并进行实时测试

使用以下代码加载模型:

model = Word2Vec.load('model.bin')

如果要打印其中的词汇表,可以使用以下命令:

vocab = list(model.wv.vocab)

请看结果:

['see', 'thank', 'back', 'thanks', 'soon', 'open', 'mastercard', 'card', 'time', 'pay', 'talk', 'cash', 'one', 'please', 'goodbye', 'thats', 'helpful', 'hour', 'credit', 'hi', 'later', 'guidance', 'opening', 'timing', 'hello', 'helping', 'bye', 'tell', 'come', 'using', 'kind', 'available']

步骤 6)检查最相似的单词

让我们实际地实施这些事情:

similar_words = model.most_similar('thanks')
print(similar_words)

请看结果:

[('kind', 0.16104359924793243), ('using', 0.1352398842573166), ('come', 0.11500970274209976), ('later', 0.09989878535270691), ('helping', 0.04855936020612717), ('credit', 0.04659383371472359), ('pay', 0.0329081267118454), ('thank', 0.02484947443008423), ('hour', 0.0202352125197649), ('opening', 0.018177658319473267)]

步骤 7) 与提供的单词不匹配

dissimlar_words = model.doesnt_match('See you later, thanks for visiting'.split())
print(dissimlar_words)

我们已经提供了文字 再见,谢谢光临。这段代码会打印出这些单词中最不相似的单词。让我们运行这段代码,看看结果如何。

上述代码执行后的结果:

Thanks

步骤 8)查找两个单词之间的相似度

这部分结果以两个词相似度的概率形式呈现。请参考以下代码了解如何执行此部分。

similarity_two_words = model.similarity('please', 'see')
print("Please provide the similarity between these two words:")
print(similarity_two_words)

上述代码的运行结果如下:

0.13706

您还可以通过执行以下代码查找更相似的词语:

similar = model.similar_by_word('kind')
print(similar)

上述代码的输出结果:

[('credit', 0.11764447391033173), ('cash', 0.11440904438495636), ('one', 0.11151769757270813), ('hour', 0.0944807156920433), ('using', 0.0705675333738327), ('thats', 0.05206916481256485), ('later', 0.04502468928694725), ('bye', 0.03960943967103958), ('back', 0.03837274760007858), ('thank', 0.0380823090672493)]

常见问题

Word2Vec 为每个词生成一个固定的向量。而像 BERT 和 GPT 这样的现代人工智能模型则生成上下文嵌入,这意味着同一个词会根据其上下文的不同而获得不同的向量,从而更精确地捕捉词义。

是的。词嵌入在轻量级任务、搜索、推荐和聚类等对速度和计算量要求较高的场景中仍然非常有用。它们也是大型语言模型中嵌入层的基础概念。

不。Word2Vec 是一种浅层神经网络,只有一个隐藏层。虽然它的灵感来源于神经网络,但它并不属于深度学习,深度学习需要在输入和输出之间设置多个隐藏层。

常见的向量维度范围为 100 到 300 维。较小的维度训练速度更快,适合小型数据集;而较大的维度可以捕捉更丰富的关系,但需要更多的数据和计算资源来避免过拟合。

不。Word2Vec 无法处理词汇表之外的词,因为它为每个已知词学习一个向量。像 FastText 这样的模型通过从字符 n-gram 构建词向量来解决这个问题,从而能够表示未见过的词。

总结一下这篇文章: