理解 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 領域,使機器能夠更有效地理解和處理人類語言,為改進語言理解、機器翻譯、問答以及許多其他應用打開了大門。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP