使用 FastText 實現詞嵌入

banq發表於2024-05-15

FastText 嵌入是Facebook 人工智慧研究 (FAIR) 實驗室開發的一種詞嵌入。它們基於子詞嵌入的思想,這意味著 FastText 不是將單詞表示為單個實體,而是將它們分解為稱為字元 n 元語法的更小的元件。透過這樣做,FastText 可以捕獲形態相關單詞的語義,甚至是詞彙外單詞或罕見單詞,這使得它對於處理具有豐富形態的語言或詞彙外單詞常見的任務特別有用。在本文中,我們將討論 fastText 嵌入在 NLP 中的含義。

NLP 中需要什麼詞嵌入?
詞嵌入在 NLP 中至關重要,原因如下:

  • 降維:它們表示低維連續向量空間中的單詞,使其在計算上高效地處理廣泛的詞彙表。
  • 語義相似性:詞嵌入對語義關係進行編碼,使演算法能夠理解同義詞、反義詞和相關含義。
  • 上下文資訊:透過從周圍的單詞中捕獲上下文,嵌入可以幫助模型理解單詞在上下文中的含義,這對於情感分析和命名實體識別等任務至關重要。
  • 泛化:它們可以很好地泛化到未見過的單詞,從訓練資料中單詞的分佈屬性中學習。
  • 特徵表示:詞嵌入作為機器學習模型的特徵表示,使得各種技術能夠應用於 NLP 任務。
  • 高效訓練:使用詞嵌入訓練的模型收斂速度更快,並且通常比使用稀疏表示的模型表現更好。
  • 遷移學習:預訓練的嵌入(例如Word2Vec或GloVe)允許模型利用大型語料庫中的知識,即使任務特定資料有限。

為什麼應該使用 FastText 嵌入?
與 Word2Vec 和 GloVe 等傳統詞嵌入技術相比,FastText 具有顯著優勢,尤其是對於形態豐富的語言。以下是 FastText 如何解決傳統詞嵌入的侷限性及其影響的詳細說明:

  • 字元級資訊的利用:FastText 透過將單詞表示為嵌入其字元 n 元組的平均值來利用字元級資訊。這種方法允許 FastText 捕獲單詞的內部結構,包括字首、字尾和詞根,這對於構詞遵循特定規則的形態豐富的語言特別有益。
  • Word2Vec模型的擴充套件: FastText是Word2Vec模型的擴充套件,這意味著繼承了Word2Vec的優點,例如捕獲單詞之間的語義關係並生成密集的向量表示。
  • 處理詞彙外單詞:傳統單詞嵌入的一個顯著限制是它們無法處理詞彙外(OOV)單詞,即訓練資料或詞彙中不存在的單詞。由於 Word2Vec 和 GloVe 僅為訓練期間看到的單詞提供嵌入,因此在推理過程中遇到 OOV 單詞可能會帶來挑戰。
  • FastText 針對 OOV 單詞的解決方案:FastText 透過提供字元 n-gram 嵌入來克服 OOV 單詞的限制。如果在推理過程中出現 OOV 單詞,FastText 仍然可以根據其組成字元 n 元語法為其生成嵌入。這種能力使 FastText 更加健壯,適合處理經常遇到新詞或生僻詞的場景,例如社交媒體資料或專業領域。
  • 改進了形態豐富的語言的向量表示:透過利用字元級資訊並提供 OOV 單詞的嵌入,FastText 顯著改進了形態豐富的語言的向量表示。它不僅捕獲語義,還捕獲單詞的內部結構和句法關係,從而產生更準確和上下文豐富的嵌入。

FastText 嵌入的工作原理
FastText 嵌入利用字元級資訊生成強大的單詞表示,徹底改變了自然語言處理。例如,考慮帶有字元 n 元語法的單詞“basketball”

"<ba, bas, ask, sket, ket, et, etb, tb, tb, bal, all, ll>" and "<basketball>". <strong>

  • FastText 透過對這些字元 n 元語法與單詞本身的嵌入進行平均來計算“basketball”的嵌入。這種方法捕獲了單詞的語義和內部結構,使得 FastText 對於形態豐富的語言特別有效。
  • 在訓練過程中,FastText 使用連續詞袋 (CBOW) 或 Skip-gram 等模型,這些模型是經過訓練的神經網路,用於預測給定目標單詞的上下文,反之亦然。這些模型最佳化神經網路引數以最大程度地減少損失,使 FastText 能夠從大型文字語料庫中學習有意義的單詞表示。

此外,FastText 處理詞彙表外單詞的能力有助於在現實世界的應用中經常遇到新詞或罕見單詞。經過訓練的 FastText 嵌入可作為各種 NLP 任務的強大功能,促進文字分類、情感分析和機器翻譯等任務的準確性和效率的提高。

