内容摘自

刘焕勇博客: 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

代码

click to download the code

使用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]])



广而告之