NLP(三):词向量

2 阅读3分钟

自然语言处理,处理的是自然的需要,通过分词后得到我们想要的词,但是不可能直接把这种自然语言传递给计算机来理解。这时候就有一个概念叫词向量,用来表示词的特征向量或表征。

一,词向量的表示

词向量的表示主要有两种方式:独热编码(One-hot Representation)和分布式表示(Distributed Representation)

(1)独热编码

独热编码是一种比较常用的方式,其思路是每个词都表示成一个很长很长的向量,该向量的维度等于词表大小,其中只有一个维度的值为1(维度的位置等于词的id),其余维度都为0。

例如用[0 0 1 0 0 0 0 0......]表示‘常用’这个词,用[0 0 0 0 0 0 0 1......]表示‘方式’这个词

(2)分布式表示

使用特定维度的低维实数向量来表示单词的方法称分布式表示。

例如表示如下 [0.777 -0.04 -0.153 0.406 ...]

基于衡量向量距离的方法(如欧式距离、余弦距离等)可以用来度量单词间的相似度,将语义信息融合进了词向量中

那么语义上相近或相似的词,在向量空间上的距离会更接近,而语义相反的词距离会更远。

而在训练时,由于分布式表示是将原始数据投射到了一个较低维度的空间,所需的参数会更少,对于训练也是有好处的。

二,词嵌入

而描述词向量的分布式表示技术也有个专有名词叫词嵌入(word embedding)

有很多的Word Embedding 模型,比如Word2Vec、GloVe、FastText。

Word2Vec 这里主要讲一下Word2Vec Word2vec,是用来产生词向量的相关模型,为浅而双层的神经网络

Word2vec有两种主要的模型架构,CBOW(Continuous Bag of Words)又叫连续词袋和Skip-Gram两种模式

  • 连续词袋模型(CBOW):CBOW模型试图从一个词的上下文窗口中预测目标词。例如,给定一个上下文窗口中的单词序列,CBOW模型的目标是预测这些单词的中心词。这样,模型学习到的向量表示能够捕捉到上下文中的语义信息。

  • Skip-gram模型:与CBOW相反,Skip-gram模型从一个词中预测其周围的上下文。也就是说,给定一个中心词,Skip-gram模型的目标是预测其周围的上下文单词。通过这种方式,Skip-gram模型学习到的向量表示能够更好地反映单词的语义。

CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好

如果要使用该模型,可以借助python的第三方库gensim,里面有自带的Word2Vec函数,可以来训练自己语料库的词向量

示例代码如下:

from gensim.models import Word2Vec

# 定义训练语料库
sentences = [["this", "is", "a", "good", "book"],
             ["this", "is", "a", "pen"],
             ["that", "is", "a", "bad", "book"]]

# 训练 Word2Vec 模型
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)

# 获取词向量表示
vector_good = model.wv['good']
print("Vector representation of 'good':", vector_good)

# 查找与给定单词最相似的单词
similar_words = model.wv.most_similar('good', topn=2)
print("Words most similar to 'good':", similar_words)

这段代码首先导入 Word2Vec 类,然后定义了一个简单的训练语料库 sentences,包含了几个简单的句子。然后,通过 Word2Vec 类构建了 Word2Vec 模型,并传入了训练语料库 sentences。在训练过程中,我们可以指定诸如向量维度 vector_size、上下文窗口大小 window、最小词频 min_count 等参数。最后,我们可以使用模型的 wv 属性来获取单词的向量表示,并使用 most_similar 方法来查找与给定单词最相似的单词