【文本到上下文 #6】高级词嵌入:Word2Vec、GloVe 和 FastText

一、说明

        欢迎来到“完整的 NLP 指南。到目前为止,我们已经探索了自然语言处理的基础知识、应用程序和挑战。我们深入研究了标记化、文本清理、停用词、词干提取、词形还原、词性标记和命名实体识别。我们的探索包括文本表示技术,如词袋、TF-IDF 以及词嵌入的介绍。然后,我们将 NLP 与机器学习联系起来,涵盖监督和无监督学习、情感分析以及分类和回归的基础知识。最近,我们涉足深度学习,讨论了神经网络、RNN 和 LSTM。现在,我们准备更深入地研究深度学习领域的词嵌入。

以下是第六篇博客文章中的内容:

  1. Word2Vec:深入 Word2Vec 的世界,探索其架构、工作原理以及它如何彻底改变对文本内语义关系的理解。我们将研究它的两种主要训练算法:连续词袋 (CBOW) 和 Skip-gram,以了解它们在捕获上下文单词含义方面的作用。
  2. GloVe(单词表示的全局向量):解开 GloVe 模型的复杂性。我们将通过利用全局词词共现统计数据来探索它与 Word2Vec 的不同之处,提供一种独特的方法来根据语料库中的集体上下文嵌入单词。
  3. FastText:研究 FastText 的功能,重点关注其处理词汇表外单词的创新方法。了解 FastText 如何将单词分解为更小的单元(n 元语法),以及该方法如何增强单词的表示,尤其是在形态丰富的语言中。
  4. 选择正确的嵌入模型:深入研究为 NLP 项目选择嵌入模型时要考虑的关键因素。我们将讨论每个模型的细微差别,帮助您确定哪一个模型最符合您在语言丰富性、计算效率和应用范围方面的特定需求。
  5. 比较词嵌入代码示例:通过动手代码示例将理论付诸实践。本节将提供实际演示,比较 Word2Vec、GloVe 和 FastText 在常见 NLP 任务中的性能,让您切实了解它们在实际应用中的优缺点。

这篇博文的目的不仅是让您了解这些先进的嵌入技术,还让您掌握在 NLP 项目中实施这些技术时做出明智决策的知识。

二、词向量

        Word2Vec 是一种流行的词嵌入技术,旨在将单词表示为高维空间中的连续向量。它引入了两种模型:连续词袋(CBOW)和 Skip-gram,每种模型都有助于向量表示的学习。

2.1.模型架构:

  • 连续词袋 (CBOW):在 CBOW 中,模型根据上下文预测目标词。上下文单词作为输入,目标单词作为输出。该模型经过训练,可以最大限度地减少预测目标词和实际目标词之间的差异。
  • Skip-gram:相反,Skip-gram 模型可以预测给定目标单词的上下文单词。目标词作为输入,模型旨在预测可能出现在其上下文中的词。与 CBOW 一样,目标是最小化预测和实际上下文单词之间的差异。

2.2 神经网络训练:

CBOW 和 Skip-gram 模型都利用神经网络来学习向量表示。神经网络在大型文本语料库上进行训练,调整连接权重以最小化预测误差。此过程将相似的单词在生成的向量空间中放置得更近。

2.3 向量表示:

经过训练后,Word2Vec 会在高维空间中为每个单词分配一个唯一的向量。这些向量捕获单词之间的语义关系。具有相似含义或经常出现在相似上下文中的单词具有彼此接近的向量,表明它们的语义相似性。

2.4 优点和缺点:

优点:

  • 有效捕获语义关系。
  • 对于大型数据集非常有效。
  • 提供有意义的单词表示。

缺点:

  • 可能会难以理解生僻单词。
  • 忽略词序。

2.5. 玩具数据集的代码示例:

        提供的代码示例演示了在玩具数据集上使用 Gensim 库训练 Word2Vec 模型。展示了句子的标记化、模型训练和词嵌入的访问。

from gensim.models import FastText
from nltk.tokenize import word_tokenize

