自然語言處理

詞袋模型(bag-of-words)

/ BAG-uv-WURDZ /

詞袋模型是把一篇文件變成數字的最簡單辦法:把它所有的詞都倒進一個袋子,搖一搖,只數每個詞出現了多少次——把順序整個扔掉。「狗咬了人」和「人咬了狗」會變成一模一樣的袋子:{的: 2, 狗: 1, 咬: 1, 人: 1}。在模型眼裡這兩句話毫無分別,這既是該方法莫大的便利,也是它刺眼的盲點。

具體來說,你先定下一份詞表——模型認識的所有詞——再把每篇文件表示成一長串計數,詞表裡每個詞佔一格,絕大多數格子是零。這串數字就是機器能拿來運算的向量:比較文件、餵給分類器、做匹配檢索。儘管無視了語法、詞序和含義,詞袋模型在那些「詞是否出現本身就含資訊」的任務上卻出奇地有效,比如把郵件分進垃圾箱,或給新聞文章打主題標籤。

它值得一學,因為它是文本處理誠實的基準線——你最先嘗試的東西,也是更花俏的方法必須超越的標尺。它的弱點同樣發人深省:它分不清「不好」和「好」,把「快樂」和「歡欣」當成毫不相干的陌生人,而且向量會膨脹成巨大、幾乎全空的尺寸。像 TF-IDF 這樣的加權方案能緩解第一個問題;嵌入則對付第二個。

詞表 [I, love, hate, cats, dogs]。「I love cats」→ [1,1,0,1,0]。「I hate cats I hate dogs」→ [2,0,2,1,1]。兩篇文件,如今不過是兩串計數,分類器可以拿去消化。

每篇文件化作一個詞頻向量——詞序和語法都被丟棄。

記住它致命的盲點:詞袋模型丟掉了詞序,所以「不好」和「好」在它看來幾乎一樣。它是一個強勁又廉價的基準——而非一個理解語義的模型。

又稱
BoW词袋词频向量