Bag-of-Words
What?
Bag-of-Words(簡稱 BoW)是一種用來表示文字資料的技術方法,它將每篇文件中的詞彙轉換成數字化向量,以便進行機器學習和自然語言處理(Natural Language Processing, NLP)相關任務。
簡單來說,BoW 並不關心詞彙的順序,而是專注於詞彙出現的頻率或是否存在。例如,如果我們有兩篇文章,BoW 會像是在統計每篇文章中某些重要詞彙的「出現次數」,然後用這些次數來代表整篇文章。
實務情境上,假設你需要訓練一個分類模型辨識垃圾郵件與正常郵件,BoW 可以幫助你把每封郵件轉換成數字化格式,例如「這封信提到 'offer' 和 'free' 各 3 次,但沒提到 'meeting'」。如此一來,就可以進一步用機器學習演算法分析。
Who?
Bag-of-Words 最常被以下族群使用:
- 資料科學家(Data Scientists):在處理 NLP 任務時,例如文字分類或情感分析。
- 機器學習工程師(Machine Learning Engineers):開發基於文本的模型。
- 研究人員(Researchers):探索文本分析技術。
- 產品經理與資料分析師(Product Managers & Data Analysts):需要快速將文字轉換為結構化資料以便進行商業洞察。
受影響的對象通常包括那些依賴文字資料進行決策或自動化流程的人,例如電子商務平台透過 BoW 辨識商品評論中的情緒傾向。
When?
你會在以下場景中使用 BoW:
- 訓練機器學習模型前期:例如文字分類、垃圾郵件檢測、情感分析。
- 建立搜尋引擎索引時:例如計算文件中的關鍵詞頻率以提供匹配結果。
- 快速建模與原型開發階段:當需要一種簡單且高效的方法來處理文本資料。
- 無需考慮上下文語意時:例如僅關注某些特定關鍵字出現頻率,而不考慮句子結構。
Where?
BoW 通常出現在以下架構部分:
-
前處理階段(Preprocessing):
- 在 NLP 管道中,用 BoW 將原始文本轉換成可供模型理解的數字格式。
-
Feature Engineering階段(Feature Engineering):
- 作為輸入特徵之一,用於後續訓練模型或進行統計分析。
-
搜尋系統架構內部:
- 搜尋引擎或推薦系統可能基於 BoW 計算相似度以匹配文件和查詢內容。
Why?
使用 BoW 的主要目的是解決「如何讓電腦理解非結構化文字」這個問題。它提供了一種簡單且直觀的方法,將文本文檔轉換為可供機器學習算法直接處理的數字格式。同時,它具有以下優勢:
-
易於實作且效率高
- 比起更複雜的方法如 Word Embeddings 或 Transformer 模型,BoW 更簡單直觀,非常適合初期探索性分析。
-
允許高效地比較文本之間的相似度
- 不管是搜尋引擎還是分類任務,都可以利用 BoW 快速評估兩個文本是否具有相近內容。
-
解決一些通用 NLP 問題,例如:
- 文件分類
- 關鍵詞提取
- 情感偏向分析
How?
🛠️ 建立階段
建立 Bag-of-Words 的步驟如下:
-
文本收集與清洗
- 將文檔收集起來,並執行基本清洗工作(去除標點符號、大小寫歸一化等)。
-
分詞
- 將每篇文檔切分成獨立的詞彙。舉例:「I love cats」 -> ["I", "love", "cats"]。
-
詞彙表建立
- 把所有文檔中的獨立詞彙找出並整理成一份完整列表。例如:
詞彙表 = ["I", "love", "cats", "dogs"]
- 把所有文檔中的獨立詞彙找出並整理成一份完整列表。例如:
-
編碼
- 根據每篇文檔中各個詞彙出現次數進行編碼。舉例:
文檔 A: "I love cats"編碼向量: [1, 1, 1, 0] (分別代表 I 出現一次、love 出現一次、cats 出現一次、dogs 未出現)
- 根據每篇文檔中各個詞彙出現次數進行編碼。舉例:
-
(可選)正規化
- 為了避免某些長文檔因字數較多而導致某些值過大,可以對結果進行正規化,例如使用 $\text{TF-IDF}$ 方法。
🔍 查詢階段
查詢 Bag-of-Words 時,你可以按以下方式操作:
-
提交查詢句子並執行分詞。
-
根據已建立好的詞彙表,把查詢句子的內容編碼為向量。例如:
查詢 = "I love dogs"編碼向量: [1, 1, 0, 1] -
計算相似度
- 使用方法如 $\text{Cosine Similarity}$ 或 $\text{Euclidean Distance}$ 比較查詢編碼向量與其他文件編碼向量之間的距離,以找到最匹配的結果。
補充說明
🔧 關鍵技術工具
| 工具名稱 | 功能 | 適合場景 |
|---|---|---|
| sklearn | 提供 CountVectorizer 與 TfidfVectorizer | 一般 NLP 項目 |
| NLTK | 提供分詞及文字清洗工具 | 輕量級自然語言處理 |
| spaCy | 高效能 NLP 工具包 | 大型專案及性能要求較高時 |
📌 範例比較
下表展示不同表示方法下,同一句話「I love cats」所產生的輸入特徵差異:
| 表示方法 | 輸入特徵 |
|---|---|
| Bag-of-Words | [1, 1, 1] |
| TF-IDF | [0.5, 0.8, 0] |
| Word Embeddings | [-0.12, 0.... (多維向量)] |
🧠 延伸/常見誤解
誤解一:Bag-of-Words 考慮了語意
澄清:BoW 不考慮語意,只關心單純的「次數」或者是否存在。因此,比起 Word Embedding 或 Transformer,它無法捕捉上下文含義。例如,「我愛貓」和「貓愛我」在 BoW 中是一樣的表示,但它們在實際語意上有所不同。
誤解二:Bag-of-Words 是唯一選擇
澄清:BoW 是最基礎的方法之一,但隨著深度學習和嵌入技術興起,如 Word2Vec 和 BERT,更能捕捉語意上下文的信息,因此應根據具體需求選擇表示方式。