内容摘自
刘焕勇博客: https://liuhuanyong.github.io/
原文地址: https://mp.weixin.qq.com/s/fkgk8l_Vd4YDU_K6G54F4Q
公众号: 老刘说NLP
word2vec、glove是两种静态的词向量模型,即每个词语只有一个固定的向量表示。但在不同语境中,词语的语义会发生变化,按道理词向量也应该动态调整。相比word2vec、glove生成的静态词向量, BERT是一种动态的技术,可以根据上下文情景,得到语义变化的词向量。
HuggingFace网站提供了简易可用的数据集、丰富的预训练语言模型, 通过sentence-transformer库,我们可以使用HuggingFace内的预训练模型,得到不同情景的文本的语义向量。
HuggingFace网站 https://huggingface.co/
动态句向量
sentence-transformer框架提供了一种简便的方法来计算句子和段落的向量表示(也称为句子嵌入)
安装
pip3 install -U sentence-transformers
代码
使用huggingface中的distiluse-base-multilingual-cased与训练模型,
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer('distiluse-base-multilingual-cased')
第一次运行上方的代码,需要运行一定的时间用于下载。下载完成后,我们使用同种语义的中英文句子,分别计算得到emb1和emb2两个句向量
emb1 = model.encode('Natural language processing is a hard task for human')
emb2 = model.encode('自然语言处理对于人类来说是个困难的任务')
emb1
Run
array([ 2.58186590e-02, 4.65703346e-02, 4.25276496e-02, -1.67875513e-02,
5.56012690e-02, -3.44308838e-02, -6.53978735e-02, 1.77450478e-02,
-3.47155109e-02, 2.86140274e-02, 2.48657260e-02, 7.94188876e-04,
5.09755425e-02, -1.76107027e-02, -1.04308855e-02, 7.61642214e-03,
...
4.28482369e-02, 1.76657233e-02, -5.83355911e-02, 1.92921527e-03,
2.81221420e-02, 5.24400780e-03, 2.10703332e-02, 7.96715263e-03,
-6.80630878e-02, -2.05304120e-02, -2.43293475e-02, -1.87458862e-02],
dtype=float32)
在distiluse-base-multilingual-cased这种模型中, 不同语言的同义句应该具有类似的语义,那么cos相似度应该是很大的。越接近于1越相似;越接近于0,越不相似。
cos_sim = util.pytorch_cos_sim(emb1, emb2)
cos_sim
Run
tensor([[0.8960]])