# Toy dataset
sentences = ["FastText embeddings handle subword information.",
             "It is effective for various languages."]
# Tokenize sentences
tokenized_sentences = [word_tokenize(sentence.lower()) for sentence in sentences]

# Train FastText model
model = FastText(sentences=tokenized_sentences, vector_size=100, window=5, min_count=1, workers=4)

# Access embeddings
word_embeddings = model.wv
print(word_embeddings['subword'])

        总之,Word2Vec 的机制涉及训练神经网络模型(CBOW 和 Skip-gram)来学习有效捕获单词之间语义关系的向量表示。生成的向量在向量空间中提供有意义且有效的单词表示。

三、GloVe(用于词表示的全局向量)

        单词表示的全局向量 (GloVe) 是一种强大的单词嵌入技术,它通过考虑单词在语料库中的共现概率来捕获单词之间的语义关系。GloVe 有效性的关键在于单词上下文矩阵的构建以及后续的分解过程。

3.1.单词-上下文矩阵的形成:

        GloVe 机制的第一步涉及创建单词上下文矩阵。该矩阵旨在表示整个语料库中给定单词出现在另一个单词附近的可能性。矩阵中的每个单元格保存单词在特定上下文窗口中一起出现的频率的共现计数。

让我们考虑一个简化的例子。假设我们的语料库中有以下句子:

  • “词嵌入捕获语义含义。”
  • “GloVe 是一种有影响力的词嵌入模型。”

单词上下文矩阵可能如下所示:

        在这里,每一行和每一列对应于语料库中的一个唯一单词,单元格中的值表示这些单词在某个上下文窗口中一起出现的频率。

3.2. 词向量的因式分解:

        单词上下文矩阵就位后,GloVe 转向矩阵分解。这里的目标是将这个高维矩阵分解为两个较小的矩阵——一个代表单词,另一个代表上下文。我们将它们表示为W(表示单词)和C(表示上下文)。理想的情况是WCT的点积(C的转置)近似于原始矩阵:

X ≈ W ⋅ CT

通过迭代优化,GloVe 调整WC ,以最小化XW ⋅ CT之间的差异。这个过程为每个单词生成精细的向量表示,捕捉它们共现模式的细微差别。

3.3.向量表示:

        经过训练后,GloVe 会为每个单词提供一个密集向量,该向量不仅捕获本地上下文,还捕获全局单词使用模式。这些向量对语义和句法信息进行编码,根据单词在语料库中的整体用法揭示单词之间的相似性和差异。

3.4、优点和缺点:

优点:

  • 有效捕获语料库的全局统计数据。
  • 擅长表示语义和句法关系。
  • 有效捕捉词语类比。

缺点:

  • 需要更多内存来存储共生矩阵。
  • 对于非常小的语料库来说效果较差。

3.5 玩具数据集的代码示例 

        以下代码片段演示了在玩具数据集上使用 GloVe Python 包的 GloVe 模型的基本用法。该示例涵盖了共现矩阵的创建、GloVe 模型的训练以及词嵌入的检索。

from glove import Corpus, Glove
from nltk.tokenize import word_tokenize

# Toy dataset
sentences = ["Word embeddings capture semantic meanings.",
             "GloVe is an impactful word embedding model."]

# Tokenize sentences
tokenized_sentences = [word_tokenize(sentence.lower()) for sentence in sentences]

# Creating a corpus object
corpus = Corpus() 

# Training the corpus to generate the co-occurrence matrix
corpus.fit(tokenized_sentences, window=10)

# Training the GloVe model
glove = Glove(no_components=100, learning_rate=0.05)
glove.fit(corpus.matrix, epochs=30, no_threads=4, verbose=True)
glove.add_dictionary(corpus.dictionary)

# Retrieve and display word embeddings
word = "glove"
embedding = glove.word_vectors[glove.dictionary[word]]
print(f"Embedding for '{word}': {embedding}")

        总之,GloVe 的词嵌入方法侧重于捕获语料库中的全局词共现模式,提供丰富且有意义的向量表示。这种方法有效地编码了语义和句法关系,根据单词的广泛使用模式提供了单词含义的全面视图。上面的代码示例说明了如何在基本数据集上实现 GloVe 嵌入。

四、快速文本

        FastText 是 Facebook AI Research (FAIR) 开发的一种先进的词嵌入技术,扩展了 Word2Vec 模型。与 Word2Vec 不同,FastText 不仅考虑整个单词,还包含子词信息——单词的一部分,例如 n-gram。这种方法可以处理形态丰富的语言,并更有效地捕获有关单词结构的信息。

4.1.子词信息:

        除了整个单词本身之外,FastText 将每个单词表示为一袋字符 n 元语法。这意味着单词“apple”由单词本身及其组成的 n-gram 表示,如“ap”、“pp”、“pl”、“le”等。这种方法有助于捕获较短单词的含义并提供更好地理解后缀和前缀。

4.2.模型训练:

        与 Word2Vec 类似,FastText 可以使用 CBOW 或 Skip-gram 架构。然而,它在训练期间合并了子字信息。FastText 中的神经网络经过训练,不仅可以基于目标单词,还可以基于这些 n-gram 来预测单词(在 CBOW 中)或上下文(在 Skip-gram 中)。

4.3. 处理生僻词和未知词:

        FastText 的一个显着优势是它能够为罕见单词甚至训练期间未见过的单词生成更好的单词表示。通过将单词分解为 n 元语法,FastText 可以根据这些单词的子词单元构建有意义的表示。

4.4、优点和缺点:

优点:

  • 更好地表示生僻字。
  • 能够处理词汇表之外的单词。
  • 由于子词信息,词的表示更丰富。

缺点:

  • 由于 n 元语法信息而增加了模型大小。
  • 与 Word2Vec 相比,训练时间更长。

4.5. 玩具数据集的代码示例:

以下代码演示了如何在玩具数据集上将 FastText 与 Gensim 库结合使用。它强调了模型训练和访问词嵌入。

from gensim.models import FastText
from nltk.tokenize import word_tokenize

# Toy dataset
sentences = ["FastText embeddings handle subword information.",
             "It is effective for various languages."]
# Tokenize sentences
tokenized_sentences = [word_tokenize(sentence.lower()) for sentence in sentences]

# Train FastText model
model = FastText(sentences=tokenized_sentences, vector_size=100, window=5, min_count=1, workers=4)

# Access embeddings
word_embeddings = model.wv
print(word_embeddings['subword'])

        总之,FastText 通过合并子词信息丰富了词嵌入景观,使其能够非常有效地捕获语言中的复杂细节并处理罕见或看不见的单词。

五、选择正确的嵌入模型

  • Word2Vec:当语义关系至关重要并且您拥有大型数据集时使用。
  • GloVe:适用于不同的数据集,并且当捕获全局上下文很重要时。
  • FastText:选择形态丰富的语言或处理词汇表之外的单词至关重要。

六、比较词嵌入代码示例

# Import necessary libraries
from gensim.models import Word2Vec
from gensim.models import FastText
from glove import Corpus, Glove
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

# Toy dataset
toy_data = [
    "word embeddings are fascinating",
    "word2vec captures semantic relationships",
    "GloVe considers global context",
    "FastText extends Word2Vec with subword information"
]

# Function to train Word2Vec model
def train_word2vec(data):
    model = Word2Vec([sentence.split() for sentence in data], vector_size=100, window=5, min_count=1, workers=4)
    return model

# Function to train GloVe model
def train_glove(data):
    corpus = Corpus()
    corpus.fit(data, window=5)
    glove = Glove(no_components=100, learning_rate=0.05)
    glove.fit(corpus.matrix, epochs=30, no_threads=4, verbose=True)
    return glove

# Function to train FastText model
def train_fasttext(data):
    model = FastText(sentences=[sentence.split() for sentence in data], vector_size=100, window=5, min_count=1, workers=4)
    return model

