詞袋模型是一種表征文本數據的方法,可以從文本數據中提取出特征並用向量表示.詞袋模型主要包括兩件事
- 構建詞匯表
- 確定度量單詞出現的方法
詞袋模型不考慮單詞在文本中出現的順序,只考慮單詞是否出現.
具體以"雙城記"開頭為例
- 收集數據
It was the best of times,
it was the worst of times,
it was the age of wisdom,
it was the age of foolishness,
- 構建詞匯表
對於上面四個句子,我們要用詞袋模型把它轉化為向量表示,這四個句子形成的詞表(不去停用詞)為:
“it”
“was”
“the”
“best”
“of”
“times”
“worst”
“age”
“wisdom”
“foolishness”
- 創建向量
這一步的目的是把文本數據轉化成向量表示. 我們構建的字典中一共有10個單詞,因此我們可以用一個固定長度為10的向量表示一句話,向量的每一個位置表達了文本中出現的某一個詞, 向量每個位置的值有多種選擇.最簡單的是使用binary特征, 即如果該詞在句子中出現了設為1,不出現就為0.這也就是one-hot編碼.以第一句為例,該句的bianry向量為
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
剩下三句的編碼為
"it was the worst of times" = [1, 1, 1, 0, 1, 1, 1, 0, 0, 0]
"it was the age of wisdom" = [1, 1, 1, 0, 1, 0, 0, 1, 1, 0]
"it was the age of foolishness" = [1, 1, 1, 0, 1, 0, 0, 1, 0, 1]
管理詞典
假設我們有非常大的語料庫,比如說幾千本書,那么此時的構建的向量長度可能長達數萬,而且對於每本書而言可能只包含詞典中很少的詞,這樣對每本書構建的向量中就會含有大量的0.這樣的向量成為稀疏向量或者說稀疏表示.因此我們要考慮如何減小詞典的大小. 最簡單的我們可以做一些文本清洗
- 全部轉換為小寫或者全部轉為大寫
- 去掉停用詞
- 修改拼寫錯誤的詞
- 對於英文單詞還可以做詞干提取
更高級的方法是構建包含詞組的詞典,這既能減少詞典的大小也能讓詞袋模型從文本中學習到一些東西.在該方法中每個單詞或者說字符成為gram, 創建一個包含兩個單詞對的詞典稱為bigram,注意只有出現在語料庫中的bigram才能添加到詞典里
一個N-gram是一個N字符的單詞序列:一個2-gram(通常稱為bigram)是一個兩個單詞的單詞序列,例如“ please turn”,“ turn your”或“ our your work”, 3-gram(通常稱為trigram)是由三個詞組成的單詞序列,例如““please turn your”, 或者 “turn your homework”.
例如我們給的例子中第一句的bigram就是
“it was”
“was the”
“the best”
“best of”
“of times”
由三個單詞序列構成的詞典稱為3-gram,更一般的由n個單詞序列構成的詞典稱為n-gram
對每個單詞打分
構建完詞典后,我們需要對出現在文檔中的詞進行打分,在剛剛給出的例子中我們使用的是bianry的方法,出現為1, 不出現為0. 此外我們還可以用單詞在文檔中出現的次數或者詞頻, TF-IDF對其打分.
詞頻,即一個單詞或者詞組在一篇文檔中出現的頻率. 如果某個單詞或詞組在文章中出現次數很多,但是它包含的信息並不多,這時候只用詞頻度量單詞或詞組就會產生偏差. 一種方法就是利用該單詞或詞組在所有文檔中出現的次數來對詞頻進行縮放. 這就是TF-IDF.
TF-IDF
TF:是對詞在當前文檔中頻率, 其有多種取值形式,最簡單的是直接使用單詞出現的次數,也可以使用
- 布爾頻率,單詞出現為1,否則為0
- 進行"詞頻"標准化, 單詞出現的數目/文檔的長度
- 對數縮放, log(1+單詞出現的次數)
- 增強頻率,以防止偏向較長的文檔,例如 單詞出現的次數除以文檔中最常出現的單詞的次數:
f_(t,d)是單詞出現的次數
IDF:是逆文檔頻率,是一個詞語普遍重要性的度量,它的大小與一個詞的常見程度成反比
N是語料庫中所有文檔的數目.分母部分是包含單詞t的文檔的數目. 一個單詞越頻繁的出現在不同文檔中,逆文檔頻率就越低
最后
字詞的重要性隨着它在文件中出現的次數成正比增加 ,但同時會 隨着它在語料庫中出現的頻率成反比下降 。如果某個詞比較少見,但是它在這篇文章中多次出現,那么它很可能就反映了這篇文章的特性,正是我們所需要的關鍵詞。
詞袋模型的局限
- 詞典: 在設計詞典的時候要重點關注詞典的大小, 過大的詞典會導致文本表示稀疏化
- 稀疏化: 出於計算原因(空間和時間復雜度)以及信息原因,很難對稀疏表示進行建模. 難點主要在於在非常大的表示空間中模型能利用的信息非常少
- 含義:丟棄單詞順序會忽略上下文,從而忽略文檔中單詞的含義(語義)。 上下文和語義可以為模型提供很多幫助,例如可以幫助模型區分由相同單詞構成的不同序列間的差異(“this is interesting” 和 “is this interesting”),同義詞(“舊自行車”與“二手自行車”),等等。