- 簽證留學 |
- 筆譯 |
- 口譯
- 求職 |
- 日/韓語 |
- 德語
要從文本中獲取特征,需要先拆分文本。具體如何做呢?這里的特征是來自文本的詞條(token),一個詞條是字符的任意組合。可以把詞條想象為單詞,也可以使用非單詞詞條,如URL、IP地址或者任意其他字符串。然后將每一個文本片段表示為一個詞條向量,其中值為1表示詞條出現(xiàn)在文檔中,0表示詞條未出現(xiàn)。
以在線社區(qū)的留言板為例。為了不影響社區(qū)的發(fā)展,我們要屏蔽侮辱性的言論,所以要構(gòu)建一個快速過濾器,如果某條留言使用了負面或者侮辱性的語言,那么就將該留言標識為內(nèi)容不當。過濾這類內(nèi)容是一個很常見的需求。對此問題建立兩個類別:侮辱類和非侮辱類,使用1和0分別表示。
接下來首先給出將文本轉(zhuǎn)換為數(shù)字向量的過程,然后介紹如何基于這些向量來計算條件概率,并在此基礎(chǔ)上構(gòu)建分類器,最后還要介紹一些利用Python實現(xiàn)樸素貝葉斯過程中需要考慮的問題。
1. 準備數(shù)據(jù):從文本中構(gòu)建詞向量
我們將把文本看成單詞向量或者詞條向量,也就是說將句子轉(zhuǎn)換為向量??紤]出現(xiàn)在所有文檔中的所有單詞,再決定將哪些詞納入詞匯表或者說所要的詞匯集合,然后必須要將每一篇文檔轉(zhuǎn)換為詞匯表上的向量。接下來我們正式開始。打開文本編輯器,創(chuàng)建一個叫bayes.py的新文件,然后將下面的程序清單添加到文件中。
程序清單1-1 詞表到向量的轉(zhuǎn)換函數(shù)
第一個函數(shù)loadDataSet()創(chuàng)建了一些實驗樣本。該函數(shù)返回的第一個變量是進行詞條切分后的文檔集合,這些文檔來自斑點犬愛好者留言板。這些留言文本被切分成一系列的詞條集合,標點符號從文本中去掉,后面會探討文本處理的細節(jié)。loadDataset()函數(shù)返回的第二個變量是一個類別標簽的集合。這里有兩類,侮辱性和非侮辱性。這些文本的類別由人工標注,這些標注信息用于訓練程序以便自動檢測侮辱性留言。
下一個函數(shù)createvocabList()會創(chuàng)建一個包含在所有文檔中出現(xiàn)的不重復(fù)詞的列表,為此使用了Python的set數(shù)據(jù)類型。將詞條列表輸給set構(gòu)造函數(shù),set就會返回一個不重復(fù)詞表。首先,創(chuàng)建一個空集合①,然后將每篇文檔返回的新詞集合添加到該集合中②。操作符|用于求兩個集合的并集,這也是一個按位或(OR)操作符。在數(shù)學符號表示上,按位或操作與集合求并操作使用相同記號。
獲得詞匯表后,便可以使用函數(shù)setofwords2vec(),該函數(shù)的輸人參數(shù)為詞匯表及某個文檔,輸出的是文檔向量,向量的每一元素為1或0,分別表示詞匯表中的單詞在輸入文檔中是否出現(xiàn)。函數(shù)首先創(chuàng)建一個和詞匯表等長的向量,并將其元素都設(shè)置為0③。接著,遍歷文檔中的所有單詞,如果出現(xiàn)了詞匯表中的單詞,則將輸出的文檔向量中的對應(yīng)值設(shè)為1。一切都順利的話,就不需要檢查某個詞是否還在vooabList中,后邊可能會用到這一操作。
現(xiàn)在看一下這些函數(shù)的執(zhí)行效果,保存bayes.py文件,然后在Python提示符下輸入:
檢查上述詞表,就會發(fā)現(xiàn)這里不會出現(xiàn)重復(fù)的單詞。目前該詞表還沒有排序,需要的話,稍后可以對其排序。
下面看一下函數(shù)setofwords2vec()的運行效果:
該函數(shù)使用詞匯表或者想要檢查的所有單詞作為輸人,然后為其中每一個單詞構(gòu)建一個特征。一旦給定一篇文檔(斑點犬網(wǎng)站上的一條留言),該文檔就會被轉(zhuǎn)換為詞向量。接下來檢查一下函數(shù)的有效性。myVocabList中索引為2的元素是什么單詞?應(yīng)該是單詞help。該單詞在第一篇文檔中出現(xiàn),現(xiàn)在檢查一下看看它是否出現(xiàn)在第四篇文檔中。
2. 訓練算法:從詞向量計算概率
前面介紹了如何將一組單詞轉(zhuǎn)換為一組數(shù)字,接下來看看如何使用這些數(shù)字計算概率?,F(xiàn)在已經(jīng)知道一個詞是否出現(xiàn)在一篇文檔中,也知道該文檔所屬的類別。我們重寫貝葉斯準則,將之前的x、y替換為w。粗體w表示這是一個向量,即它由多個數(shù)值組成。在這個例子中,數(shù)值個數(shù)與詞匯表中的詞個數(shù)相同。