# Function to plot embeddings
def plot_embeddings(model, title):
    labels = model.wv.index_to_key
    vectors = [model.wv[word] for word in labels]
    
    tsne_model = TSNE(perplexity=40, n_components=2, init='pca', n_iter=2500, random_state=23)
    new_values = tsne_model.fit_transform(vectors)

    x, y = [], []
    for value in new_values:
        x.append(value[0])
        y.append(value[1])

    plt.figure(figsize=(10, 8)) 
    for i in range(len(x)):
        plt.scatter(x[i],y[i])
        plt.annotate(labels[i],
                     xy=(x[i], y[i]),
                     xytext=(5, 2),
                     textcoords='offset points',
                     ha='right',
                     va='bottom')
    plt.title(title)
    plt.show()

# Train models
word2vec_model = train_word2vec(toy_data)
glove_model = train_glove(toy_data)
fasttext_model = train_fasttext(toy_data)

# Plot embeddings
plot_embeddings(word2vec_model, 'Word2Vec Embeddings')
plot_embeddings(glove_model, 'GloVe Embeddings')
plot_embeddings(fasttext_model, 'FastText Embeddings')

七、结论

        当我们结束对高级词嵌入的探索时,我们 NLP 之旅的下一站将是序列到序列模型、注意力机制和编码器-解码器架构。这些先进技术在机器翻译和摘要等任务中发挥了重要作用,使模型能够专注于输入序列的特定部分。

        请继续关注下一部分,我们将揭开序列到序列模型的复杂性,揭示注意力机制和编码器-解码器架构的力量。

参考资料:@mervebdurna

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/325141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Qt之Quick模块】8. Quick基础、布局管理、布局管理器

1. 前言 Qt Quick编程,提供了多种布局方式。 如,静态布局,可以使用组件的x、y属性进行设置,或者进行绑定。 还可以使用锚anchors进行布局。 此外,还可以使用定位器以及定位管理器为多组件进行布局。 但使用布局管理器…

【数学建模美赛M奖速成系列】数据可视化方法(一)

数据可视化方法 写在前面山脊图优点缺点实现matlabpython 气泡矩阵图实现matlabpython 后续 写在前面 最近开始更新一个新的系列科研绘图,在同一个竞赛下,大家都近乎相同的解题思路下。之所以能出现一等二等三等奖的区别很大部分都在于结果的可视化&…

实战 php 使用 wkhtmltopdf 生成pdf的全过程

公司里边有生成pdf报告的业务需求,之前有过尝试用tcpdf,直接生成的pdf的过程,但是pdf报告的内容数据,根据不同内容的变化,都是各种各样的bug,一直处理修修补补的状态,让后台开发人员很是头疼. 经过思索和甄选,总结出我们的业务中是由于样式不可控导致的,当时从逻辑上就思考到用…

半监督学习 - 三元组学习(Triplet Learning)

什么是机器学习 三元组学习(Triplet Learning)是半监督学习中一种用于学习有用表示的方法。它通常用于学习数据中的相似性关系,尤其在人脸识别、图像检索等领域中得到广泛应用。三元组学习是通过构造三元组(triplet)来…

Java NIO (一)简介(备份)

1 NIO简介 在1.4版本之前,Java NIO类库是阻塞IO,从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称为Java NIO。New IO类库的目的 就是要让Java支持非阻塞IO。 Java NIO类库包含三个核心组件: …

AGV磁导航传感器CNS-MGS-160N安装与调试方法与注意事项

AGV磁导航传感器CNS-MGS-160N通过上位机给传感器下发岔路选择指令,传感器即⾃动屏蔽⾮选择⽅向的磁条,使AGV平滑过弯⽆抖动,可通过配置软件设置传感器的检测灵敏度,适应不同的安装⾼度下的检测要求,其通过输出1mm⾼精度…

行测:国考省考行测:语句表达,位置分析,语句分析,语句填空

国考省考行测:语句表达 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申论和行测的重要知识点 遇到…

STM32 CubeIDE 使用 CMSIS-DAP烧录 (方法2--外部小工具)

