FastText 詞向量模型有效解決了 Word2Vec 無法處理未知詞彙的侷限性,利用子詞資訊提升模型的泛化能力。透過子詞的組合,FastText 可以表示未在訓練資料中出現的詞彙,並有效捕捉詞彙的形態和語義資訊。這使得 FastText 在處理罕見詞彙和形態豐富的語言方面具有顯著優勢,同時也能降低計算資源的需求,適用於各種自然語言處理任務。

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

class MyCorpus:
    """An iterator that yields sentences (lists of str)."""
    def __init__(self, path):
        self.path = path

    def __iter__(self):
        with open(self.path, 'r') as f:
            for line in f:
                yield line.split()

# 建立 FastText 模型
model = FastText(vector_size=100, min_count=1, workers=4)

# 訓練模型
corpus = MyCorpus('path/to/corpus.txt')
model.build_vocab(corpus)
model.train(corpus, total_examples=len(corpus), epochs=10)

# 使用模型
vector = model.wv['word']
print(vector)

FastText

FastText 是一種根據子詞(subword)的文字嵌入技術,旨在解決 Word2Vec 的缺點。FastText 使用子詞來表示文字,子詞是文字的一部分,例如「un」、「break」等。FastText 的優點是:

  • 能夠處理罕見的文字
  • 能夠學習文字之間的語義關係
  • 需要較少的計算資源

FastText 的缺點是:

  • 需要更多的記憶體空間
  • 不適合處理非常大的文字資料

gensim 中的 FastText

gensim 是一種 Python 函式庫,提供了 FastText 的實作。使用 gensim 中的 FastText,可以輕鬆地建立和訓練 FastText 模型。以下是 gensim 中的 FastText 的範例程式碼:

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

class MyCorpus:
    """An iterator that yields sentences (lists of str)."""
    def __init__(self, path):
        self.path = path

    def __iter__(self):
        with open(self.path, 'r') as f:
            for line in f:
                yield line.split()

# 建立 FastText 模型
model = FastText(vector_size=100, min_count=1, workers=4)

# 訓練模型
corpus = MyCorpus('path/to/corpus.txt')
model.build_vocab(corpus)
model.train(corpus, total_examples=len(corpus), epochs=10)

# 使用模型
vector = model.wv['word']
print(vector)

FastText詞向量模型的應用

FastText是一種詞向量模型,能夠將詞彙對映到高維空間中的向量,從而捕捉詞彙之間的語義關係。在本文中,我們將探討FastText的應用,包括詞彙相似度計算和未知詞彙的處理。

FastText模型的建立

首先,我們需要建立FastText模型。這可以透過以下步驟完成:

  1. 資料預處理:我們需要對資料進行預處理,包括分詞、停用詞過濾等。
  2. FastText模型的建立:我們可以使用Gensim函式庫建立FastText模型,指定模型的引數,例如詞向量的維度、視窗大小等。
import gensim.models

sentences = MyCorpus()
model = FastText(sentences=sentences)
model.save("dr-who-fasttext.model")

詞彙相似度計算

FastText模型可以用於計算詞彙之間的相似度。這可以透過以下步驟完成:

  1. 詞彙查詢:我們可以使用FastText模型查詢詞彙的向量表示。
  2. 相似度計算:我們可以使用向量間的餘弦相似度計算詞彙之間的相似度。
from gensim.models import FastText

model = FastText.load("dr-who-fasttext.model")
print(model.wv.most_similar('tardislike', topn=10))
print(model.wv.most_similar('dalekish', topn=10))
print(model.wv.most_similar('dona', topn=10))

未知詞彙的處理

FastText模型可以用於處理未知詞彙。這可以透過以下步驟完成:

  1. 未知詞彙查詢:我們可以使用FastText模型查詢未知詞彙的向量表示。
  2. 相似度計算:我們可以使用向量間的餘弦相似度計算未知詞彙與已知詞彙之間的相似度。

結果分析

透過FastText模型,我們可以得到詞彙之間的相似度結果。例如,詞彙“tardislike”與詞彙“tardis”和“tardises”之間的相似度最高,分別為0.85和0.84。這表明FastText模型可以有效地捕捉詞彙之間的語義關係。

同樣,詞彙“dalekish”與詞彙“dalek”和“daleks”之間的相似度最高,分別為0.93和0.93。這表明FastText模型可以有效地處理未知詞彙。

最後,詞彙“dona”與詞彙“donna”之間的相似度最高,為0.94。這表明FastText模型可以有效地處理拼寫錯誤。

進一步閱讀

文獻

在自然語言處理(NLP)領域中,Manning & Schütze [17]被譽為統計方法的聖經。這本章於1999年出版,但仍然是非常有洞察力的閱讀材料,對於許多人來說,它是他們學習統計NLP的主要來源。另外,還有一個伴隨的網站¹¹,最後更新於2015年。同樣來自斯坦福大學,資訊豐富,但在主題和方法上有所不同的是Jurafsky & Martin [13]。而Manning & Schütze是一次性的出版,Jurafsky & Martin已經到了第三版。版本之間的變化遠不止於表面上的細節:這本章跟蹤了該領域的演變,並在每個版本之間進行了重大變化。第三版仍在準備中,所有章節草稿都可以在網上找到¹²,包括一些只會在網上發布的附錄。

除了這兩本統計NLP的鉅著之外,我們還可以提到Bird [4],它專門介紹了Python套件nltk,但遠不止於使用者手冊,因為它解釋了各種NLP主題(Manning & Schütze和Jurafsky & Martin都沒有包含任何程式碼)。同樣地,有一個網站¹³,包含了更新的Bird [4]版本,與Python 3和最新版本的nltk相容。

Eisenstein [8]出現得比較晚,它是一本相當密集的文字,涵蓋了遠不止於統計NLP的內容。

關於NLP的歷史,特別是統計NLP,Léon [16]是一個令人著迷的閱讀材料。

練習

練習13-1:探索計算語言學會的文集

計算語言學會(ACL)是自然語言處理領域中最頂尖的科學和專業組織,其期刊和會議是世界上最好的,所有論文都可以在會的網站上免費取得¹⁴。

內容解密:

這個練習的目的是引導讀者探索ACL的文集,瞭解NLP領域的最新研究成果和趨勢。透過瀏覽ACL的網站和閱讀相關論文,讀者可以深入瞭解NLP的各個方面,包括統計NLP、深度學習等。

圖表翻譯:

  graph LR
    A[ACL網站] --> B[論文瀏覽]
    B --> C[統計NLP]
    C --> D[深度學習]
    D --> E[NLP趨勢]
    E --> F[研究成果]

這個圖表展示了讀者如何透過ACL的網站瀏覽論文,進而瞭解統計NLP、深度學習等NLP的各個方面,最終掌握NLP的最新趨勢和研究成果。

自然語言處理中的作者風格分析

自然語言處理(NLP)是一個多元化的領域,涵蓋了語言的各個方面,從語音辨識到文字分析。在這個領域中,作者風格分析是一個重要的研究方向。作者風格分析是指透過分析文字的語言特徵來判斷作者的身份、風格和寫作習慣。

ACL 作者風格分析

ACL(Association for Computational Linguistics)是一個著名的計算語言學會,每年都會舉辦學術會議和發表會議論文。在這個背景下,找到每個年代最具代表性的ACL作者是一個有趣的問題。這個問題需要分析大量的文字資料,包括作者的論文、演講和其他出版物。

文字分類和聚類

文字分類和聚類是NLP中的兩個基本任務。文字分類是指將文字歸類到預先定義的類別中,而文字聚類是指根據文字的相似性將其分組。這兩個任務可以用於分析ACL作者的風格和主題。

GloVe 向量空間

GloVe是一種詞嵌入演算法,將詞彙對映到高維向量空間中。在這個空間中,詞彙的語義關係可以透過向量運算來體現。GloVe向量空間可以用於分析詞彙的語義特徵和作者風格。

Cornelian 和 Racinian 戲劇

Cornelian和Racinian是兩種不同的戲劇風格,分別由Corneille和Racine這兩位著名的法國悲劇作家所代表。分析這兩種風格的戲劇可以幫助我們瞭解作者的風格和寫作習慣。

內容解密:

上述內容介紹了作者風格分析的基本概念和方法,包括文字分類、聚類和詞嵌入。同時,也介紹了ACL作者風格分析和Cornelian、Racinian戲劇分析的應用。

import numpy as np
from sklearn.cluster import KMeans
from sklearn.feature_extraction.text import TfidfVectorizer

# 載入ACL作者的文字資料
acl_texts = ...

# 建立TF-IDF向量化器
vectorizer = TfidfVectorizer()

# 將文字資料轉換為TF-IDF向量
acl_vectors = vectorizer.fit_transform(acl_texts)

# 執行K-means聚類
kmeans = KMeans(n_clusters=5)
kmeans.fit(acl_vectors)

# 取得聚類結果
labels = kmeans.labels_

# 分析聚類結果
for label in np.unique(labels):
    cluster_texts = acl_texts[labels == label]
    print(f"Cluster {label}: {cluster_texts}")

圖表翻譯:

以下是使用Mermaid語法繪製的ACL作者風格分析流程圖:

  graph LR
    A[文字資料] --> B[TF-IDF向量化]
    B --> C[K-means聚類]
    C --> D[聚類結果]
    D --> E[分析結果]

這個圖表展示了ACL作者風格分析的基本流程,從文字資料的載入、TF-IDF向量化、K-means聚類到最終的分析結果。

自然語言處理的演進

自然語言處理(NLP)是一個多學科的領域,涉及電腦科學、語言學和認知科學。近年來,NLP 的發展迅速,推動了許多應用程式的出現,例如語言翻譯、語音識別和文字分析。

NLP 的基礎

NLP 的基礎是語言學和電腦科學。語言學提供了語言的結構和語法的知識,而電腦科學提供了處理和分析語言的工具。早期的 NLP 研究主要集中在語言的語法和語義上,例如 Zellig S. Harris 的「Distributional structure」[12]。

NLP 的演進

在 1990 年代,NLP 的研究開始轉向統計方法,例如 Latent Semantic Analysis(LSA)[15]。LSA 是一個根據統計的方法,用於分析文字的語義關係。同時,NLP 的應用程式也開始出現,例如語言翻譯和語音識別。

在 2000 年代,NLP 的研究開始轉向機器學習和深度學習。例如,Word2Vec [10] 和 GloVe [19] 是兩個流行的詞向量模型,用於表示詞彙的語義關係。同時,NLP 的應用程式也開始擴充套件,例如文字分析和情感分析。

NLP 的未來

NLP 的未來是非常廣闊的。隨著機器學習和深度學習的發展,NLP 的應用程式將會更加廣泛和複雜。例如,語言翻譯、語音識別和文字分析將會更加精確和實用。同時,NLP 也將會與其他領域結合,例如電腦視覺和機器人學,創造出新的應用程式和服務。

NLP 的相關研究

NLP 的相關研究包括語言學、電腦科學和認知科學。語言學提供了語言的結構和語法的知識,而電腦科學提供了處理和分析語言的工具。認知科學則提供了人類認知和語言的知識,用於理解語言的語義和語用。

NLP 的應用程式

NLP 的應用程式包括語言翻譯、語音識別、文字分析和情感分析。語言翻譯是將一種語言的文字翻譯成另一種語言的文字。語音識別是將語音轉換成文字。文字分析是分析文字的語義和語用。情感分析是分析文字的情感和態度。

圖表翻譯

上述圖表展示了 NLP 的相關領域和應用程式。語言學和電腦科學是 NLP 的基礎。NLP 的應用程式包括語言翻譯、語音識別、文字分析和情感分析。這些應用程式是根據 NLP 的技術和工具,用於處理和分析語言。

深度神經網路的基本結構

深度神經網路是一種強大的機器學習模型,能夠學習和代表複雜的模式和關係。它由多層神經元或節點組成,每個節點都有一個值和一組引數。這些引數包括權重和偏差,分別用於計算輸入的加權和和偏移量。

神經元的運作

