02.15 機器學習筆記02:文本預處理;語言模型;循環神經網絡基礎

文本預處理

1.1 讀文本、文本預處理、特徵提取和建模的基本過程

收集數據

總所周知,數據挖掘模型中非常重要的部分是訓練模型,訓練集與測試集便是整個數據挖掘過程中花費時間最多的過程。數據集通過有如下的一些途徑獲得:

經典數據集:Python NLTK 便提供了非常多經典的數據集。很多數據集都是手工標註而成,所以使用的時候不得不感嘆工程的浩大。例如NLP中使用的Penn TreeBank,有興趣的同學可以看看他們的論文《Building a Large Annotated Corpus of English: The Penn TreeBank》,那簡直就是一部辛酸史啊!

從網頁上抓取:直接動手寫一個爬蟲爬取特定的網頁不難,通過正則表達式就能夠將有效的內容提取出來;當然,發揚拿來主義精神的話,我們可以使用Python中一些優秀的庫,比如scrapy,beautifulsoup 等等。

從日誌、已有文件中分析:如果是海量數據的話可以使用hadoop這樣的系統。結合傳統SQL中的一些特殊功能,例如Partition,有時會有不錯的效果,不過最多壓縮空間、縮減特徵再用SQL處理。

其他網絡數據集:Stanford Large Network Dataset Collectionm,100+ Interesting Data Sets for Statistics

預處理

如果是網頁內容,首先需要去掉Html Tag,lxml和html5lib是比較有名的Python庫,beautifulsoup也對他們做了一層封裝。不過別忘了,Python本身也自帶了sgmllib這樣的基本可擴展的解析器。如果是有特別的處理,其實正則表達式也是不錯的選擇。

將文檔分割成句子(可選)。很多時候我們採用的是詞袋模型(bag of words),所以是否分割成句子也無所謂。比較簡單的方法就是Python NLTK中的sent_tokenize()函數,用的是punkt算法。

將句子分割成詞。首先用正則表達式可以自己完成;如果要利用已有工具,Python NLTK中的word_tokenize(),這個方式就是前文提到的Penn TreeBank語料庫所使用的分詞方法。聽起來是不是很高大上,我是不會告訴你其實它也是正則表達式實現的,想知道具體實現,戳這裡。分詞其實主要乾了這麼幾個事:1)將’分開. don't -> do n't, they'll -> they 'll; 2)將大部分標點當作單獨的一個詞; 3)將後一位是逗號或者引號的詞分開; 4)單獨出現在一行的句號分開。中文分詞區別比較大,可以採用斯坦福或者ICTCLAS(中科院背景)的方案。

拼寫錯誤糾正。推薦pyenchant,非常喜歡,因為簡潔到四句語句就能完成。Windows 8中操作系統也直接提供了拼寫檢查的COM端口,不過就得多花時間研究啦。

POS Tagging(根據實際應用)。還是Nltk,首頁就有介紹;斯坦福也提供了這類工具。這一塊屬於NLP的範疇,還是Parsing等應用,要了解NLP原理推薦Coursera上一門不錯的課程Natural Language Processing

去掉標點。正則表達式即可,有的時間非常短的單詞也可以一起去掉,len<3的常見的選擇

去掉非英文字符的詞(根據實際應用決定)。

轉換成小寫

去掉停用詞。就是在各種句子中都經常出現的一些詞,I、and什麼的。NLTK有一個Stopwords。Matthew L. Jockers提供了一份比機器學習和自然語言處理中常用的停詞表更長的停詞表。什麼?你問我停用詞怎麼找到的,我想大概是IDF這樣的算法吧。

詞型轉換。簡單來講,我們希望do、did、done都能統一的返回do。第一種方法叫stem,Porter是比較常見的一種基於規則的算法,網頁有snowball工具,也是它的論文。Porter的結果差強人意,單詞末尾有e、y的,基本上stem之後都不間了,例如replace->replac;末尾有重複單詞的,基本只剩一個了,例如ill->il。NLTK中也有Stem庫,算法應該是類似的。第二種方法叫lemmatization,就是基於詞典做詞型轉換,NLTK的Stem庫中便有WordNetLemmatizer可以使用。

去掉長度過小的詞(可選)。如果之前做了,這裡要再做一次,因為stem會改變詞型。

重新去停用詞。理由同上。


特徵提取:

1、TF-IDF:

2、詞頻方法(Word Frequency):

3、文檔頻次方法(Document Frequency):

4、互信息(Mutual Information):

5、期望交叉熵(Expected Cross Entropy):

6、二次信息熵(QEMI):

7、信息增益方法(Information Gain):

8、x2統計量方法:

9、文本證據權(The Weight of Evidence forText):

10、優勢率(Odds Ratio):

11、遺傳算法(Genetic Algorithm, GA):

12、主成分分析法(Principal Component Analysis,PCA):

13、模擬退火算法(Simulating Anneal,SA):

14、N—Gram算法


文本建模:

LDA、pLSA、LSA


機器學習筆記02:文本預處理;語言模型;循環神經網絡基礎


語言模型

2.1HMM隱馬爾可夫模型的參數估計方法

隱馬爾可夫模型的學習,根據訓練數據是包括觀測序列和對應的狀態序列還是隻有觀測序列,可以分別由監督學習與非監督學習實現。

監督學習是由已知數據進行極大似然最大化求解

非監督學習是採用EM算法,EM算法是用於含有隱向量的模型中,進行參數學習的迭代算法

參考資料:https://mumaxu.github.io/2018/12/20/%E9%9A%90%E9%A9%AC%E5%B0%94%E7%A7%91%E5%A4%AB%E6%A8%A1%E5%9E%8B/


機器學習筆記02:文本預處理;語言模型;循環神經網絡基礎


循環神經網絡基礎

以前寫過:https://mp.weixin.qq.com/s/qrozPFFqOM_I8IsEWgcl0w


筆記:

定義模型

我們使用Pytorch中的`nn.RNN`來構造循環神經網絡。在本節中,我們主要關注`nn.RNN`的以下幾個構造函數參數:

* `input_size` - The number of expected features in the input x

* `hidden_size` – The number of features in the hidden state h

* `nonlinearity` – The non-linearity to use. Can be either 'tanh' or 'relu'. Default: 'tanh'

* `batch_first` – If True, then the input and output tensors are provided as (batch_size, num_steps, input_size). Default: False


這裡的`batch_first`決定了輸入的形狀,我們使用默認的參數`False`,對應的輸入形狀是 (num_steps, batch_size, input_size)。


`forward`函數的參數為:

* `input` of shape (num_steps, batch_size, input_size): tensor containing the features of the input sequence.

* `h_0` of shape (num_layers * num_directions, batch_size, hidden_size): tensor containing the initial hidden state for each element in the batch. Defaults to zero if not provided. If the RNN is bidirectional, num_directions should be 2, else it should be 1.


`forward`函數的返回值是:

* `output` of shape (num_steps, batch_size, num_directions * hidden_size): tensor containing the output features (h_t) from the last layer of the RNN, for each t.

* `h_n` of shape (num_layers * num_directions, batch_size, hidden_size): tensor containing the hidden state for t = num_steps.


分享到:


相關文章: