1. One-Hot Encoding (獨熱編碼)
-
核心思想:?為語料庫(所有文檔的集合)中的每個唯一單詞創建一個維度。對于一個特定的單詞,在其對應的維度上標記為
1
,在所有其他維度上標記為0
。 -
表示:?一個非常長的二進制向量(大部分是0),長度等于語料庫的詞匯表大小(|V|)。
-
特點:
-
簡單直觀:?最容易理解。
-
高維稀疏:?向量維度極高(詞匯量大),且每個向量中只有少數幾個位置是1(文檔中出現的詞),其余都是0,極其稀疏。
-
無詞序信息:?完全丟失了單詞在句子中的順序信息。“貓吃魚”和“魚吃貓”的表示完全一樣。
-
無頻率信息:?只記錄單詞是否出現(1),不記錄出現的次數。出現一次和出現十次沒有區別。
-
無語義信息:?無法捕捉單詞之間的任何語義關系(同義詞、反義詞等)。“好”和“優秀”被視為完全不同的、無關的維度。
-
-
應用場景:?非常基礎的文本表示,常用于類別型特征(如標簽)的編碼。在文本中單獨使用較少,常作為構建其他模型(如BOW)的基礎組件或用于表示類別標簽。
-
例子:
-
詞匯表:
[我, 愛, 自然, 語言, 處理]
?(|V| = 5) -
句子 "我愛自然語言處理" 的 One-Hot 向量:?
[1, 1, 1, 1, 1]
-
句子 "我愛編程" 的 One-Hot 向量:?
[1, 1, 0, 0, 0]
?(假設詞匯表不變,且"編程"不在詞匯表中則無法表示,這是其局限)
-
2. Bag-of-Words (詞袋模型, BOW)
-
核心思想:?建立在 One-Hot 的基礎上。忽略單詞的順序、語法和上下文,只關心詞匯表中每個單詞在文檔中出現的頻率。
-
表示:?一個長度為 |V| 的整數向量(或有時是實數向量)。每個位置的值表示對應單詞在當前文檔中出現的次數。
-
特點:
-
簡單高效:?計算相對簡單。
-
包含頻率信息:?比 One-Hot 更進一步,記錄了單詞出現的次數。
-
依然高維稀疏:?維度與詞匯表大小 |V| 相同,向量中大部分位置仍然是0(該文檔未出現的詞)。
-
依然無詞序信息:?和 One-Hot 一樣,完全丟失了單詞順序。"貓吃魚"和"魚吃貓"的 BOW 向量相同。
-
依然無語義信息:?無法捕捉單詞之間的語義關系。
-
受常見詞影響大:?"的"、"是"、"在"等常見詞(停用詞)在所有文檔中頻繁出現,在向量中占據很大的值,但它們通常攜帶的信息量很少,可能會淹沒真正重要的詞。
-
-
應用場景:?文本分類(如垃圾郵件識別、情感分析初探)、主題建模(如LDA的基礎)等對詞序要求不高且需要簡單快速模型的任務。
-
例子 (續用One-Hot詞匯表):
-
詞匯表:
[我, 愛, 自然, 語言, 處理]
?(|V| = 5) -
句子 "我愛自然語言處理" 的 BOW 向量:?
[1, 1, 1, 1, 1]
-
句子 "我愛自然,自然美麗" 的 BOW 向量:?
[1, 1, 2, 0, 0]
?("自然"出現2次)
-
3. TF-IDF (詞頻-逆文檔頻率)
-
核心思想:?對 BOW 的重要改進。旨在解決 BOW 中常見詞權重過高的問題。它認為:
-
一個詞在當前文檔中出現的次數越多(TF - Term Frequency,詞頻),它對描述該文檔越重要。
-
但是,如果這個詞在整個語料庫的很多文檔中都出現(DF - Document Frequency,文檔頻率很高),那么它就越常見、越普通,區分不同文檔的能力就越弱。因此需要降低其權重。
-
IDF - Inverse Document Frequency (逆文檔頻率)?就是用來懲罰這種常見詞的。IDF 值與該詞的文檔頻率 DF 成反比。
IDF(t) = log(N / (DF(t) + 1))
?(N 是語料庫中文檔總數,DF(t) 是包含詞 t 的文檔數,+1 避免除0)。
-
-
計算:?對于文檔?
d
?中的詞?t
:-
TF(t, d)
: 詞?t
?在文檔?d
?中出現的頻率(可以是原始計數、標準化計數、對數化等)。 -
IDF(t)
:?log(N / (DF(t) + 1))
。 -
TF-IDF(t, d) = TF(t, d) * IDF(t)
-
-
表示:?一個長度為 |V| 的實數向量。每個位置的值是相應單詞在當前文檔中的 TF-IDF 權重。
-
特點:
-
降低常見詞權重,提高重要詞權重:?這是 TF-IDF 的核心優勢。常見詞(如"的"、"是")雖然 TF 可能高,但 IDF 極低(因為 DF 極高),導致其 TF-IDF 值很低。而只在少數特定文檔中頻繁出現的詞(如專業術語、主題關鍵詞)會同時擁有較高的 TF 和較高的 IDF,因此獲得很高的 TF-IDF 值。
-
包含頻率信息:?基于 TF。
-
考慮語料庫全局信息:?通過 IDF 引入了語料庫級別的統計信息。
-
依然高維稀疏:?維度 |V| 大,向量稀疏。
-
依然無詞序信息:?和 BOW/One-Hot 一樣。
-
依然無語義信息:?無法捕捉語義關系。
-
-
應用場景:?信息檢索(搜索引擎排序)、文本分類、關鍵詞提取、文檔相似度計算等。是 BOW 的強有力替代者,在實踐中應用非常廣泛。
-
例子 (簡化):
-
假設語料庫有 1000 個文檔 (N=1000)。
-
詞 "自然" 出現在 100 個文檔中 (DF=100),其?
IDF(自然) = log(1000 / 101) ≈ log(9.9) ≈ 2.29
。 -
詞 "的" 出現在 990 個文檔中 (DF=990),其?
IDF(的) = log(1000 / 991) ≈ log(1.01) ≈ 0.01
。 -
在某個特定文檔 d 中:
-
"自然" 出現了 5 次 (
TF(自然, d) = 5
) ->?TF-IDF(自然, d) ≈ 5 * 2.29 = 11.45
。 -
"的" 出現了 20 次 (
TF(的, d) = 20
) ->?TF-IDF(的, d) ≈ 20 * 0.01 = 0.2
。
-
-
盡管"的"在文檔 d 中出現次數更多 (TF更高),但其 TF-IDF 權重遠低于"自然",因為"自然"更能代表該文檔的特性。
-
4. N-Gram
-
核心思想:?不同于前三種方法(主要關注單個詞),N-Gram 關注連續的詞序列。它將文本視為由連續的 N 個單詞組成的單元(稱為 gram)構成的序列。
-
Unigram (1-gram)
: 單個詞。本質上就是 BOW/TF-IDF 所基于的單元。 -
Bigram (2-gram)
: 連續的兩個詞。例如:"我愛","愛自然","自然語言","語言處理"。 -
Trigram (3-gram)
: 連續的三個詞。例如:"我愛自然","愛自然語言","自然語言處理"。 -
以此類推。
-
-
表示:?構建一個基于 N-Gram 的詞匯表。然后可以用 BOW 或 TF-IDF 的方式來表示文檔:
-
N-Gram BOW:?向量長度為 N-Gram 詞匯表大小,每個位置的值是相應 N-Gram 在當前文檔中出現的次數。
-
N-Gram TF-IDF:?向量長度為 N-Gram 詞匯表大小,每個位置的值是相應 N-Gram 在當前文檔中的 TF-IDF 權重。
-
-
特點:
-
捕捉局部詞序信息:?這是 N-Gram 最大的優勢!通過組合連續的詞,它部分地保留了單詞之間的順序和上下文信息。使用 Bigram 就能區分"貓吃魚"("貓吃", "吃魚")和"魚吃貓"("魚吃", "吃貓")。
-
緩解未登錄詞問題:?即使一個詞沒在訓練語料中出現過,包含它的 N-Gram(特別是較低階的)可能出現過,模型仍能處理。
-
維度爆炸:?N-Gram 詞匯表的大小遠大于單詞詞匯表的大小(|V|^N 量級)。對于 Bigram,詞匯表大小約為 |V|^2;Trigram 約為 |V|^3。這導致特征向量維度急劇膨脹(比 One-Hot/BOW/TF-IDF 高得多),稀疏性也更高。實際應用中 N 通常取 2 或 3,很少超過 5。
-
語義信息有限:?雖然捕捉了局部共現,但仍然不能很好地理解深層次的語義關系或長距離依賴。例如,"好"和"優秀"作為不同詞,它們的 N-Gram 仍然是不同的特征。
-
-
應用場景:?需要捕捉局部詞序的任務,如:
-
拼寫檢查(糾正錯詞需要前后文)
-
機器翻譯(短語結構)
-
語音識別(聲學模型與語言模型結合)
-
基礎的文本生成(預測下一個詞)
-
結合 BOW/TF-IDF 用于文本分類(提供比 unigram 更豐富的特征)
-
關鍵區別總結表
特性 | One-Hot | BOW (詞袋模型) | TF-IDF | N-Gram | ||
---|---|---|---|---|---|---|
基本單元 | 單個詞 | 單個詞 | 單個詞 | 連續的 N 個詞序列 | ||
核心信息 | 詞是否存在 (0/1) | 詞在當前文檔中的頻率 | 詞在當前文檔中的重要性?(TF * IDF) | 局部詞序?(上下文片段) | ||
頻率信息 | ? (只有存在性) | ? (詞頻) | ? (加權詞頻) | ? (N-Gram 頻次或加權頻次) | ||
詞序信息 | ? | ? | ? | ? (在 N 窗口內) | ||
語義信息 | ? | ? | ? | ?? (有限,僅局部共現) | ||
維度/稀疏性 | 極高維 / 極稀疏 | 高維 / 稀疏 | 高維 / 稀疏 | 極高維?( | V | ^N) /?極稀疏 |
解決常見詞問題 | ? | ? | ? (IDF懲罰) | ? (本身不解決,可結合TF-IDF) | ||
主要優勢 | 簡單,表示類別 | 簡單,包含詞頻 | 強調區分性強的詞 | 捕捉局部上下文和順序 | ||
主要缺點 | 高維稀疏,無頻率/順序/語義 | 無順序/語義,受常見詞影響大 | 無順序/語義 | 維度爆炸,僅局部順序 | ||
關系 | BOW 的基礎 | 可視為 Unigram (1-gram) 頻率 | 常作用于 Unigram 或 N-Gram | 可結合 BOW/TF-IDF?使用 |
代碼示例
1. One-Hot 編碼
代碼示例
Python
from sklearn.preprocessing import OneHotEncoder # 示例數據:3 個樣本,每個樣本是一個類別 data = [["cat"], ["dog"], ["cat"]] # 初始化 One-Hot 編碼器 encoder = OneHotEncoder() encoded = encoder.fit_transform(data) # 輸出結果 print("One-Hot 編碼結果:\n", encoded.toarray()) print("類別映射:", encoder.categories_)
輸出:
One-Hot 編碼結果: [[1. 0.] [0. 1.] [1. 0.]] 類別映射: [array(['cat', 'dog'], dtype=object)]
2. BOW(Bag of Words,詞袋模型)
代碼示例
Pytho
from sklearn.feature_extraction.text import CountVectorizer # 示例文本 corpus = [ "the cat sat on the mat", "the dog sat on the log", "the cat and the dog sat" ] # 初始化詞袋模型 vectorizer = CountVectorizer() X = vectorizer.fit_transform(corpus) # 輸出結果 print("詞匯表:", vectorizer.get_feature_names_out()) print("BOW 向量:\n", X.toarray())
輸出:
詞匯表: [and' 'cat' 'dog' 'log' 'mat' 'on' 'sat' 'the'] BOW 向量: [[0 1 0 0 1 1 1 2] [0 0 1 1 0 1 1 2] [1 1 1 0 0 1 1 3]]
3. TF-IDF(Term Frequency-Inverse Document Frequency)
代碼示例
Python
from sklearn.feature_extraction.text import TfidfVectorizer # 使用相同的文本數據 vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(corpus) # 輸出結果 print("詞匯表:", vectorizer.get_feature_names_out()) print("TF-IDF 向量:\n", X.toarray())
輸出:
詞匯表: ['and' 'cat' 'dog' 'log' 'mat' 'on' 'sat' 'the'] TF-IDF 向量: [[0. 0.57735027 0. 0. 0.57735027 0.57735027 0.57735027 0. ] [0. 0. 0.57735027 0.57735027 0. 0.57735027 0.57735027 0. ] [0.68346878 0.34173439 0.34173439 0. 0. 0.34173439 0.34173439 0. ]]
4. N-Gram 模型
Python
from sklearn.feature_extraction.text import CountVectorizer # 使用 Bigram(ngram_range=(2,2)) vectorizer = CountVectorizer(ngram_range=(2, 2)) X = vectorizer.fit_transform(corpus) # 輸出結果 print("Bigram 詞匯表:", vectorizer.get_feature_names_out()) print("Bigram 向量:\n", X.toarray())
輸出:
Bigram 詞匯表: ['cat sat' 'dog sat' 'log the' 'mat the' 'on the' 'sat on' 'the cat' 'the dog' 'the log' 'the mat' 'the sat'] Bigram 向量: [[0 0 0 1 1 1 1 0 0 1 0] [0 0 1 0 1 1 0 1 1 0 0] [0 1 0 0 1 1 1 1 0 0 1]]
總結與關系
-
One-Hot 是最基礎的原子表示。
-
BOW 是 One-Hot 在文檔級別的頻率擴展。?BOW 本質上就是基于 Unigram (1-gram)。
-
TF-IDF 是 BOW 的重要加權改進版。?它在詞頻(TF)基礎上引入了逆文檔頻率(IDF)來抑制常見詞、提升關鍵詞語義權重。TF-IDF 通常作用于 Unigram,但也可以作用于 N-Gram。
-
N-Gram 改變了基本單元。?它不是基于單個詞,而是基于連續的詞序列(詞組/片段)。這使其能夠捕捉局部詞序信息。N-Gram 模型本身只定義了單元,通常需要結合 BOW 或 TF-IDF 來形成文檔的向量表示(即 N-Gram BOW 或 N-Gram TF-IDF)。
-
它們都缺乏深層次語義理解。?這些方法都無法真正理解單詞的含義(語義)或復雜的上下文關系。捕捉語義需要更高級的技術,如詞嵌入(Word2Vec, GloVe)和上下文相關的語言模型(BERT, GPT)。
選擇哪種方法取決于具體任務的需求、計算資源以及對詞序和語義的要求。TF-IDF 和 N-Gram (通常是 Bigram/TF-IDF) 在傳統機器學習方法中應用非常廣泛且有效。而深度學習方法(如基于Transformer的模型)則能更好地捕捉語義和長距離依賴。