Skip-gramCBOW
在 FastText 嵌入的背景下,Skip-gram和連續詞袋 ( CBOW)都用作生成單詞表示的訓練方法
以“籃球”這個詞為例,讓我們比較一下 Skip-gram 和 CBOW 的運作方式:
跳克:

  • 輸入:給定目標單詞“basketball”,Skip-gram 旨在預測其上下文單詞,例如“play”、“court”、“team”等。
  • 訓練目標:模型學習根據目標詞預測周圍的上下文詞。
  • 用法示例:給定“basketball”作為輸入,Skip-gram 從給定的文字語料庫中預測其周圍的上下文單詞。

連續詞袋(CBOW):
  1. 輸入:CBOW 採用上下文單詞視窗,例如“play”、“on”、“the”、“basketball”、“court”作為輸入。
  2. 訓練目標:模型學習根據周圍上下文預測目標詞“basketball”。
  3. 用法示例:使用上下文單詞“play”、“on”、“the”、“court”作為輸入,CBOW 預測目標單詞“basketball”。本質上,Skip-gram 和 CBOW 的不同之處在於輸入和輸出配置:

  • Skip-gram 預測給定目標單詞的上下文單詞。
  • CBOW 根據上下文預測目標單詞。

這兩種方法都有助於訓練 FastText 嵌入,使模型能夠有效地捕獲語義關係和句法結構。 Skip-gram 和 CBOW 之間的選擇取決於 NLP 任務的具體要求以及所使用的文字語料庫的特徵。

FastText 嵌入的程式碼實現

  • 此程式碼演示了使用 Gensim 訓練 FastText 模型並使用它來查詢單詞嵌入和相似單詞
  • 首先匯入必要的庫並定義語料庫,然後使用指定引數訓練 FastText 模型。
  • 然後從訓練後的模型中獲得特定單詞(在本例中為“computer”)的單詞嵌入,並根據其嵌入找到與“computer”最相似的單詞。
  • 最後,列印“computer”的單詞嵌入和最相似單詞的列表。

from gensim.models import FastText
from gensim.test.utils import common_texts

# Example corpus (replace with your own corpus)
corpus = common_texts

# Training FastText model
model = FastText(sentences=corpus, vector_size=100, window=5, min_count=1, workers=4, sg=1)

# Example usage: getting embeddings for a word
word_embedding = model.wv['computer']

# Most similar words to a given word
similar_words = model.wv.most_similar('computer')

print(<font>"Most similar words to 'computer':", similar_words)

輸出:
Most similar words to 'computer': [('user', 0.15659411251544952), ('response', 0.12383826076984406), 
('eps', 0.030704911798238754), ('system', 0.025573883205652237), ('interface', 0.0058587524108588696), 
('survey', -0.03156976401805878), ('minors', -0.0545564740896225), ('human', -0.0668589174747467), 
('time', -0.06855931878089905), ('trees', -0.10636083036661148)]


輸出列出了單詞及其與單詞“computer”相應的相似度分數。這些分數表明模型學習的向量空間中每個單詞在語義上與“computer”的接近程度。

FastText VS Word2vec:哪個更好?
FastText 和 Word2Vec 都是自然語言處理中用於生成詞嵌入的流行工具,但它們滿足的需求和用例略有不同:

  • Word2Vec由 Google 開發,以其在捕獲語義和句法單詞關係方面的效率和效果而聞名。它使用兩種架構(CBOW 和 Skip-gram)來學習表示,並且在一般語言建模任務中表現出色。
  • FastText 由 Facebook 的 AI 研究實驗室開發,它擴充套件了 Word2Vec 的想法,不僅學習單詞的嵌入,還學習單詞中字元的 n 元語法。這種方法允許 FastText 透過利用子詞資訊為罕見詞或拼寫錯誤的詞生成更好的嵌入。

在 FastText 和 Word2Vec 之間進行選擇取決於具體要求:

  • Word2Vec 通常更適合具有精心策劃的大型資料集和常見詞彙的任務,
  • 而 FastText 則擅長處理稀有單詞和形態複雜的語言。對於需要對單詞變化和拼寫錯誤具有魯棒性的應用程式,FastText 可能是更好的選擇。


FastText 嵌入 - 常見問題解答
1、FastText 嵌入如何處理未知單詞?
FastText 的獨特之處在於它能夠為訓練期間未見過的單詞生成嵌入。它透過將單詞分解為更小的子詞單元(n-gram)並在訓練期間學習這些 n-gram 的表示來實現這一點。對於未知單詞,FastText 聚合其組成 n 元語法的向量。

2、FastText 和 word2vec 有什麼區別?
雖然 FastText 和 word2vec 都提供詞嵌入,但主要區別在於它們對詞彙的處理。 Word2vec 僅學習訓練期間見過的單詞的向量,忽略未知單詞。另一方面,FastText 透過對子詞 n-gram 的嵌入求和來動態構建嵌入,這使得它能夠處理訓練期間未見過的單詞。

3、FastText 可以用於英語以外的語言嗎?
是的,FastText 對於形態豐富的語言(如土耳其語或芬蘭語)特別有用,其中相同的詞根可以有多種不同的形式。與僅考慮整個單詞的模型相比,它的子詞方法使其能夠更有效地捕獲此類語言的細微差別。
 

相關文章