Bag-of-Words
1.文字問題
2. 什麼是Bag-of-Words(具體例子)
3. 侷限性
1.文字問題
文本建模的一個問題是它很雜亂,機器學習算法之類的技術更喜歡定義明確的固定長度輸入和輸出。
機器學習算法無法直接處理原始文本;文本必須轉換爲數字。具體來說,是數字向量。
在語言處理中,矢量x是從文本數據中導出的,以便反映文本的各種語言特性。
這稱爲特徵提取或特徵編碼。
一種流行且簡單的使用文本數據進行特徵提取的方法稱爲 Bag-of-Words.
2. 什麼是Bag-of-Words
詞袋模型或簡稱BoW是一種從文本中提取特徵以用於建模的方法,例如用於機器學習算法。
該方法非常簡單和靈活,可以用於從文檔提取特徵的多種方式。
詞袋是描述文檔中單詞出現的文本表示。它涉及兩件事:
- 已知單詞的詞彙表。
- 已知單詞存在的一種度量。
它被稱爲單詞的“ 袋 ”,因爲有關文檔中單詞順序或結構的任何信息都將被丟棄。該模型僅關注已知單詞是否出現在文檔中,而不關注文檔中的何處。
句子和文檔的一種非常常見的特徵提取過程是詞袋法(BOW)。在這種方法中,我們查看文本中單詞的直方圖,即將每個單詞計數視爲一個特徵。
此外,僅從內容上我們就可以瞭解有關文檔含義的信息。
詞袋可以根據需要簡單或複雜。複雜性在於決定如何設計已知單詞(或標記)的詞彙表以及如何對已知單詞的存在進行度量。
我們將仔細研究這兩個問題。
詞袋模型的示例
讓我們用一個實際的例子來具體說明單詞模型。
步驟1:收集資料
下面是查爾斯·狄更斯(Charles Dickens)的《兩個城市的故事》一書的前幾行摘錄,摘自古騰堡計劃
It was the best of times,
it was the worst of times,
it was the age of wisdom,
it was the age of foolishness,
對於這個小例子,讓我們將每行視爲一個單獨的“文檔”,並將這4行視爲整個文檔集。
步驟2:設計詞彙
現在,我們可以列出模型詞彙表中所有單詞的列表。
這裏的獨特詞(忽略大小寫和標點符號)是:
- “it”
- “was”
- “the”
- “best”
- “of”
- “times”
- “worst”
- “age”
- “wisdom”
- “foolishness”
這是一個包含24個單詞的語料庫中的10個單詞的詞彙表。
步驟3:建立文件向量
下一步是對每個文檔中的單詞打分。目的是將自由文本的每個文檔轉換爲向量,我們可以將其用作機器學習模型的輸入或輸出。
因爲我們知道詞彙表有10個單詞,所以我們可以使用10的固定長度文檔表示形式,在向量中的每一個位置爲每個單詞評分。
最簡單的評分方法是將單詞的存在標記爲布爾值,0表示不存在,1表示存在。
使用我們詞彙表中上面列出的單詞的任意順序,我們可以遍歷第一個文檔(It was the best of times,)並將其轉換爲二進制向量。
- “it” = 1
- “was” = 1
- “the” = 1
- “best” = 1
- “of” = 1
- “times” = 1
- “worst” = 0
- “age” = 0
- “wisdom” = 0
- “foolishness” = 0
二進制的表示如下:
1 |
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0] |
另外幾個的表示如下:
1 2 3 |
"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] |
單詞的所有排序都名義上被丟棄,我們有一致的方式從語料庫中的任何文檔中提取特徵,以備建模時使用。
與已知單詞的詞彙重疊的新文檔,但可能包含詞彙之外的單詞,仍可以進行編碼,僅對已知單詞的出現進行評分,而忽略未知單詞。您可以看到它如何自然地擴展到大詞彙量和大文檔。
管理詞彙
隨着詞彙量的增加,文檔的向量表示也隨之增加。
在前面的示例中,文檔向量的長度等於已知單詞的數量。
您可以想象,對於一個非常大的語料庫(例如數千本書),向量的長度可能是數千個或數百萬個位置。此外,每個文檔在詞彙表中可能只包含很少的已知單詞。
這將導致矢量具有很多零分,稱爲稀疏矢量或稀疏表示。
建模時,稀疏向量需要更多的內存和計算資源,而大量的位置或維數會使建模過程對傳統算法非常具有挑戰性。
有一些簡單的文本清除技術可以用在第一步,例如
- 忽略大小寫
- 忽略標點符號
- 忽略不包含很多信息的頻繁單詞,稱爲停用詞,例如“ a”,“ of”等。
- 修復拼寫錯誤的單詞。
- 使用詞幹算法將詞減少到詞幹(例如,從“播放”中“播放”)。
一種更復雜的方法是創建分組詞的詞彙表。這既改變了詞彙的範圍,又使詞袋能夠從文檔中獲取更多含義。
在這種方法中,每個單詞或標記都稱爲“gram”。反過來,創建兩個單詞對的詞彙表又稱爲bigram模型。同樣,僅對出現在語料庫中的二元模型進行建模,而不是對所有可能的二元模型進行建模。
N-gram的簡單介紹
:一個2 gram(通常更稱爲雙字母組)是一個兩個單詞的單詞序列,例如“ please turn”,“ turn your”或“ your homework”,以及3 gram(通常更稱爲三字母)是由三個詞組成的單詞序列,例如““please turn your”, or “turn your homework”
因此對於該文本(“It was the best of times” )的分詞爲:
- “it was”
- “was the”
- “the best”
- “best of”
- “of times”
然後,詞彙表跟蹤單詞的三元組稱爲三元組模型,通用方法稱爲n元組模型,其中n表示分組單詞的數量。
通常,對於文檔分類之類的任務,簡單的bigram方法比單個單詞袋模型更好。
計分單詞
一旦選擇了詞彙表,就需要對示例文檔中單詞的出現進行評分。在實際的示例中,我們已經看到一種非常簡單的評分方法:單詞存在與否的二進制評分。
一些其他簡單的計分方法包括:
- 計數。計算每個單詞在文檔中出現的次數。
- 頻率。計算文檔中所有單詞中每個單詞出現在文檔中的頻率。
3. 詞袋的侷限性
該模型非常易於理解和實施,併爲您在特定文本數據上的自定義提供了很大的靈活性。
它已成功用於預測問題,例如語言建模和文檔分類。
但是,它存在一些缺點,例如:
- 詞彙表:詞彙表需要仔細設計,尤其是爲了管理尺寸,這會影響文檔表示的稀疏性。
- 稀疏性:由於計算原因(空間和時間複雜度)以及信息原因,稀疏表示難以建模,而挑戰在於模型在如此大的表示空間中利用很少的信息。
含義:放棄單詞順序會忽略上下文,從而忽略文檔中單詞的含義(語義)。上下文和含義可以爲模型提供很多幫助,如果建模可以說明不同排列的相同單詞(“this is interesting” vs “is this interesting”),同義詞(“old bike” vs “used bike”)之間的差異。