word2vec的理解与使用

通俗理解word2vec

Word2vec,是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词。训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系,该向量为神经网络之隐藏层。

这个模型是如何定义数据的输入和输出呢?一般分为CBOW(Continuous Bag-of-Words,词袋模型 )与Skip-Gram两种模型。CBOW模型的训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。Skip-Gram模型和CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。

word2vec的使用

word2vec的安装
1
pip install gensim
模型构建参数详解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from gensim.models import word2vev

model=word2vec.Word2Vec(sentences,sg=1,size=100,window=5,min_count=2,negative=3,sample=0.001,hs=1,workers=4)

# 该步骤也可分解为以下三步(但没必要):
# model=gensim.model.Word2Vec() 建立一个空的模型对象
# model.build_vocab(sentences) 遍历一次语料库建立词典
# model.train(sentences) 第二次遍历语料库建立神经网络模型

# sentences 是训练所需数据
# sg=1 是skip—gram算法,对低频词敏感,默认sg=0为 CBOW 算法
# size 是神经网络层数,值太大则会耗内存并使算法计算变慢,一般值取为100到200之间
# window 是句子中当前词与目标词之间的最大距离,3表示在目标词前看3-b个词,后面看b个词(b在0-3之间随机)
# min_count 是对词进行过滤,频率小于 min-count 的单词则会被忽视,默认值为5
# negative 和 sample 可根据训练结果进行微调,sample 表示更高频率的词被随机下采样到所设置的阈值,默认值为 1e-3
# negative: 如果>0,则会采用 negativesamping,用于设置多少个 noise words
# hs=1 表示层级 softmax 将会被使用,默认 hs=0 且 negative 不为0,则负采样将会被选择使用
# workers 是线程数,此参数只有在安装了 Cpython 后才有效,否则只能使用单核

这里着重介绍一下sentences参数,它可由以下两种格式载入:

1、文本格式

将所有词语用空格分隔,存入txt文本中。那么获取数据可以使用如下方法:

1
sentences = word2vec.Text8Corpus("test.txt")  # text8为语料库文件名

2、list嵌套格式

1
sentences = [["a","b"],["b","c"] ... ]

模型操作

1、保存模型

1
2
3
model.save("文本名")	# 模型会保存到该 .py文件同级目录下,该模型打开为乱码

# model.wv.save_word2vec_format("文件名",binary = "Ture/False") #通过该方式保存的模型,能通过文本格式打开,也能通过设置binary是否保存为二进制文件。但该模型在保存时丢弃了树的保存形式(详情参加word2vec构建过程,以类似哈夫曼树的形式保存词),所以在后续不能对模型进行追加训练

2、加载模型

1
model = Word2Vec.load("模型文件名")

3、模型追加训练

1
model.train(more_sentences)

输出
1
2
3
4
5
6
7
8
# 计算一个词的最近似的词:
model.most_similar("word", topn=10) # 计算与该词最近似的词,topn指定排名前n的词

# 计算两个词的相似度:
model.similarity("word1", "word2")

# 获取词向量:
model ['word']