📜  Gensim-开发单词嵌入

📅  最后修改于: 2020-10-16 02:32:00             🧑  作者: Mango


本章将帮助我们理解在Gensim中开发单词嵌入。

词嵌入是表示单词和文档的一种方法,是文本的密集矢量表示,其中具有相同含义的单词具有相似的表示。以下是词嵌入的一些特征-

  • 这是一类技术,将各个单词表示为预定义矢量空间中的实值矢量。

  • 由于每个单词都映射到一个矢量,并且矢量值的获取方法与NN(神经网络)的学习方式相同,因此该技术通常被归入DL(深度学习)领域。

  • 词嵌入技术的关键方法是每个词的密集分布表示。

不同的词嵌入方法/算法

如上所述,词嵌入方法/算法从文本语料库中学习实值向量表示。该学习过程可以与NN模型一起用于诸如文档分类之类的任务,也可以是不受监督的过程,如文档统计。在这里,我们将讨论两种方法/算法,可用于从文本中学习单词嵌入-

Google的Word2Vec

由Tomas Mikolov等开发的Word2Vec。等是2013年在Google投入使用的一种统计方法,可以有效地学习从文本语料库中嵌入的单词。它实际上是作为一种响应而开发的,以使基于NN的词嵌入训练更加有效。它已成为词嵌入的事实上的标准。

Word2Vec的单词嵌入涉及对学习到的向量的分析以及对单词表示的向量数学的探索。以下是可以用作Word2Vec方法一部分的两种不同的学习方法-

  • CBoW(连续词袋)模型
  • 连续跳格模型

斯坦福的GloVe

GloVe(用于词表示的全局向量)是Word2Vec方法的扩展。它是由Pennington等开发的。在斯坦福。 GloVe算法是两者的混合-

  • LSA(潜在语义分析)等矩阵分解技术的全局统计
  • Word2Vec中基于本地上下文的学习。

如果我们谈论它的工作原理,那么GloVe会使用整个文本语料库中的统计信息来构造一个显式的单词共现矩阵,而不是使用窗口来定义本地上下文。

开发Word2Vec嵌入

在这里,我们将使用Gensim开发Word2Vec嵌入。为了使用Word2Vec模型,Gensim向我们提供了可以从models.word2vec导入的Word2Vec类。对于其实现,word2vec需要大量文本,例如整个Amazon评论语料库。但是在这里,我们将把这种原理应用于小内存文本。

实施实例

首先,我们需要从gensim.models导入Word2Vec类,如下所示:

from gensim.models import Word2Vec

接下来,我们需要定义训练数据。我们不是使用大型文本文件,而是使用一些句子来实现此原理。

sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
   ['this', 'is', 'the', 'tutorials' 'point', 'website'],
   ['you', 'can', 'read', 'technical','tutorials', 'for','free'],
   ['we', 'are', 'implementing','word2vec'],
   ['learn', 'full', 'gensim', 'tutorial']
]

提供训练数据后,我们需要训练模型。它可以做到如下-

model = Word2Vec(sentences, min_count=1)

我们可以将模型总结如下-;

print(model)

我们可以将词汇总结如下-

words = list(model.wv.vocab)
print(words)

接下来,让我们访问一个单词的向量。我们正在为“教学”这个词做。

print(model['tutorial'])

接下来,我们需要保存模型-

model.save('model.bin')

接下来,我们需要加载模型-

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

最后,如下打印保存的模型:

print(new_model)

完整的实施实例

