嵌入

Python 中的自然语言处理(NLP)

Fouad Trad

Machine Learning Engineer

BoW 与 TF-IDF 的局限

  • 将相似词视为完全无关
  • 难以捕捉文本语义

 

展示 BoW/TF-IDF 如何将多文本数据集转换为以唯一词为特征的结构化数据集的图像。

Python 中的自然语言处理(NLP)

嵌入

图像显示嵌入将词转换为向量。

  • 用向量表示词语以捕捉其含义
Python 中的自然语言处理(NLP)

嵌入

图像显示四个不同词的嵌入向量:car、movie、film 和 king。

  • 用向量表示词语以捕捉其含义
    • 为每个词随机赋值
Python 中的自然语言处理(NLP)

嵌入

图像显示句子补全任务,目标是为"我很享受观看这部"之类的句子补上合适的词。

  • 用向量表示词语以捕捉其含义
    • 为每个词随机赋值
    • 通过预测句子中的缺失词来优化数值
Python 中的自然语言处理(NLP)

嵌入

图像显示可用含义相近的两个词完成句子:movie 和 film。

  • 用向量表示词语以捕捉其含义
    • 为每个词随机赋值
    • 通过预测句子中的缺失词来优化数值
    • 处于相似语境的词将获得相似表示
Python 中的自然语言处理(NLP)

将嵌入视作词语的 GPS 坐标

显示地图上 GPS 位置的图像。

Python 中的自然语言处理(NLP)

Gensim

  • 提供常用的嵌入模型
    • Word2Vec
    • GloVe
word2vec-ruscorpora-300
word2vec-google-news-300
glove-wiki-gigaword-50
glove-wiki-gigaword-100
glove-wiki-gigaword-200
glove-wiki-gigaword-300
...

 

  Gensim 标志。

Python 中的自然语言处理(NLP)

加载嵌入模型

import gensim.downloader as api

model = api.load('glove-wiki-gigaword-50')
print(type(model))
print(model['movie'])
<class 'gensim.models.keyedvectors.KeyedVectors'>

[ 0.30824 0.17223 -0.23339 0.023105 0.28522 0.23076 -0.41048 -1.0035 -0.2072 1.4327 -0.80684 0.68954 -0.43648 1.1069 1.6107 -0.31966 0.47744 0.79395 -0.84374 0.064509 0.90251 0.78609 0.29699 0.76057 0.433 -1.5032 -1.6423 0.30256 0.30771 -0.87057 2.4782 -0.025852 0.5013 -0.38593 -0.15633 0.45522 0.04901 -0.42599 -0.86402 -1.3076 -0.29576 1.209 -0.3127 -0.72462 -0.80801 0.082667 0.26738 -0.98177 -0.32147 0.99823 ]
Python 中的自然语言处理(NLP)

计算相似度

similarity = model.similarity("film", "movie")

print(similarity)
0.9310100078582764
Python 中的自然语言处理(NLP)

查找最相似的词

similar_to_movie = model.most_similar('movie', topn=3)

print(similar_to_movie)
[('movies', 0.9322481155395508), 
 ('film', 0.9310100078582764), 
 ('films', 0.8937394618988037)]
Python 中的自然语言处理(NLP)

可视化嵌入

  • 主成分分析(PCA):
    • 高维向量 → 2D 或 3D 向量

一个 3D 地图被压平成 2D 的图示。

1 由 DALL-E 生成的图像
Python 中的自然语言处理(NLP)

用 PCA 可视化嵌入

from sklearn.decomposition import PCA

words = ["film", "movie", "dog", "cat", "car", "bus"]
word_vectors = [model[word] for word in words]
pca = PCA(n_components=2)
word_vectors_2d = pca.fit_transform(word_vectors)
plt.scatter(word_vectors_2d[:, 0], word_vectors_2d[:, 1])
for word, (x, y) in zip(words, word_vectors_2d): plt.annotate(word, (x, y))
plt.show()

图像显示在嵌入空间中,相似/相关的词彼此靠近。

Python 中的自然语言处理(NLP)

嵌入对比

图像显示在 Word2Vec 模型中,相似/相关的词在嵌入空间中彼此接近,但位置与 GloVe 模型不同。

word2vec-google-news-300

图像显示在 GloVe 模型中,相似/相关的词在嵌入空间中彼此接近。

glove-wiki-gigaword-50
Python 中的自然语言处理(NLP)

开始练习吧!

Python 中的自然语言处理(NLP)

Preparing Video For Download...