理解 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 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 元组的集合,并根据这些子词单元生成嵌入。FastText 嵌入可以有效地处理词汇表外的单词,因为它们可以由子词嵌入组成。
以下是使用 FastText 的步骤:
分词 − 将句子分解成单个单词或子词。
训练数据 − 准备用于训练 FastText 模型的文本语料库。
模型训练 − 在分词后的文本语料库上训练 FastText 模型。
子词嵌入 − 为单词和子词生成嵌入。
词汇表外 (OOV) 单词 − 通过平均子词嵌入来处理 OOV 单词。
词相似度 − 使用嵌入之间的余弦相似度来衡量词相似度。
下游任务 − 将 FastText 嵌入用于各种 NLP 任务,如文本分类或情感分析。
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]
为词嵌入准备文本数据
在生成词嵌入之前,必须对文本数据进行预处理。一些预处理步骤包括:
分词 − 将文本拆分为单个单词或子词单元。
小写化 − 将所有单词转换为小写,以将不同大小写的单词视为相同。
去除标点符号 − 消除标点符号,因为它们不包含重要的语义信息。
停用词去除 − 去除常用词(例如,“和”、“的”、“是”),这些词出现频率很高,但对含义的贡献不大。
处理词汇表外单词
词汇表外 (OOV) 单词是在预训练的词嵌入模型的词汇表中未出现的单词。要处理 OOV 单词:
OOV 标记 − 在训练或推理期间分配特定标记来表示 OOV 单词。
子词嵌入 − 利用 FastText 等模型生成子词嵌入,这些嵌入可以根据其字符 n 元组来捕获未见单词的含义。
评估词嵌入
为了评估词嵌入的质量和实用性,可以使用各种技术:
内在评估 − 根据词嵌入与人类对词相似度或相关性的判断的相似性来评估嵌入。用于评估的常用数据集包括 WordSim-353 和 Word2Vec 的“词类比”数据集。
外在评估 − 在下游 NLP 任务(如情感分析、文本分类和命名实体识别)上评估嵌入。在这些任务上性能的提高表明嵌入的有效性。
词嵌入中的高级主题
上下文词表示 − ELMo(来自语言模型的嵌入)、BERT(来自转换器的双向编码器表示)和 GPT(生成式预训练转换器)等模型生成上下文词表示。这些模型考虑单词周围的上下文以捕获细微差别并生成更准确的表示。
迁移学习 − 预训练的词嵌入可以用作各种 NLP 任务的起点。微调或迁移学习允许模型利用在预训练期间获得的知识来提高特定下游任务的性能。
结论
总之,通过理解词嵌入、它们的模型、预处理技术、评估方法和高级应用,您将能够在各种 NLP 任务中利用这些强大的表示。
词嵌入彻底改变了 NLP 领域,使机器能够更有效地理解和处理人类语言,为改进语言理解、机器翻译、问答以及许多其他应用打开了大门。