每個神經元都會接收來自前一層的所有輸入,然後對這些輸入進行加權和,最後加上偏差。這個過程可以用以下公式表示:

$$ z = \sum_{i=1}^{n} w_i \cdot x_i + b $$

其中,$z$ 是神經元的輸出,$x_i$ 是輸入,$w_i$ 是權重,$b$ 是偏差。

啟用函式

神經元的輸出會經過一個啟用函式,將輸出轉換為一個非線性的值。常用的啟用函式包括 sigmoid 函式、hyperbolic tangent 函式和 ReLU 函式。

損失函式

深度神經網路的目標是最小化損失函式,損失函式衡量了模型的預測結果和實際結果之間的差異。常用的損失函式包括均方差和交叉熵。

引數更新

深度神經網路的引數會經過反向傳播演算法進行更新,該演算法從最後一層開始,逐層向前傳播誤差訊號,更新每個節點的引數。這個過程可以用以下公式表示:

$$ w_{ij} = w_{ij} - \eta \cdot \frac{\partial L}{\partial w_{ij}} $$

其中,$w_{ij}$ 是權重,$\eta$ 是學習率,$L$ 是損失函式。

內容解密:

上述程式碼定義了一個簡單的深度神經網路,包含了一個輸入層、一個隱藏層和一個輸出層。啟用函式使用 sigmoid 函式,損失函式使用均方差,引數更新使用梯度下降法。模型的輸入資料是隨機生成的,輸出結果也是隨機生成的。模型的訓練過程包括了 1000 次迭代,每次迭代都會更新模型的引數。最後,模型的預測結果會被評估,使用均方差作為評估指標。

神經網路的核心:softmax 函式

在神經網路中,softmax 函式是一種常用的輸出層啟用函式,尤其是在多分類問題中。它的主要功能是將輸入的向量轉換為一組機率值,且這些機率值加起來等於 1。

softmax 函式的公式如下:

$$ \text{softmax}(\mathbf{x}) = \frac{\exp(x_i)}{\sum_{j=1}^{n} \exp(x_j)} $$

其中,$\mathbf{x}$ 是輸入向量,$x_i$ 是向量中的第 $i$ 個元素,$n$ 是向量中的元素個數。

softmax 函式的作用

softmax 函式的主要作用是將輸入的向量轉換為一組機率值。這些機率值可以用來表示不同分類的可能性。

例如,在一個多分類問題中,輸入的向量可能代表了不同分類的特徵。softmax 函式可以將這些特徵轉換為一組機率值,表示每個分類的可能性。

softmax 函式的優點

softmax 函式有以下優點:

  • 確保機率值加起來等於 1:softmax 函式可以確保輸出的機率值加起來等於 1,這是機率值的基本性質。
  • 能夠處理多分類問題:softmax 函式可以用於多分類問題,能夠將輸入的向量轉換為一組機率值,表示不同分類的可能性。

softmax 函式的實作

以下是 Python 中 softmax 函式的實作:

import numpy as np

def softmax(x):
    e_x = np.exp(x - np.max(x))
    return e_x / e_x.sum(axis=0)

# 測試 softmax 函式
x = np.array([1, 2, 3, 4, 5])
print(softmax(x))

在這個實作中,np.exp(x - np.max(x)) 用於計算 softmax 函式的分子,e_x.sum(axis=0) 用於計算 softmax 函式的分母。

神經網路的奧秘:從零開始

神經網路是一種強大的機器學習模型,它可以從資料中學習並做出預測。然而,神經網路的工作原理往往被視為一個「黑盒」,難以理解。為了揭開這個黑盒的奧秘,我們將從零開始,手動計算一個簡單的神經網路的運算過程。

神經網路的結構

我們的神經網路由五個節點(Node)組成,分別是 A、B、C、D 和 E。每個節點都有一個值,分別是 $x_A$、$x_B$、$y_C$、$y_D$ 和 $z_E$。我們的神經網路只有三層:輸入層(Input Layer)、隱藏層(Hidden Layer)和輸出層(Output Layer)。

啟用函式

