了解 NLP 中的词嵌入
词嵌入在自然语言处理 (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 = "这是一个例句。下面是另一个句子。" # 标记化 tokens = word_tokenize(text_data) # Word2Vec 模型训练 model = Word2Vec([tokens], min_count=1) # 获取词嵌入 word_embeddings = model.wv # 访问嵌入 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 = ["This is an example sentence.", "Another sentence below."] # Tokenization count_vectorizer = CountVectorizer() count_matrix = count_vectorizer.fit_transform(text_data) # TF-IDF 转换 tfidf_transformer = TfidfTransformer() tfidf_matrix = tfidf_transformer.fit_transform(count_matrix) # 奇异值分解 (SVD) svd = TruncatedSVD(n_components=2) # 将组件减少到 2 glove_embeddings = svd.fit_transform(tfidf_matrix) # 访问嵌入 print(glove_embeddings)
输出
[[ 0.75849858 0.65167469] [ 0.75849858 -0.65167469]]
FastText
FastText 将词嵌入的概念扩展到子词级表示。它将单词表示为字符 n-gram 包,并根据这些子词单元生成嵌入。 FastText 嵌入可以有效地处理词汇表外的单词,因为它们可以由子词嵌入组成。
以下是使用 FastText 执行的步骤 -
标记化- 将句子分解为单个单词或子词。
训练数据 - 准备用于训练 FastText 模型的文本语料库。
模型训练 - 在标记化的文本语料库上训练 FastText 模型。
子词嵌入 - 为单词和子词生成嵌入。
词汇表外 (OOV) 单词 - 通过平均子词来处理 OOV 单词嵌入。
单词相似度 − 使用嵌入之间的余弦相似度来测量单词相似度。
下游任务 − 利用 FastText 嵌入进行各种 NLP 任务,如文本分类或情感分析。
FastText 的子词建模有助于捕获罕见或未见过的单词的信息,并提高形态丰富的语言的性能。
示例
import fasttext import nltk from nltk.tokenize import word_tokenize # 文本数据准备 text_data = "这是一个例句。接下来是另一句话。" # 标记化 tokens = word_tokenize(text_data) # 将标记保存到文件 with open('text_data.txt', 'w') as file: file.write(' '.join(tokens)) # FastText 模型训练 model = fasttext.train_unsupervised('text_data.txt') # 获取词嵌入 word_embeddings = model.get_word_vector('example') # 访问嵌入 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) 的单词是未出现在预训练词嵌入词汇表中的单词模型。处理 OOV 词 −
OOV Token − 在训练或推理期间分配一个特定的 token 来表示 OOV 词。
子词嵌入 − 利用 FastText 等模型生成子词嵌入,这些子词嵌入可以根据字符 n-gram 捕获未见过的单词的含义。
评估词嵌入
为了评估词嵌入的质量和实用性,可以采用各种技术 −
内在评估 − 根据嵌入与人类对词相似性或相关性的判断的相似性来评估嵌入。用于评估的常见数据集包括 WordSim-353 和 Word2Vec 的"词类比"数据集。
外部评估− 评估下游 NLP 任务(例如情绪分析、文本分类和命名实体识别)上的嵌入。这些任务上性能的提高表明嵌入的有效性。
词嵌入中的高级主题
语境化词表示− 诸如 ELMo(来自语言模型的嵌入)、BERT(来自 Transformer 的双向编码器表示)和 GPT(生成式预训练 Transformer)之类的模型会生成语境化词表示。这些模型会考虑单词的周围上下文来捕捉细微差别并产生更准确的表示。
迁移学习 - 预训练的词嵌入可用作各种 NLP 任务的起点。微调或迁移学习允许模型利用预训练期间获得的知识来提高特定下游任务的性能。
结论
总之,通过了解词嵌入、其模型、预处理技术、评估方法和高级应用,您将能够在各种 NLP 任务中利用这些强大的表示。
词嵌入通过使机器能够更有效地理解和处理人类语言,彻底改变了 NLP 领域,为改进语言理解、机器翻译、问答和许多其他应用打开了大门。