一、什么是词向量
词向量(Word embedding)是自然语言处理(NLP)领域中的一种语言建模和特征学习技术,它将词汇表中的单词或短语映射到实数向量。
1、词向量的表示方法主要有以下两种:
- 独热向量(One-hot encoding)
- 分布式表示(Distributed representation)
2、词向量的示意图:
二、独热向量(One-hot encoding)
1、什么是one-hot编码
- one-hot编码是一种传统的表示方法,其中每个单词都被表示为一个高维向量,向量的维度等于词汇表的大小。在该向量中,除了对应单词位置的元素为1外,其余元素均为0。这种表示方法简单直观,但无法表达单词之间的相似性和关联性。
2、one-hot编码的表示
1、对一句话表示
- 首先将一句话进行分词例如:[“我”,“爱”,“我的”,“祖国”]
- 将每个词进行编码:
- “我”表示为[1,0,0,0]
- “爱”表示为[0,1,0,0]
- “我的”表示为[0,0,1,0]
- “祖国”表示为[0,0,0,1]
- “我爱我的祖国则表示为:[1,1,1,1]
- “我爱祖国表示为”:[1,1,0,1]
2、在对文本向量化时,也可以考虑词频
- 你好:[0,0,0,1,0]
- 你好 你好:[0,0,0,2,0]
3、one-hot编码的缺点
- 如果有很多词,编码向量维度会很高,而且向量十分稀疏(大部分位置都是零),计算负担很大(维度灾难)
- 编码向量不能反映字词之间的语义相似性,只能做到区分
三、分布式表示(Distributed representation)
与独热向量不同,分布式表示使用较低维度的连续向量来表示单词,这些向量通过训练模型学习得到,能够反映单词之间的语义相似性。分布式表示方法包括Word2Vec、GloVe和FastText等。
1、Word2Vec
- 我们希望得到一种词向量,使得向量关系能反映语义关系,
- 比如: cos(你好, 您好) > cos(你好,天气)
- 即词义的相似性反映在向量的相似性
- 国王 - 男人 = 皇后 -女人
- 即向量可以通过数值运算反映词之间的关系
- 不管有多少词,向量维度应该是固定的
Word embedding 和 Word vector
- 本质上是一样的,都是以向量代表字符
- 一般说Word Embedding是指随机初始化的词向量或字向量
- Word2Vec一般指一种训练Word Embedding的方法,使得其向量具有一定的性质(向量相似度反映语义相似度)
我们用PaddleNLP进行相关的演示:
使用如下命令确保安装最新版PaddleNLP:
pip install --upgrade paddlenlp
import paddle
import paddlenlp
# 查看版本
# print(paddle.__version__)
# print(paddlenlp.__version__)
from paddlenlp.embeddings import list_embedding_name
# paddle.set_device("cpu")
# 查看预训练embedding名称
print("name:",list_embedding_name())
from paddlenlp.embeddings import TokenEmbedding
# 初始化TokenEmbedding, 预训练embedding未下载时会自动下载并加载数据
token_embedding = TokenEmbedding(embedding_name="w2v.baidu_encyclopedia.target.word-word.dim300")
# 查看token_embedding详情
print(token_embedding)
score1 = token_embedding.cosine_sim("男孩", "男生")
score2 = token_embedding.cosine_sim("男生", "书籍")
print('score1:', score1)
print('score2:', score2)
one-hot编码word vectors
- 将整个embedding矩阵看作一个线性层
- Onehot 编码作为输入
- word embedding 权重矩阵
2、词向量的训练
2.1基于语言模型
做出假设:每段文字中的某一个词,由他前面的n个词来决定
例如:今天 天气 真好 适合 愉快的 跑
- 今天
天气
- 今天 天气
真好
- 今天 天气 真好
适合
- 今天 天气 真好 适合
愉快的
- 今天 天气 真好 适合 愉快的
跑
示例代码: