近兩年大預言模型很火,大預言模型可以視為是自然語言處理領域的一大應用。自然語言處理(Natural Language Processing, NLP)其核心目標是使計算機能夠理解、生成和處理人類語言。語言的基礎是詞語,那么如何讓機器來理解詞語呢?這就關系到詞的表示,也就是詞向量。
在NLP中,詞向量(word vector)是非常重要的概念,它通過將詞語表示為多維向量來捕捉詞語的語義信息。構造詞向量的的方法有很多,比如通過神經網絡進行構建,不過本文將介紹一種直觀的構建詞向量的方法,并通過數學模型和具體案例進行分析和說明。
詞向量的基本概念
詞向量是用于表示詞語在語義空間中位置的向量。通過將詞語轉換為向量,我們可以在數學上處理詞語的相似性和關系。詞向量的核心思想是“可以通過它周圍的詞語了解一個單詞” ('You shall know a word by the company it keeps'),也就是說一個詞的意義可以通過它在文本中與其他詞的共現關系來捕捉。
數學模型
下面我介紹的構建詞向量的過程主要是基于詞語間的共現關系,分為以下幾個步驟:
- 語料庫準備:首先需要一個大規模的文本語料庫,用于統計詞語的共現關系。
- 上下文窗口:選擇一個合適的上下文窗口大?。ㄍǔ?到10個詞),用于確定哪些詞語是目標詞的上下文詞。
- 共現矩陣:構建一個共現矩陣,矩陣的每一行代表一個目標詞,每一列代表一個上下文詞,矩陣中的值表示目標詞與上下文詞在文本中共現的頻率。
- 降維處理:使用降維算法(如SVD、PCA等)將高維的共現矩陣轉換為低維的詞向量表示。
假設我們有一個包含 個詞語的詞匯表 ,我們可以構建一個 的共現矩陣 ,其中 表示詞語 和 在上下文窗口中的共現頻率。
然后我們通過降維算法將共現矩陣 轉換為詞向量矩陣 ,其中每一行 表示詞語 的向量表示。常用的降維算法包括奇異值分解(SVD)和主成分分析(PCA)等。
案例分析
我們通過一個具體的例子來說明構建詞向量的過程。
語料庫準備:假設我們的語料庫是以下簡短的文本:
I love machine learning.
Machine learning is fun.
I love coding.
我們的詞匯表 包含以下詞語:I
, love
, machine
, learning
, is
, fun
, coding
。
上下文窗口:選擇上下文窗口大小為2,即考慮目標詞前后各2個詞。
共現矩陣:統計詞語在上下文窗口中的共現頻率,得到以下共現矩陣 :
降維處理:使用奇異值分解(SVD)對共現矩陣 進行降維處理。SVD將矩陣 分解為三個矩陣的乘積:,其中 和 是正交矩陣, 是對角矩陣。通過截取前 個奇異值,可以得到低維詞向量矩陣 。
如果設定降維后的維度為2,我們可以得到以下詞向量:

為了驗證我們構建的詞向量的有效性,我們可以計算詞語之間的余弦相似度。余弦相似度用于衡量兩個向量之間的相似性,計算公式為:
其中, 表示向量 和 的點積, 和 分別表示向量 和 的模。
我們計算以下詞語對之間的余弦相似度:
import numpy as np
# 定義降維后的詞向量矩陣
word_vectors = np.array([
[1.51499668, -1.4173672],
[1.87698946, 1.68604424],
[1.66865789, 0.19649234],
[1.49526816, -0.93713897],
[1.08538304, 0.17374271],
[0.72099204, 0.30320536],
[0.52440038, -0.66966223]
])
# 詞匯表
words = ['I', 'love', 'machine', 'learning', 'is', 'fun', 'coding']
# 計算余弦相似度的函數
def cosine_similarity(vec1, vec2):
dot_product = np.dot(vec1, vec2)
norm_vec1 = np.linalg.norm(vec1)
norm_vec2 = np.linalg.norm(vec2)
return dot_product / (norm_vec1 * norm_vec2)
# 計算特定詞語對之間的余弦相似度
pairs = [('love', 'coding'), ('machine', 'learning'), ('is', 'fun')]
for pair in pairs:
idx1 = words.index(pair[0])
idx2 = words.index(pair[1])
similarity = cosine_similarity(word_vectors[idx1], word_vectors[idx2])
print(f''{pair[0]}' 和 '{pair[1]}' 之間的余弦相似度: {similarity:.4f}')
運行結果:
'love' 和 'coding' 之間的余弦相似度: -0.0675
'machine' 和 'learning' 之間的余弦相似度: 0.7794
'is' 和 'fun' 之間的余弦相似度: 0.9715
從結果可以看出,machine
和 learning
以及 is
和 fun
的相似度較高,而 love
和 coding
的相似度相對較低。當然因為我們現在的文本(語料庫)比較小,這里的相似關系或許不那么明顯。我們可以進行大語料庫的試驗。
來看看與我們對這些詞語在語義上的預期是否是一致的,進而驗證我們構建的詞向量能否在一定程度上捕捉到了詞語之間的語義關系。
如果大家想要了解更多關于詞向量的內容,可以進一步學習以下概念和方法:了解基于神經網絡的Word2Vec模型和斯坦福大學提出的GloVe模型,這兩者都是經典的詞向量構建方法。還有Facebook AI研究團隊開發的FastText模型,它通過子詞生成向量表示。Google的BERT模型和Transformer架構,這些是現代NLP的重要進展。
學習如何使用t-SNE或PCA對詞向量進行降維和可視化。研究上下文嵌入(如ELMo、BERT、GPT),它們根據上下文動態生成詞語的向量表示。這些方法和工具可以幫助大家更全面地理解和應用詞向量技術。