文本挖掘預處理的流程總結

近期半年一直忙於項目,博客也很是少更新咯。css

有幾個項目作了很多JS相關的工做,基本都可以利用現成的開源方案。諸如angularJs、requireJs、bootstrap、knockoutJs、TypeScript、Jquery等等;以後也有項目是無UI的,純後端的內容,主要就是考慮並行、性能、模塊化等;以後的很是長一段時間便主要在處理文本挖掘相關的項目(英文項目)。今天正好有空也準備對文本挖掘預處理的流程作一些總結,但願是乾貨:html

  • 收集數據
總所周知,數據挖掘模型中很是重要的部分是訓練模型,訓練集與測試集即是整個數據挖掘過程當中花費時間最多的過程。

數據集經過有例如如下的一些途徑得到:html5

  1. 經典數據集:Python NLTK 便提供了很是多經典的數據集。很是多數據集都是手工標註而成,因此使用的時候不得不感嘆project的浩大。好比NLP中使用的Penn TreeBank。有興趣的同窗可以看看他們的論文《Building a Large Annotated Corpus of English: The Penn TreeBank》。那簡直就是一部辛酸史啊!
  2. 從網頁上抓取:直接動手寫一個爬蟲爬取特定的網頁不難。經過正則表達式就可以將有效的內容提取出來。固然,發揚拿來主義精神的話。咱們可以使用Python中一些優秀的庫。比方scrapybeautifulsoup 等等。
  3. 從日誌、已有文件裏分析:假設是海量數據的話可以使用hadoop這種系統。

    結合傳統SQL中的一些特殊功能,好比Partition,有時會有不錯的效果。只是最多壓縮空間、縮減特徵再用SQL處理。python

  4. 其它網絡數據集:Stanford Large Network Dataset Collectionm100+ Interesting Data Sets for Statistics

  • 預處理
  1. 假設是網頁內容,首先需要去掉Html Tag。lxmlhtml5lib是比較有名的Python庫,beautifulsoup也對他們作了一層封裝。只是別忘了。Python自己也自帶了sgmllib這種基本可擴展的解析器。假設是有特別的處理。事實上正則表達式也是不錯的選擇。

  2. 處理編碼,因爲我主要是處理英文的數據,這一步基本也跳過了。

  3. 將文檔切割成句子(可選)。

    很是多時候咱們採用的是詞袋模型(bag of words),因此是否切割成句子也無所謂。比較簡單的方法就是Python NLTK中的sent_tokenize()函數,用的是punkt算法,論文在這裏web

  4. 將句子切割成詞。首先用正則表達式可以本身完畢;假設要利用已有工具。Python NLTK中的word_tokenize(),這個方式就是前文提到的Penn TreeBank語料庫所使用的分詞方法。聽起來是否是很是高大上。我是不會告訴你事實上它也是正則表達式實現的。想知道詳細實現。戳這裏。分詞事實上主要乾了這麼幾個事:1)將’分開. don't -> do n't, they'll -> they 'll; 2)將大部分標點看成單獨的一個詞; 3)將後一位是逗號或者引號的詞分開; 4)單獨出現在一行的句號分開。中文分詞差異比較大,可以採用斯坦福或者ICTCLAS(中科院背景)的方案。
  5. 拼寫錯誤糾正。推薦pyenchant。很是喜歡,因爲簡潔到四句語句就能完畢。

    Windows 8中操做系統也直接提供了拼寫檢查的COM端口,只是就得多花時間研究啦。算法

  6. POS Tagging(依據實際應用)。仍是Nltk。首頁就有介紹;斯坦福也提供了這類工具。

    這一塊屬於NLP的範疇,仍是Parsing等應用,要了解NLP原理推薦Coursera上一門不錯的課程Natural Language Processingbootstrap

  7. 去掉標點。正則表達式就能夠。有的時間很是短的單詞也可以一塊兒去掉。len<3的常見的選擇
  8. 去掉非英文字符的詞(依據實際應用決定)。
  9. 轉換成小寫。
  10. 去掉停用詞。就是在各類句子中都常常出現的一些詞,I、and什麼的。

    NLTK有一個StopwordsMatthew L. Jockers提供了一份比機器學習和天然語言處理中常用的停詞表更長的停詞表。中文停用詞戳這裏。什麼?你問我停用詞怎麼找到的。我想大概是IDF這種算法吧。後端

  11. 詞型轉換。

    簡單來說,咱們但願do、did、done都能統一的返回do。第一種方法叫stem,Porter是比較常見的一種基於規則的算法。網頁有snowball工具。也是它的論文。Porter的結果差強人意,單詞末尾有e、y的。基本上stem以後都不間了,好比replace->replac。末尾有反覆單詞的。基本僅僅剩一個了,好比ill->il。api

    NLTK中也有Stem庫。算法應該是類似的。網絡

    另一種方法叫lemmatization,就是基於詞典作詞型轉換,NLTK的Stem庫中便有WordNetLemmatizer可以使用。

  12. 去掉長度太小的詞(可選)。假設以前作了。這裏要再作一次。因爲stem會改變詞型。
  13. 又一次去停用詞。理由同上。


  • 訓練
這個主題太大。不是這篇日誌的重點。

簡單來說。Python的NLTKscikit.learn是很是優秀的工具,另外,R也是不錯的一門語言。

可視化的工具可以採用Weka、KNIME、Tanagra、RapidMiner 、Orange、GGobi等。這方面最好的課程當屬Andrew Ng的Machine Learning。那個識別貓臉的Google Brain(Deep Learning)即是他的功績。


寫了很多內容,時間也不早了,睡了。
相關文章
相關標籤/搜索