我們使用 sigmoid 啟用函式 $\sigma$ 來啟用每個節點的值。sigmoid 函式的輸出範圍是 (0, 1),這使得它非常適合用於二元分類問題。

引數

我們的神經網路有六個引數,分別是 $w_1$、$w_2$、$w_3$、$w_4$、$w_5$ 和 $w_6$。這些引數代表了每個節點之間的連線強度。

手動計算

現在,我們將手動計算一個簡單的神經網路的運算過程。假設我們的輸入值是 $x_A = 0.23$ 和 $x_B = 0.82$。我們的目標是計算輸出值 $z_E$。

首先,我們計算隱藏層的值:

$$ \begin{aligned} y_C &= \sigma(w_1 \cdot x_A + w_2 \cdot x_B) \ y_D &= \sigma(w_3 \cdot x_A + w_4 \cdot x_B) \end{aligned} $$

接下來,我們計算輸出層的值:

$$ z_E = \sigma(w_5 \cdot y_C + w_6 \cdot y_D) $$

反向傳播

現在,我們需要計算誤差並更新引數。假設我們的預測值是 $z_E$,而真實值是 $y$。我們可以計算誤差如下:

$$ E = (z_E - y)^2 $$

接下來,我們計算每個引數的梯度:

$$ \begin{aligned} \frac{\partial E}{\partial w_1} &= -2 \cdot (z_E - y) \cdot \sigma’(w_1 \cdot x_A + w_2 \cdot x_B) \cdot x_A \ \frac{\partial E}{\partial w_2} &= -2 \cdot (z_E - y) \cdot \sigma’(w_1 \cdot x_A + w_2 \cdot x_B) \cdot x_B \ \frac{\partial E}{\partial w_3} &= -2 \cdot (z_E - y) \cdot \sigma’(w_3 \cdot x_A + w_4 \cdot x_B) \cdot x_A \ \frac{\partial E}{\partial w_4} &= -2 \cdot (z_E - y) \cdot \sigma’(w_3 \cdot x_A + w_4 \cdot x_B) \cdot x_B \ \frac{\partial E}{\partial w_5} &= -2 \cdot (z_E - y) \cdot \sigma’(w_5 \cdot y_C + w_6 \cdot y_D) \cdot y_C \ \frac{\partial E}{\partial w_6} &= -2 \cdot (z_E - y) \cdot \sigma’(w_5 \cdot y_C + w_6 \cdot y_D) \cdot y_D \end{aligned} $$

最後,我們更新每個引數:

$$ \begin{aligned} w_1 &= w_1 - \alpha \cdot \frac{\partial E}{\partial w_1} \ w_2 &= w_2 - \alpha \cdot \frac{\partial E}{\partial w_2} \ w_3 &= w_3 - \alpha \cdot \frac{\partial E}{\partial w_3} \ w_4 &= w_4 - \alpha \cdot \frac{\partial E}{\partial w_4} \ w_5 &= w_5 - \alpha \cdot \frac{\partial E}{\partial w_5} \ w_6 &= w_6 - \alpha \cdot \frac{\partial E}{\partial w_6} \end{aligned} $$

其中,$\alpha$ 是學習率。

深度神經網路基礎

在深度學習中,神經網路是核心結構。這裡,我們將探討一個簡單的深度神經網路,以瞭解其基本組成和運作原理。

神經網路結構

考慮一個簡單的深度神經網路,如圖15.1所示。這個網路包含多個層次,每個層次都有一組神經元(或節點)。輸入層接收初始資料,輸出層產生最終結果,而隱藏層則進行複雜的資料轉換和特徵提取。

引數初始化

在訓練神經網路之前,需要初始化其引數(權重和偏差)。這些初始值通常是隨機生成的。例如,給定的初始引數值可能是:

  • (w_1 = 0.23)
  • (w_2 = 0.82)
  • (w_3), (w_4), (w_5), (w_6) 的初始值也將被隨機設定。

神經網路運作

當輸入資料 (x_A) 和 (x_B) 被提供給網路時,神經網路會根據其當前引數計算輸出。這個過程涉及將輸入資料與權重相乘、新增偏差、並經過啟用函式以產生中間結果,直到最終產生輸出 (y_C) 和 (y_D)。

訓練目標

假設對於給定的輸入 (x_A) 和 (x_B),我們期望的正確輸出是 (y_C = 1)。訓練的目標是調整神經網路的引數,使得輸出能夠盡可能接近期望值。

實作

以下是使用 Python 和 Keras 實作這個簡單神經網路的例子:

from keras.models import Sequential
from keras.layers import Dense

# 定義模型
model = Sequential()
model.add(Dense(64, activation='relu', input_shape=(2,)))
model.add(Dense(32, activation='relu'))
model.add(Dense(2))

# 編譯模型
model.compile(optimizer='adam', loss='mean_squared_error')

# 初始化輸入和期望輸出
x_A = 0.23
x_B = 0.82
y_C_expected = 1

# 訓練模型
model.fit([[x_A, x_B]], [[y_C_expected, 0]], epochs=100)

這個例子展示瞭如何使用 Keras 定義一個簡單的神經網路,並使用給定的輸入和期望輸出進行訓練。這是深度學習中的一個基本步驟,透過調整模型的引數來最小化輸出和期望之間的差異。

神經網路中的前向傳播

在神經網路中,前向傳播(Forward Propagation)是一個基本的過程,描述瞭如何將輸入資料從輸入層傳遞到輸出層。這個過程涉及到每個神經元(Node)如何接收來自前一層的輸入,進行加權、求和和啟用函式的運算。

加權和求和

每個神經元會從前一層的神經元接收輸入值,然後將這些值乘以對應的權重(Weight),並將結果加總起來。這個過程可以用以下的數學式來描述:

對於某個神經元 $C$,它接收到的輸入值來自於前一層的神經元 $A$ 和 $B$,分別乘以權重 $w_1$ 和 $w_3$,然後加總起來:

$$ w_1 \cdot x_A + w_3 \cdot x_B $$

這裡,$x_A$ 和 $x_B$ 分別是神經元 $A$ 和 $B$ 的輸出值,而 $w_1$ 和 $w_3$ 是權重。

啟用函式

加總之後,神經元會對結果應用啟用函式(Activation Function)。啟用函式的作用是引入非線性,使得神經網路能夠學習和代表更複雜的關係。常見的啟用函式包括 Sigmoid 函式、ReLU 函式等。

以 Sigmoid 函式為例,對於加總結果 $z$,Sigmoid 函式的輸出為:

$$ \sigma(z) = \frac{1}{1 + e^{-z}} $$

這個過程對於每個神經元都會重複進行,直到輸出層。

範例

假設我們有一個簡單的神經網路,輸入層有兩個神經元 $A$ 和 $B$,輸出層有一個神經元 $C$。權重分別為 $w_1 = 0.4$ 和 $w_3 = 0.6$,啟用函式為 Sigmoid 函式。若輸入值為 $x_A = 0.2$ 和 $x_B = 0.8$,則神經元 $C$ 的輸出可以按照以下步驟計算:

  1. 加權和求和:$0.4 \cdot 0.2 + 0.6 \cdot 0.8 = 0.08 + 0.48 = 0.56$
  2. 啟用函式:$\sigma(0.56) = \frac{1}{1 + e^{-0.56}}$

這樣,神經元 $C$ 的輸出就可以計算出來了。

從技術架構視角來看,FastText 作為一種高效的詞向量表示模型,其核心優勢在於利用子詞資訊提升了對罕見詞和形態豐富語言的處理能力。相較於 Word2Vec,FastText 詞向量能夠捕捉更細粒度的語義資訊,並有效解決詞彙表外單詞(OOV)的問題。然而,FastText 的子詞模型引入了額外的計算和儲存開銷,尤其在處理大規模語料函式庫時,需要更強大的硬體資源支援。對於追求高效率的應用場景,需權衡模型大小和效能表現。玄貓認為,FastText 在處理形態豐富、詞彙量大的語料,以及需要兼顧效率和準確性的場景下,具有明顯的優勢,未來可望在跨語言學習和低資源語言處理等領域發揮更大作用。