1、词向量word2vec介绍

词向量提供了一种数学化的方法,把自然语言信息转化成向量形式的数字信息。这样便可以把自然语言的理解问题转化视为机器学习问题来处理。

其中最常用的词向量模型无非是 one-hot Representation模型和 distributed representation 模型。

1.1 One-hot Representation模型

One-hot Representation 就是用一个很长的向量来表示一个词,向量长度为词典的大小N,每个向量只有一个维度为1,其余维度全部为0,为1的位置表示该词语在词典的位置。

举个常见例子:

“话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 …] 
“麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 …]

这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁,也就是给每个词分配一个数字 ID。但这种表示方式有两个缺点: 
(1)容易受维数灾难的困扰,每个词语的维度就是语料库字典的长度。 
(2)词语的编码往往是随机的,导致不能很好地刻画词与词之间的相似性

1.2 distributed representation 模型

Distributed representation 最早由 Hinton在1986 年提出。其依赖思想是:词语的语义是通过上下文信息来确定的,即相同语境出现的词,其语义也相近。

1.3 Distributed Representation与one-hot representation对比

在形式上,one-hot representation 词向量是一种稀疏词向量,其长度就是字典长度,而Distributed Representation是一种固定长度的稠密词向量。一般长这样:[0.792, −0.177, −0.107, 0.109, −0.542, …]
在功能上,Distributed representation 最大的贡献就是让相关或者相似的词,在距离上更接近了。
关于生成 Distributed representation 形式的词向量,除了word2vec外,还有其他生成的方式。如:LSA矩阵分解模型、 PLSA 潜在语义分析概率模型、LDA 文档生成模型。但本文只关注 word2vec 这种方式,其他不做介绍。

将word映射到一个新的空间中,并以多维的连续实数向量进行表示叫做“Word Represention” 或 “Word Embedding”。自从21世纪以来,人们逐渐从原始的词向量稀疏表示法过渡到现在的低维空间中的密集表示。用稀疏表示法在解决实际问题时经常会遇到维数灾难,并且语义信息无法表示,无法揭示word之间的潜在联系。而采用低维空间表示法,不但解决了维数灾难问题,并且挖掘了word之间的关联属性,从而提高了向量语义上的准确度。

2、Word2vec 训练介绍

Word2Vec 实际上是两种不同思想实现的:CBOW(Continuous Bag of Words) 和 Skip-gram。

CBOW的目标是根据上下文来预测当前词语的概率,且上下文所有的词对当前词出现概率的影响的权重是一样的,因此叫continuous bag-of-words模型。如在袋子中取词,取出数量足够的词就可以了,至于取出的先后顺序是无关紧要的。

Skip-gram刚好相反:根据当前词语来预测上下文的概率。

这两种方法都利用人工神经网络作为它们的分类算法。起初每个单词都是一个随机 N 维向量。经过训练之后,该算法利用 CBOW 或者 Skip-gram 的方法获得了每个单词的最优向量。训练过程如下图所示: 

达观杯文本处理(三)--word2vec
按照学习word2vec一般套路,接下来就是实现CBOW 和 Skip-gram 这两种思想的方法了— Hierarchical Softmax 和 negative sampling。

3 Python Gensim 使用介绍
word2vec代码实践用的是Python的Gensim工具包。

Gensim的word2vec的输入是句子的序列,每个句子是一个单词列表。且本文用 20newsgroups 语料来训练word2vec模型。代码如下:

训练模型
# coding:utf-8

from sklearn.datasets import fetch_20newsgroups、

from gensim.models import word2vec
from bs4 import BeautifulSoup
import re
import nltk
import time

start = time.time()

news = fetch_20newsgroups(subset='all')
X, y = news.data, news.target


def news_to_sentences(news):
    news_text = BeautifulSoup(news).get_text()
    tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
    raw_sentences = tokenizer.tokenize(news_text)
    sentences = []
    for sent in raw_sentences:
        sentences.append(re.sub('[^a-zA-Z]', ' ', sent.lower().strip()).split())
    return sentences


# 句子词语列表化
sentences = []
for x in X:
    sentences.extend(news_to_sentences(x))

# 设置词语向量维度
num_featrues = 300
# 保证被考虑词语的最低频度
min_word_count = 20
# 设置并行化训练使用CPU计算核心数量
num_workers = 2
# 设置词语上下午窗口大小
context = 5
downsampling = 1e-3

model = word2vec.Word2Vec(sentences, workers=num_workers, size=num_featrues, min_count=min_word_count, window=context, sample=downsampling)

model.init_sims(replace=True)

# 输入一个路径,保存训练好的模型,其中./data/model目录事先要存在
model.save("./data/model/word2vec_gensim")
# model.wv.save_word2vec_format("data/model/word2vec_org","data/model/vocabulary",binary=False)

4、Word2vec 默认参数
常用参数说明

达观杯文本处理(三)--word2vec
加载模型和程序参考链接:https://github.com/Heitao5200/DGB/blob/master/feature/feature_code/train_word2vec.py

加载模型:

from gensim.models import word2vec

# 加载模型
model = word2vec.Word2Vec.load("训练数据.csv")


本文参考链接及学习资料:
https://blog.csdn.net/xsdxs/article/details/72951545 
 

相关文章:

  • 2021-05-09
  • 2022-01-02
  • 2021-07-20
  • 2021-06-11
  • 2021-04-25
  • 2021-05-16
猜你喜欢
  • 2021-11-30
  • 2021-08-01
  • 2021-04-29
  • 2021-08-05
  • 2021-11-30
相关资源
相似解决方案