from gensim.models import Word2Vec
sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
   ['this', 'is', 'the', 'tutorials' 'point', 'website'],
   ['you', 'can', 'read', 'technical','tutorials', 'for','free'],
   ['we', 'are', 'implementing','word2vec'],
   ['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
print(model)
words = list(model.wv.vocab)
print(words)
print(model['tutorial'])
model.save('model.bin')
new_model = Word2Vec.load('model.bin')
print(new_model)

输出

Word2Vec(vocab=20, size=100, alpha=0.025)
[
   'this', 'is', 'gensim', 'tutorial', 'for', 'free', 'the', 'tutorialspoint', 
   'website', 'you', 'can', 'read', 'technical', 'tutorials', 'we', 'are', 
   'implementing', 'word2vec', 'learn', 'full'
]
[
   -2.5256255e-03 -4.5352755e-03 3.9024993e-03 -4.9509313e-03
   -1.4255195e-03 -4.0217536e-03 4.9407515e-03 -3.5925603e-03
   -1.1933431e-03 -4.6682903e-03 1.5440651e-03 -1.4101702e-03
   3.5070938e-03 1.0914479e-03 2.3334436e-03 2.4452661e-03
   -2.5336299e-04 -3.9676363e-03 -8.5054158e-04 1.6443320e-03
   -4.9968651e-03 1.0974540e-03 -1.1123562e-03 1.5393364e-03
   9.8941079e-04 -1.2656028e-03 -4.4471184e-03 1.8309267e-03
   4.9302122e-03 -1.0032534e-03 4.6892050e-03 2.9563988e-03
   1.8730218e-03 1.5343715e-03 -1.2685956e-03 8.3664013e-04
   4.1721235e-03 1.9445885e-03 2.4097660e-03 3.7517555e-03
   4.9687522e-03 -1.3598346e-03 7.1032363e-04 -3.6595813e-03
   6.0000515e-04 3.0872561e-03 -3.2115565e-03 3.2270295e-03
   -2.6354722e-03 -3.4988276e-04 1.8574356e-04 -3.5757164e-03
   7.5391348e-04 -3.5205986e-03 -1.9795434e-03 -2.8321696e-03
   4.7155009e-03 -4.3349937e-04 -1.5320212e-03 2.7013756e-03
   -3.7055744e-03 -4.1658725e-03 4.8034848e-03 4.8594419e-03
   3.7129463e-03 4.2385766e-03 2.4612297e-03 5.4920948e-04
   -3.8912550e-03 -4.8226118e-03 -2.2763973e-04 4.5571579e-03
   -3.4609400e-03 2.7903817e-03 -3.2709218e-03 -1.1036445e-03
   2.1492650e-03 -3.0384419e-04 1.7709908e-03 1.8429896e-03
   -3.4038599e-03 -2.4872608e-03 2.7693063e-03 -1.6352943e-03
   1.9182395e-03 3.7772327e-03 2.2769428e-03 -4.4629495e-03
   3.3151123e-03 4.6509290e-03 -4.8521687e-03 6.7615538e-04
   3.1034781e-03 2.6369948e-05 4.1454583e-03 -3.6932561e-03
   -1.8769916e-03 -2.1958587e-04 6.3395966e-04 -2.4969708e-03
]
Word2Vec(vocab=20, size=100, alpha=0.025)

可视化单词嵌入

我们还可以通过可视化探索单词嵌入。可以通过使用经典的投影方法(如PCA)将高维字向量简化为二维图来完成。一旦减少,我们就可以将它们绘制在图形上。

使用PCA绘制单词向量

首先,我们需要从经过训练的模型中检索所有向量,如下所示:

Z = model[model.wv.vocab]

接下来,我们需要通过使用PCA类来创建单词向量的二维PCA模型,如下所示:

pca = PCA(n_components=2)
result = pca.fit_transform(Z)

现在,我们可以使用matplotlib绘制结果投影,如下所示:

Pyplot.scatter(result[:,0],result[:,1])

我们还可以使用单词本身在图形上注释这些点。通过使用matplotlib绘制结果投影,如下所示:

words = list(model.wv.vocab)
for i, word in enumerate(words):
   pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))

完整的实施实例

from gensim.models import Word2Vec
from sklearn.decomposition import PCA
from matplotlib import pyplot
sentences = [
   ['this', 'is', 'gensim', 'tutorial', 'for', 'free'],
    ['this', 'is', 'the', 'tutorials' 'point', 'website'],
    ['you', 'can', 'read', 'technical','tutorials', 'for','free'],
    ['we', 'are', 'implementing','word2vec'],
    ['learn', 'full', 'gensim', 'tutorial']
]
model = Word2Vec(sentences, min_count=1)
X = model[model.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model.wv.vocab)
for i, word in enumerate(words):
   pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()

输出

Word2Vec