1. 程式人生 > >文字挖掘預處理的流程總結(轉)

文字挖掘預處理的流程總結(轉)

最近半年一直忙於專案,部落格也很少更新咯。有幾個專案做了不少JS相關的工作,基本都可以利用現成的開源方案,諸如angularJs、requireJs、bootstrap、knockoutJs、TypeScript、Jquery等等;之後也有專案是無UI的,純後端的內容,主要就是考慮並行、效能、模組化等;之後的很長一段時間便主要在處理文字挖掘相關的專案(英文專案)。今天正好有空也準備對文字挖掘預處理的流程做一些總結,希望是乾貨:

  1. 收集資料
      總所周知,資料探勘模型中非常重要的部分是訓練模型,訓練集與測試集便是整個資料探勘過程中花費時間最多的過程。資料集通過有如下的一些途徑獲得:
      經典資料集
    Python NLTK 便提供了非常多經典的資料集。很多資料集都是手工標註而成,所以使用的時候不得不感嘆工程的浩大。例如NLP中使用的Penn TreeBank,有興趣的同學可以看看他們的論文《Building a Large Annotated Corpus of English: The Penn TreeBank》,那簡直就是一部辛酸史啊!
      從網頁上抓取:直接動手寫一個爬蟲爬取特定的網頁不難,通過正則表示式就能夠將有效的內容提取出來;當然,發揚拿來主義精神的話,我們可以使用Python中一些優秀的庫,比如scrapybeautifulsoup 等等。
      從日誌、已有檔案中分析
    :如果是海量資料的話可以使用hadoop這樣的系統。結合傳統SQL中的一些特殊功能,例如Partition,有時會有不錯的效果,不過最多壓縮空間、縮減特徵再用SQL處理。
      其他網路資料集Stanford Large Network Dataset Collectionm100+ Interesting Data Sets for Statistics
  2. 列表內容
      1) 如果是網頁內容,首先需要去掉HTML Tag,lxmlhtml5lib是比較有名的Python庫,beautifulsoup也對他們做了一層封裝。不過別忘了,Python本身也自帶了sgmllib這樣的基本可擴充套件的解析器。如果是有特別的處理,其實正則表示式也是不錯的選擇。
      2) 處理編碼,由於我主要是處理英文的資料,這一步基本也跳過了。
      3) 將文件分割成句子(可選)。很多時候我們採用的是詞袋模型(bag of words),所以是否分割成句子也無所謂。比較簡單的方法就是Python NLTK中的sent_tokenize()函式,用的是punkt演算法,
    論文
    在這裡。
      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 Processing
      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。NLTK中也有Stem庫,演算法應該是類似的。第二種方法叫lemmatization,就是基於詞典做詞型轉換,NLTK的Stem庫中便有WordNetLemmatizer可以使用。
      12) 去掉長度過小的詞(可選)。如果之前做了,這裡要再做一次,因為stem會改變詞型。
      13) 重新去停用詞。理由同上。
  3. 訓練
      這個主題太大,不是這篇日誌的重點。簡單來講,Python的NLTKscikit.learn是非常優秀的工具,另外,R也是不錯的一門語言。視覺化的工具可以採用Weka、KNIME、Tanagra、RapidMiner 、Orange、GGobi等。這方面最好的課程當屬Andrew Ng的Machine Learning,那個識別貓臉的Google Brain(Deep Learning)便是他的功績。

寫了不少內容,時間也不早了,睡了。