NLP | GloVe(带有全局向量的词嵌入) 图文详解及代码

文摘   2024-11-12 08:31   中国香港  

👆点击上方名片关注哟👆
过去十年中已经提出了几种词嵌入方法,以下是其中的一些:

它们可以分为上下文无关的嵌入和上下文相关的嵌入。以下部分简要概述了不同的词嵌入模型。在本文中,主要讲解Glove~

GloVe 是一种无监督学习算法,用于获取单词的向量表示,它扩展了 Word2Vec 模型并在捕捉单词关系上更有效。GloVe 通过利用语料库的全局词-词共现统计数据进行训练,生成的向量不仅保留上下文关系,还展现了有趣的线性子结构。

代码地址:https://github.com/stanfordnlp/GloVe

1. GloVe 的设计思想与优势

GloVe 结合了 Word2Vec 的跳跃语法模型(skip-gram)的优势,并采用矩阵分解技术来充分利用语料库的全局共现信息

  • Word2Vec 注重局部上下文(如滑动窗口内的词),但忽视了全局统计。

  • GloVe 则通过词-词共现矩阵,将全局统计与局部上下文结合起来,更好地捕捉词之间的类比关系。

例如,GloVe 可以自动学习到类似以下类比关系:

“国王 - 男人 + 女人 ≈ 女王”

2. 共现矩阵的构建与解读

GloVe 的核心是构建一个词-词共现矩阵,用于捕捉两个词在语料库中的共同出现频率:

  • 共现矩阵:描述两个词在同一上下文中出现的频率。

  • 滑动窗口法 (k-skip-n-gram):将窗口扩大至k+nk + nk+n 个单词,用于捕捉不同句子间的关系。

示例:句子中的共现关系

假设有以下两句话:

  • There is a bird sitting on a wall.

  • The cat is sitting on the fence.

通过构建共现矩阵,可以提取如下词组:

(bird, sitting), (sitting, wall), (wall, cat), (cat, fence)

即使这些词不在同一句中,我们也可以通过滑动窗口模型捕捉其共现关系,扩大上下文范围。

3. 通过共现概率比率解释词语关系

GloVe 采用共现概率的比率来解释词与词之间的语义关系。假设我们研究单词 “ice” 和 “gas” 的共现概率比率,我们可以得到以下信息:

  • solid:与 “ice” 相关而与 “gas” 不相关,比例较大(8.9)。

  • water:同时与 “ice” 和 “gas” 相关,比例接近 1(1.36)。

  • fashion:与两者均无关,比例接近 1(0.96)。

这些概率比率通过向量差值编码为单词嵌入,从而揭示词之间的相似性和语义关系。

4. GloVe 的损失函数与实现细节

GloVe 采用加权最小二乘损失函数,以缩小预测向量点积与词共现次数对数之间的差距。损失函数如下:

  • Xij:单词iii 和jjj 的共现次数

  • wi,w~j:分别为中心词和上下文词的向量

  • bi,b~j:偏置项

  • f(Xij):为低频和高频词赋予不同权重的函数

 当Wi和bi分别是单词的向量和单词的偏差i,wj的导和bj分别是单词的上下文词向量和偏置词j,Xij是单词的次数i发生在单词的上下文中j和f是一个加权函数,可为罕见和频繁的共生事件分配较低的权重。

5. GloVe、Word2Vec 与 LSA 的比较


特性GloVeWord2VecLSA
统计信息全局词-词共现局部上下文全局统计(矩阵分解)
模型类型矩阵分解 + 嵌入模型神经网络嵌入模型奇异值分解 (SVD)
类比任务表现优秀良好较差
计算复杂度
适用场景大型语料库的全局分析小型上下文预测主题模型分析


6. GloVe 代码实现(使用 Gensim 加载模型)

环境:Anaconda3 + Jupyter Notebook

import shutilimport gensim
def getFileLineNums(filename): with open(filename, 'r') as f: return sum(1 for _ in f)
def prepend_line(infile, outfile, line): """在文件开头添加一行""" with open(infile, 'r') as old, open(outfile, 'w') as new: new.write(line + "\n") shutil.copyfileobj(old, new)
def load_glove_model(filename): num_lines = getFileLineNums(filename) dims = 50 # 嵌入维度
gensim_file = 'glove_model.txt' prepend_line(filename, gensim_file, f"{num_lines} {dims}")
model = gensim.models.KeyedVectors.load_word2vec_format(gensim_file, binary=False) return model
if __name__ == '__main__': glove_model = load_glove_model('GloVe-master/vectors.txt')
print(len(glove_model.vocab)) # 输出词汇表大小
words = ['to', 'one'] for word in words: print(f"{word}:") for similar_word, score in glove_model.most_similar(word, topn=10): print(f"{similar_word}: {score}")


总结

GloVe 通过使用全局语料库的统计信息(如词-词共现计数),弥补了 Word2Vec 在捕捉全局语义上的不足。与 LSA 相比,GloVe 能更好地学习词之间的类比关系。

  • GloVe 适用于大型语料库的分析,尤其是需要全局信息支持的任务。

  • 平方损失函数 比交叉熵更适合处理词-词共现数据。

  • 中心词向量和上下文词向量在数学上等价,可以灵活使用。

GloVe 在自然语言处理中已被广泛应用,如情感分析问答系统推荐系统

想要了解更多内容,可在小程序搜索🔍AI Pulse,获取更多最新内容。

AI Pulse
\x26quot;AI Pulse - AI脉动\x26quot;,探索AI技术前沿,深入解析算法精髓,分享行业应用案例,洞察智能科技未来。欢迎关注,与我们共赴AI学习之旅。
 最新文章