Word2Vec的基本使用

时间:2021-06-12 23:20:51

gensim 是 Python 中一款强大的 自然语言处理工具,它包含了常见的模型,其中便有 Word2Vec 这一优秀的 词向量训练工具,可以使用 pip install gensim 命令安装 gensim,本博客主要参考 官方文档 对 Word2Vec 作简单的介绍

1、建立模型

首先,我们需要从 gensim 导入 Word2Vec

from gensim.models import Word2Vec

然后,可以通过以下三个步骤建立一个简单的 Word2Vec 模型

model = Word2Vec() // 建立空的模型对象
model.build_vocab(sentences) // 遍历一次训练语料,建立词典
model.train(sentences) // 遍历一次训练语料,建立神经网络模型

其实,还可以使用一条语句同时完成以上三个步骤

model = Word2Vec(sentences)

并在以上语句中指定训练参数,除 sentences 用于指定训练语料外,还有其它 20 个参数

  • sentences:指定训练语料,默认为 None
  • size:定义特征向量维度,一般取值在 100 到 200 之间,默认为 100
  • alpha:定义初始学习率,随着训练进行,线性下降到 min_alpha,默认值为 0.025
  • window:句子中当前和预测单词之间的最大距离,默认值为 5
  • min_count:词过滤的阈值,频率小于 min_count 的单词会被过滤,默认值为 5
  • max_vocab_size:在构建词汇期间使用的最大 RAM,默认设置为 None,表示无限制
  • sample:高频词语被随机采样的阈值,默认值为 1e-3,有效范围为(0, 1e-5)
  • seed:随机数生成器,用于初始化向量,默认值为 1
  • workers:使用多线程训练模型,定义线程数,默认值为 3,只有在安装 Cpython 后才有效
  • min_alpha:定义最小学习率,随着训练进行,从 alpha 线性到 min_alpha,默认值为 0.0001
  • sg:定义训练算法,若 sg=0,则使用 CBOW 算法,默认值;若 sg=1,则使用 skip-gram 算法
  • hs:若 hs=0 且 negative 不等于 0,则使用负采样,默认值;若 hs=1,则使用层级 softmax 训练模型
  • negative:若 negative>0,则使用负采样,若 negative=0,则不使用负采样,通常取值在 5 到 20 之间,默认值为 5
  • cbow_mean:仅适用于使用 CBOW 算法时,若 cbow_mean=1,则使用均值,默认值;若 cbow_mean=0,则使用上下文单词向量的总和
  • hashfxn:用于随机初始化权重的哈希函数,默认是 Python 内置的哈希函数
  • iter:语料库上的迭代次数,默认值为 5
  • null_word:默认值为 0
  • trim_rule:词汇修剪规则,指定是否保留某些词,默认值为 None
  • sorted_vocab:如果 sorted_vocab=1(默认值),则在分配单词索引之前按降序频率对词汇表进行排序
  • batch_words:传递给工作线程的目标大小,以字单位,默认值为 MAX_WORDS_IN_BATCH
  • compute_loss:定义是否同时计算损失率,默认为 False

以下的例子使用 gensim 中内置的训练语料 common_texts,建立一个简单的 Word2Vec 模型

>>> from gensim.test.utils import common_texts # 导入 common_texts
>>> print(type(common_texts))
# <class 'list'>
>>> from gensim.models import Word2Vec # 导入 Word2Vec
>>> print(type(Word2Vec))
# <class 'type'>
>>> model = Word2Vec(common_texts, min_count=1) # 建立模型
>>> print(type(model))
# <class 'gensim.models.word2vec.Word2Vec'>

2、保存与加载模型

(1)完整对象状态模型

我们可以保存和加载完整的对象状态模型,并可以在以后继续训练该模型

>>> # 保存模型
>>> model.save('word2vec.model')
>>> # 加载模型
>>> model = Word2Vec.load('word2vec.model')
>>> # 继续训练
>>> model.train([['hello', 'world']], total_examples=1, epochs=1)

(2)KeyedVectors

训练过的单词向量 KeyedVectors 存储在 model.wv 中

>>> vector = model.wv['hello']
>>> print(type(vector))
<class 'numpy.ndarray'>

我们可以保存和加载 KeyedVectors

>>> from gensim.models import KeyedVectors
>>> # 保存 KeyedVectors
>>> model.wv.save('word2vec.wv')
>>> # 加载 KeyedVectors 
>>> wv = KeyedVectors.load("word2vec.wv", mmap='r')

也可以保存和加载 C 格式的 KeyedVectors

在以下语句中,若 binary = False,则使用 C text format;若 binary = True,则使用 C bin format

>>> from gensim.models import KeyedVectors
>>> # 保存 C bin 格式的 KeyedVectors
>>> model.wv.save_word2vec_format('word2vec.bin', binary=True)
>>> # 加载 C bin 格式的 KeyedVectors
>>> wvb = KeyedVectors.load_word2vec_format('word2vec.bin', binary=True)

注意:之所以使用 KeyedVectors 的原因,是因为当不再需要完整的模型状态,即模型不再进行更新,仅用于查询时,可以丢弃状态,从而产生可以 mmap 的更小更快的对象

>>> word_vectors = model.wv
>>> del model

3、使用模型

(1)获取词向量

>>> word_vectors['computer']

(2)计算相关词

most_similar(positive=None, negative=None, topn=10, restrict_vocab=None, indexer=None)
  • positive:对相似度有正贡献的词语列表
  • negative:对相似度有负贡献的词语列表
  • topn:返回 topn 个最相似值,默认为 10
  • restrict_vocab:限制搜索最相似值的范围
>>> word_vectors.most_similar(positive=['computer'],negative=['human'],topn=5)
# [('interface', 0.16314822435379028), 
# ('eps', 0.04694916307926178), 
# ('minors', 0.02557777240872383), 
# ('system', -0.003941739443689585), 
# ('time', -0.043815042823553085)]

(3)计算余弦相似度

计算两个词语之间的余弦相似度:similarity(w1, w2)

>>> word_vectors.similarity('computer', 'user')
# -0.16924392

计算两个集合之间的余弦相似度:similarity(ws1, ws2)

>>> word_vectors.n_similarity(['computer','system'], ['user', 'response'])
# -0.032896347

(4)选出不同类的词

doesnt_match(words)
  • words:词语列表
>>> word_vectors.doesnt_match(['computer','system','interface','trees'])
# 'trees'