自然语言处理,处理的是自然的需要,通过分词后得到我们想要的词,但是不可能直接把这种自然语言传递给计算机来理解。这时候就有一个概念叫词向量,用来表示词的特征向量或表征。
一,词向量的表示
词向量的表示主要有两种方式:独热编码(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 方法来查找与给定单词最相似的单词