Word2Vector介绍

word2vector

word2vec简介

word2vec的核心是神经网络,采用 CBOW(Continuous Bag-Of-Words,即连续的词袋模型)和 Skip-Gram 两种模型,将词语映像到同一坐标系,输出为数值型向量的方法。

简而言之,就是将人类才可以看懂的文字,转换为机器也可以识别、操作、处理的数值,将一串文字转化为一个数值型向量的过程。

如果将语言模型即为f,那么word2vec就是去训练这个f,不关注这个模型是否完美,而是要获取模型产生的参数,对于word2vec,就是神经网络的权重参数,将这些参数作为句子S的替代,由这些参数组成的向量,就是我们所谓的“词向量”,这也就是word2vec的输出。语言模型正是为了考察句子,或者说由词a到词b存在在句子中的概率而存在的。

word2vec从大量文本语料中以无监督的方式学习语义信息,即通过一个嵌入空间使得语义上相似的单词在该空间内距离很近。比如“机器”和“机械”意思很相近,而“机器”和“猴子”的意思相差就很远了,那么由word2vec构建的这个数值空间中,“机器”和“机械”的距离较“机器”和“猴子”的距离而言是要近很多的。

Skip-gram和CBOW

Skip-gram是通过一个词a去预测它周围的上下文;而CBOW相反,是通过上下文来预测其间的词。CBOW一般用于数据,而Skip-Gram通常用在数据量较大的情况。

Skip-gram是一个单隐藏层的神经网络结构,那么我们要找的词向量其实就是输入层到第一个隐藏层的权重。

  • 现在假设Skip-gram是一个最简单的情况,用一个输入词去预测它相邻的一个词。
  • 如果词表中有10000个词,那么每个词进行one-hot编码后,就会是一个10000维的向量,其中9999个都是0,只有一个是1。
  • 从输入层到隐藏层没有使用激活函数,但在输出层中使用了softmax(类似逻辑回归中的logstic变换)。
  • 在输出层通过softmax进行变换,使输出层每个结点将会输出一个0-1之间的值(概率),这些所有输出层结点的概率之和为1。最终得到这个1×100的向量。

数据处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import jieba

# 停用词
def getStopwords(filePath):
stopwords = [line.strip() for line in open(filePath, 'r', encoding='utf-8').readlines()] # 按行读取
return stopwords

# 分词
def segment(sentence):
segmentWords = jieba.cut(sentence.strip())
stopwords = getStopwords('stop_words.txt') # 加载停用词
words = ''
for word in segmentWords:
if word not in stopwords:
if word != '\t':
words += word
words += " " # 分割符
return words

inputs = open('test_data.txt', 'r', encoding='utf-8')
outputs = open('test_data_segmented.txt', 'w')

for line in inputs:
line_seg = segment(line) # 分词长串
outputs.write(line_seg + '\n')

outputs.close()
inputs.close()

模型训练

1
2
3
4
5
6
7
8
9
10
11
12
from gensim.models import word2vec

# 训练word2vec模型,生成词向量
data = word2vec.LineSentence('test_data_segmented.txt')
# size,指定了训练时词向量维度,默认为100
# window,窗口
# min_count,指定了需要训练词语的最小出现次数,默认为5
# workers,指定了完成训练过程的线程数,默认为1不使用多线程
model = word2vec.Word2Vec(data, size=20, window=5, min_count=5, workers=4)

# 保存模型
model.save('test_data_model.model')

模型加载

1
2
3
4
5
6
7
8
9
import gensim.models

model = gensim.models.Word2Vec.load('test_data_model.model') # 载入.model模型
print(model.wv.vocab) # 向量词汇
print(model['NBA']) # 向量结果
print(model.most_similar(['NBA'])) # 一个词的最近似的词,倒排序
print(model.similarity('体育', 'NBA')) # 两词的相似度
print(model.n_similarity(['最佳', 'NBA', '上线', '对手'], ['NBA', '年度', '最佳'])) # 相似度
print(model.most_similar(positive=['体育', 'NBA'], negative=['黑暗'], topn=2)) # 计算两词之间的余弦相似度
------ 本文结束------

本文标题:Word2Vector介绍

文章作者:Perkins

发布时间:2020年01月09日

原始链接:https://perkins4j2.github.io/posts/44927/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。