在自然語言處理(NLP)領域,詞向量(Word Embedding)是將人類語言轉化為計算機可理解形式的關鍵技術。它通過數學空間中的向量表示,捕捉詞語的語義和語法信息,有效解決了傳統離散表示的 “維數災難” 和 “語義鴻溝” 問題。接下來,我們將深入探討詞向量的原理,并結合代碼實踐,直觀感受其強大之處。?
一、詞向量的本質與核心作用?
詞向量是將語言符號(詞語)轉化為連續稠密向量的技術,核心思想是通過向量表示來反映詞語間的語義關聯。相似語義的詞語在向量空間中距離相近,例如 “國王” 與 “女王”、“蘋果” 與 “香蕉” 。在實際應用中,詞向量為 NLP 任務(如文本分類、機器翻譯、命名實體識別等)提供低維、稠密的特征輸入,也是預訓練模型(如 BERT、GPT)的底層技術支撐。?
二、詞向量的發展歷程與經典模型?
1. 早期離散表示(One-Hot Encoding)?
One-Hot Encoding 是早期常用的詞語表示方法,每個詞語用唯一的高維稀疏向量表示。例如,若詞典大小為 10 萬,那么每個詞語的向量維度就是 10 萬。這種方式存在明顯缺陷,無法體現詞語間的語義關聯,且維度過高導致計算效率低下。在 Python 中,我們可以使用scikit-learn庫簡單實現 One-Hot Encoding:?
?
TypeScript
取消自動換行復制
from sklearn.preprocessing import OneHotEncoder?
import numpy as np?
?
words = np.array([["apple"], ["banana"], ["cherry"]])?
encoder = OneHotEncoder()?
one_hot = encoder.fit_transform(words).toarray()?
print(one_hot)?
?
2. 分布式表示(Distributed Representation)的興起?
分布式表示通過上下文預測建模,將詞語映射到低維連續空間,其中經典的 Word2Vec 模型由 Google 在 2013 年提出,它包含 CBOW(連續詞袋模型)和 Skip-gram 兩種訓練模式。CBOW 通過詞語的上下文預測其本身,Skip-gram 則通過詞語預測其上下文。下面使用gensim庫來訓練一個簡單的 Word2Vec 模型:?
?
TypeScript
取消自動換行復制
from gensim.models import Word2Vec?
sentences = [["apple", "banana", "cherry"], ["banana", "date", "elderberry"]]?
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)?
# 查看某個詞的詞向量?
print(model.wv["apple"])?
# 找出最相似的詞?
print(model.wv.most_similar("apple"))?
?
另一個經典模型 GloVe(Global Vectors for Word Representation)結合全局詞共現統計與局部上下文窗口,通過最小化加權最小二乘損失訓練向量。雖然gensim庫也提供了 GloVe 的實現,但更多時候我們會使用預訓練好的 GloVe 向量。?
3. 上下文敏感的動態詞向量?
早期詞向量是靜態的,無法處理多義詞。動態詞向量則能根據上下文生成不同表示,其中 ELMo(Embeddings from Language Models)通過雙向 LSTM 預訓練語言模型,生成包含上下文信息的詞向量。而 BERT(Bidirectional Encoder Representations from Transformers)使用 Transformer 編碼器,通過掩碼語言模型(MLM)和下一句預測(NSP)預訓練,將動態詞向量技術推向新高度。下面使用transformers庫獲取 BERT 的詞向量:?
?
TypeScript
取消自動換行復制
from transformers import BertTokenizer, BertModel?
import torch?
?
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')?
model = BertModel.from_pretrained('bert-base-uncased')?
text = "I went to the bank to deposit money"?
inputs = tokenizer(text, return_tensors="pt")?
with torch.no_grad():?
outputs = model(**inputs)?
last_hidden_states = outputs.last_hidden_state?
print(last_hidden_states.shape) # 輸出 [batch_size, sequence_length, hidden_size]?
?
三、詞向量的關鍵技術特性?
1. 向量空間的幾何意義?
在詞向量空間中,通常使用余弦相似度來衡量詞語相關性,公式為:?
sim(u,v)=∥u∥∥v∥u?v?
?
?
在 Python 中,可使用numpy計算余弦相似度:?
?
TypeScript
取消自動換行復制
import numpy as np?
?
vec1 = np.array([1, 2, 3])?
vec2 = np.array([4, 5, 6])?
cos_sim = np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))?
print(cos_sim)?
?
此外,向量運算還能反映語義關系,如 “國王” - “男人” + “女人” ≈ “女王”。?
2. 維度選擇?
詞向量常見維度有 50、100、300 等,需要平衡計算效率與表達能力。低維向量適合輕量級任務,高維向量可捕捉更復雜語義。在訓練 Word2Vec 模型時,可通過vector_size參數指定維度。?
3. 評估指標?
詞向量的評估分為內在評估和外在評估。內在評估包括類比推理(如 “中國 - 北京” 對應 “日本 - 東京”)、詞語相似度排名;外在評估則關注在具體 NLP 任務(如情感分析)中的性能表現。?
四、詞向量的應用場景?
1. 基礎 NLP 任務?
在文本分類任務中,可將句子中詞語的向量平均或拼接作為特征輸入分類器。以下是一個簡單的文本分類示例,使用 Word2Vec 詞向量和邏輯回歸:?
?
TypeScript
取消自動換行復制
from sklearn.linear_model import LogisticRegression?
from sklearn.metrics import accuracy_score?
import numpy as np?
?
# 假設已經有訓練好的詞向量和標簽?
train_vectors = np.array([[1, 2, 3], [4, 5, 6]]) # 詞向量?
train_labels = np.array([0, 1]) # 標簽?
test_vectors = np.array([[7, 8, 9]])?
test_labels = np.array([1])?
?
clf = LogisticRegression()?
clf.fit(train_vectors, train_labels)?
predicted = clf.predict(test_vectors)?
print(accuracy_score(test_labels, predicted))?
?
2. 生成任務?
在機器翻譯中,源語言詞向量經編碼器生成上下文向量,解碼器生成目標語言;在文本生成任務中,GPT 等模型基于動態詞向量生成連貫文本。?
3. 跨語言處理?
跨語言詞向量(如 mBERT)可對齊不同語言的語義空間,支持零樣本翻譯。?
五、挑戰與前沿發展?
1. 挑戰?
詞向量技術面臨多語言鴻溝、時效性不足以及可解釋性差等挑戰。資源稀缺語言的詞向量質量低,靜態詞向量難以捕捉新詞和領域特定術語,向量空間的語義映射缺乏明確物理意義。?
2. 前沿方向?
目前前沿研究聚焦于動態詞向量優化,如 GPT-4、LLaMA 等大模型進一步提升上下文理解能力;探索圖結構詞向量,結合知識圖譜注入結構化語義;以及通過對比學習實現少樣本 / 無監督學習場景下的詞向量訓練。?
六、工具與資源推薦?
在實際應用中,有許多工具和資源可供使用。訓練工具方面,可使用 TensorFlow/PyTorch 自定義詞向量訓練框架,也可通過 SpaCy/Flair 獲取預訓練詞向量,支持多語言。預訓練模型庫推薦使用 Hugging Face Transformers,它包含 BERT、GPT 等模型的詞向量接口;FastText 官方預訓練向量支持 100 + 語言,可直接下載使用。?
詞向量作為連接自然語言與計算機的橋梁,其技術演進深刻影響著 NLP 的發展。從早期靜態表示到動態上下文感知,詞向量始終是理解語言語義的核心工具,未來也將在多模態、低資源等場景中持續突破。通過理論學習與代碼實踐相結合,我們能更好地掌握這一技術,應用于實際項目中。?