前言: 本篇所用方法,需要借助一个外部的工具小软件。 优点:烧录更稳定; 缺点:不能在线仿真调试。 下面链接,是另一种方法:修改CubeIDE调试文件。能在CubeIDE直接烧录、仿真,但不稳定。…

人工智能在数据安全中的应用场景

场景一:数据资产梳理 数据资产梳理是数据安全的基础。知道企业究竟有多少数据,这些数据在哪里?有哪些类型的数据?其中哪些是敏感数据?这些数据的敏感等级分别是什么?只有明确了保护的目标,才能…

浅析企业云性能监控的关键作用

企业云性能监控是一项关键的IT管理活动,它旨在实时追踪、分析和优化企业在云环境中的应用程序和系统性能。云性能监控涉及到监测各个层面的云服务,从基础设施到应用程序,以确保企业能够在云环境中实现高效、可靠和稳定的运行。以下是企业云性…

20. 从零用Rust编写正反向代理,四层反向代理stream(tcp与udp)实现

wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,内网穿透,后续将实现websocket代理等,会将实现过程分享出来,感兴趣的可以一起造个轮子 项目地址 gite: https:…

transbigdata笔记:可视化

1 可视化轨迹 transbigdata.visualization_trip(trajdata, col[Lng, Lat, ID, Time], zoomauto, height500) 例子见transbigdata 笔记:官方文档案例1(出租车GPS数据处理)-CSDN博客 2 可视化od transbigdata.visualization_od(oddata, col…

深入解析JavaScript中的变量作用域和闭包

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 JavaScript作为一门解释执行的脚本语言,其变量作用域与传统编译型语言…

第二证券:抢占技术前沿 中国光伏企业结伴“走出去”

2024年新年前后,光伏职业分外忙碌。据证券时报记者不完全统计,晶澳科技、华晟新动力、高测股份、华民股份等多家企业宣告新建项目投产,安徽皇氏绿能等企业的项目也迎来设备安装的重要节点。 证券时报记者采访多家企业的负责人后了解到&#…

3.goLand基础语法

目录 概述语法for常量与变量数组切片 slice切片问题问题1问题2 Make 和 New结构体和指针结构体标签 结束 概述 从 java 转来学 go &#xff0c;在此记录&#xff0c;方便以后翻阅。 语法 for package mainimport "fmt"func main() {for i : 0; i < 3; i {fmt.…

这可能是最全面的Java并发编程八股文了

内容摘自我的学习网站&#xff1a;topjavaer.cn 分享50道Java并发高频面试题。 线程池 线程池&#xff1a;一个管理线程的池子。 为什么平时都是使用线程池创建线程&#xff0c;直接new一个线程不好吗&#xff1f; 嗯&#xff0c;手动创建线程有两个缺点 不受控风险频繁创…

开发实践6_缓存^中间件

以下学习 朔宁夫 开发工程师 课程。 缓存可提高程序响应速度。数据库缓存(可过期)/ Redis缓存(Key:Value)/ Memcacheed缓存/ 程序层缓存。 一 缓存 1. 数据库缓存 创建缓存数据表 // python manage.py createcachetable cache_table setting // # 缓存配置 CACHES {def…

精品基于Uniapp+Springboot宠物用品服务销售管理系统App

《[含文档PPT源码等]精品基于UniappSpringboot宠物管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安卓…

js日期排序(使用sort)

根据日期进行排序&#xff0c;也可以根据number类型的大小来进行排序 按日期排序的函数 let data [{id: 2,time: 2019-04-26 10:53:19},{id: 4,time: 2019-04-26 10:51:19}, {id: 1,time: 2019-04-26 11:04:32}, {id: 3,time: 2019-04-26 11:05:32} ] //property是你需要排序…

geemap学习笔记048:光谱变换

前言 Earth Engine中有多种光谱变换方法。其中包括图像上的实例方法&#xff0c;例如 normalizedDifference()、unmix()、rgbToHsv() 和 hsvToRgb()。 1 导入库并初始化 import ee import geemapee.Initialize()2 全色图像锐化(Pan sharpening) Map geemap.Map(center[40,…