電腦只能處理數字,無法直接理解「文字」,因此 NLP 的第一步,就是要把語言轉換成數字形式,也就是文本表示(Text Representation),NLP 系統的性能會因為受到不同的表示,而影響輸出結果。
文本表示的發展經歷了幾個重要階段:One-Hot → Bag of Words/TF-IDF → Word2Vec → ELMo → LLM 的 Embedding,每一代方法都是為了讓電腦更好的捕捉語言的語意。
1.向量空間模型 (VSM) — One-Hot & Bag of Words
把「詞」當成詞典中的一個索引,無法理解字詞的順序,如下範例是兩句很接近的句子,但是卻被表示兩句毫無相關。
from sklearn.feature_extraction.text import CountVectorizer
corpus = ["我愛2025iThome鐵人賽", "2025iThome鐵人賽愛我"]
vec = CountVectorizer()
X = vec.fit_transform(corpus)
print("詞彙表:", vec.get_feature_names_out())
print("向量表示:\n", X.toarray())
輸出結果
詞彙表: ['2025ithome鐵人賽愛我' '我愛2025ithome鐵人賽']
向量表示:
[[0 1]
[1 0]]
2.TF-IDF:考慮詞的重要性
在 BoW 的基礎上,給常見詞(例如「的」)更低權重,給有區分性的詞更高權重,但仍然無法理解語意或上下文。
import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = ["我愛自然語言處理", "自然語言處理很有趣", "我愛鐵人賽"]
corpus_cut = [" ".join(jieba.lcut(doc)) for doc in corpus]
vec = TfidfVectorizer()
X = vec.fit_transform(corpus_cut)
print("詞彙表:", vec.get_feature_names_out())
print("TF-IDF 結果:\n", X.toarray())
輸出結果
詞彙表: ['愛鐵人賽' '有趣' '自然' '處理' '語言']
TF-IDF 結果:
[[0. 0. 0.57735027 0.57735027 0.57735027]
[0. 0.60465213 0.45985353 0.45985353 0.45985353]
[1. 0. 0. 0. 0. ]]
可以看出沒有出現在詞彙表的詞有更高的權重(有區分性)
3.Word2Vec:讓詞有語意關聯
Word2Vec 用神經網路訓練詞向量,從這裡開始能理解語意,但是每個詞只有「一個固定向量」,這個階段還無法處理一詞多義的狀況。
4.ELMo:動態詞向量
ELMo 使用雙向 LSTM,根據上下文生成動態詞向量,例如「bank」這個詞在「river bank」和「bank account」會有不同的表示,從這裡開始能捕捉上下文的關係,也可以處理一詞多義了。