自然语言处理 理解词嵌入
词嵌入在自然语言处理(NLP)中起着关键作用,通过提供单词的数值表示来捕捉它们的语义和句法特性。这些分布式表示使机器能够更有效地处理和理解人类语言。
在本文中,我们将深入探讨与NLP中的词嵌入相关的基础知识、流行的嵌入模型、实践方面、评估技术和高级主题。
词嵌入的基础知识
词嵌入是一种稠密低维向量,用于在连续向量空间中表示单词。它们旨在基于给定语料库中的上下文捕捉单词的含义和关系。词嵌入不像稀疏高维的独热向量那样表示单词,而是以更紧凑和有意义的方式编码语义和句法信息。
流行的词嵌入模型
下面是一些流行的词嵌入模型 –
Word2Vec
Word2Vec引入了分布式单词表示的概念,并推广了使用神经网络生成词嵌入的方法。它提供了两种架构: 连续词袋(CBOW) 和 Skip-gram 。CBOW根据上下文预测目标词,而Skip-gram根据目标词预测周围的上下文词。Word2Vec模型是在大量未标记的文本数据上训练的。
该模型包含两个关键步骤 –
- 训练 - Word2Vec通过检查文本语料库中的相邻单词来学习词嵌入。它采用连续词袋(CBOW)方法,根据上下文预测当前单词,或者采用Skip-gram方法,根据当前单词预测周围的上下文词。
-
向量表示 - 训练后,每个单词表示为连续空间中的高维向量。得到的嵌入捕捉到单词之间的语义关系,相似的单词具有更接近的向量表示。
要使用Word2Vec,您可以对文本数据进行分词,将其输入模型,并对于各种NLP任务检索单词嵌入。
示例
下面是示例程序 –
import nltk
nltk.download('punkt')
from nltk.tokenize import word_tokenize
# Text data preparation
text_data = "This is an example sentence. Another sentence follows."
# Tokenization
tokens = word_tokenize(text_data)
# Word2Vec model training
model = Word2Vec([tokens], min_count=1)
# Get word embeddings
word_embeddings = model.wv
# Accessing embeddings
print(word_embeddings['example'])
输出
[-0.00713902 0.00124103 -0.00717672 -0.00224462 0.0037193 0.00583312
0.00119818 0.00210273 -0.00411039 0.00722533 -0.00630704 0.00464722
-0.00821997 0.00203647 -0.00497705 -0.00424769 -0.00310898 0.00565521
0.0057984 -0.00497465 0.00077333 -0.00849578 0.00780981 0.00925729
-0.00274233 0.00080022 0.00074665 0.00547788 -0.00860608 0.00058446
0.00686942 0.00223159 0.00112468 -0.00932216 0.00848237 -0.00626413
-0.00299237 0.00349379 -0.00077263 0.00141129 0.00178199 -0.0068289
-0.00972481 0.00904058 0.00619805 -0.00691293 0.00340348 0.00020606
0.00475375 -0.00711994 0.00402695 0.00434743 0.00995737 -0.00447374
-0.00138926 -0.00731732 -0.00969783 -0.00908026 -0.00102275 -0.00650329
0.00484973 -0.00616403 0.00251919 0.00073944 -0.00339215 -0.00097922
0.00997913 0.00914589 -0.00446183 0.00908303 -0.00564176 0.00593092
-0.00309722 0.00343175 0.00301723 0.00690046 -0.00237388 0.00877504
0.00758943 -0.00954765 -0.00800821 -0.0076379 0.00292326 -0.00279472
-0.00692952 -0.00812826 0.00830918 0.00199049 -0.00932802 -0.00479272
0.00313674 -0.00471321 0.00528084 -0.00423344 0.0026418 -0.00804569
0.00620989 0.00481889 0.00078719 0.00301345]
GloVe(全局词向量表示)
GloVe是另一种广泛使用的词嵌入模型。它利用全局词共现统计和局部上下文窗口来捕捉词义。GloVe嵌入是在共现矩阵上训练的,该矩阵表示语料库中单词之间的统计关系。
以下是使用GloVe的步骤−
- 从大型语料库创建一个单词-上下文共现矩阵,其中每个条目表示一个单词与一个固定大小上下文窗口中的另一个单词共现的频率。
-
随机初始化单词向量。
-
使用共现矩阵通过最小化单词向量和其共现矩阵条目的点积之间的差异来计算单词向量。
-
迭代矩阵并调整单词向量直到收敛。
-
训练后,学习到的单词向量对单词之间的语义关系进行编码,从而使得诸如单词相似性和类比完成等操作成为可能。
GloVe提供了一种计算上高效的方法来生成捕捉本地和全局词关系的词嵌入。
示例
下面是GloVe的程序示例−
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.decomposition import TruncatedSVD
# Text data preparation
text_data = ["This is an example sentence.", "Another sentence follows."]
# Tokenization
count_vectorizer = CountVectorizer()
count_matrix = count_vectorizer.fit_transform(text_data)
# TF-IDF transformation
tfidf_transformer = TfidfTransformer()
tfidf_matrix = tfidf_transformer.fit_transform(count_matrix)
# Singular Value Decomposition (SVD)
svd = TruncatedSVD(n_components=2) # Reduce components to 2
glove_embeddings = svd.fit_transform(tfidf_matrix)
# Accessing embeddings
print(glove_embeddings)
输出
[[ 0.75849858 0.65167469]
[ 0.75849858 -0.65167469]]
FastText
FastText将词的嵌入扩展到子词级别的表示。它将单词表示为字符n-gram的组合,并根据这些子词单位生成嵌入。FastText嵌入可以有效处理未登录词,因为它们可以由子词嵌入组成。
下面是使用FastText的步骤:
- 分词 - 将句子分解为单词或子词。
-
训练数据 - 准备用于训练FastText模型的文本语料库。
-
模型训练 - 在分词的文本语料库上训练FastText模型。
-
子词嵌入 - 为单词和子词生成嵌入。
-
未登录词处理 - 通过对子词嵌入进行平均处理来处理未登录词。
-
词相似度 - 使用嵌入之间的余弦相似度来衡量词的相似度。
-
下游任务 - 利用FastText嵌入进行文本分类或情感分析等各种自然语言处理任务。
FastText的子词建模有助于捕捉罕见或未知单词的信息,并提高形态丰富语言的性能。
示例
import fasttext
import nltk
from nltk.tokenize import word_tokenize
# Text data preparation
text_data = "This is an example sentence. Another sentence follows."
# Tokenization
tokens = word_tokenize(text_data)
# Saving tokens to a file
with open('text_data.txt', 'w') as file:
file.write(' '.join(tokens))
# FastText model training
model = fasttext.train_unsupervised('text_data.txt')
# Get word embeddings
word_embeddings = model.get_word_vector('example')
# Accessing embeddings
print(word_embeddings)
输出
[ 0.03285718 -0.01526352 -0.02881184 -0.00897612 0.0460813 -0.02043175 0.03802227 -0.00231849 -0.04373281 -0.02345613 0.04132561 0.02593898 -0.03548125 -0.02176061 -0.00718064 0.02202878 0.01905638 0.01388955 -0.02727601 0.01051432 -0.02827209 -0.01180033 0.02789263 -0.02217032 -0.00819697 -0.01387899 -0.04028311 -0.01399185 0.00222543 -0.00437792 -0.01352429 0.00902361 0.0341314 -0.04119079 0.03299914 -0.01110766 -0.02954799 0.00932125 0.02062443 0.00341501 -0.03225482 -0.03569973 -0.03264207 0.00164015 0.02864997 -0.01425406 0.00099312 -0.00711453 0.00534453 -0.02709763 -0.03474019 0.01898332 -0.01320734 0.02728367 0.00637779 -0.02667361 0.0090644 0.00815791 0.00375441 -0.01883233 -0.01119692 -0.00259154 0.00825689 -0.00366063 -0.03051898 -0.0018206 0.03409107 -0.01777094 -0.00757413 -0.00613379 -0.03341368 0.02008897 -0.00342503 0.00976928 0.00776702 -0.02941767 -0.02306498 0.03264163 0.01472706 0.01123447 -0.03174553 0.02913557 0.01298951 -0.00645978 0.03404429 -0.00828668 -0.00181118 0.00852771 -0.00237192 -0.00824729 -0.02397284 0.00087284 -0.00495328 -0.01262816 0.01932779 0.00314868 0.02070006 -0.0060814 0.01978939 -0.03188471]
准备文本数据以生成词嵌入
在生成词嵌入之前,预处理文本数据是必不可少的。一些预处理步骤包括:
- 分词 - 将文本分解为独立的单词或子单元。
-
转换为小写 - 将所有单词转换为小写,以将不同大小写的单词视为相同。
-
去除标点符号 - 消除标点符号,因为它们不携带重要的语义信息。
-
停用词去除 - 去除常见词(例如,”and”,”the”,”is”)频繁出现但对含义贡献不大的词。
处理未知词汇
未知词汇是指未出现在预训练词嵌入模型的词汇中的单词。处理未知词汇的方法有:
- OOV标记 - 在训练或推理过程中为未知词汇赋予特定的标记。
-
子词嵌入 - 使用FastText等模型生成子词嵌入,根据字符n-gram捕获未知词汇的含义。
评估词嵌入
为了评估词嵌入的质量和有用性,可以采用各种技术:
- 本质评估 - 根据嵌入与人类对词汇相似性或关联性的判断进行评估。常用于评估的数据集包括WordSim-353和Word2Vec的“word-analogy”数据集。
-
外部评估 - 在下游NLP任务(如情感分析、文本分类和命名实体识别)中评估嵌入。在这些任务上的性能提升表明嵌入的有效性。
词嵌入的高级主题
-
上下文化的词表示 - 像ELMo(来自语言模型的嵌入)、BERT(双向编码器表示)和GPT(生成式预训练转换器)这样的模型生成上下文化的词表示。这些模型考虑词语周围的上下文来捕捉微妙之处并产生更准确的表示。
-
迁移学习 - 预训练的词嵌入可以作为各种NLP任务的起点。微调或迁移学习允许模型利用在预训练期间获得的知识,以提高特定下游任务上的性能。
结论
通过了解词嵌入、它们的模型、预处理技术、评估方法和高级应用,您将能够在各种NLP任务中利用这些强大的表示。
词嵌入通过使机器更有效地理解和处理人类语言,革新了自然语言处理领域,为改进语言理解、机器翻译、问答等应用打开了大门。