用 Python 做文本挖掘的流程

  • 收集數據

    • 數據集。如果是已經被人做成數據集了,這就省去了很多麻煩事
    • 抓取。這個是 Python 做得最好的事情,優秀的包有很多,比如 scrapy,beautifulsoup 等等。
  • 預處理(對這裡的高質量討論結果的修改,下面的順序僅限英文
  1. 去掉抓來的數據中不需要的部分,比如 HTML TAG,只保留文本。結合 beautifulsoup 和正則表達式就可以了。pattern.web 也有相關功能。
  2. 處理編碼問題。沒錯,即使是英文也需要處理編碼問題!由於 Python2 的歷史原因,不得不在編程的時候自己處理。英文也存在 unicode 和 utf-8 轉換的問題,中文以及其他語言就更不用提了。這裡有一個討論,可以參考,當然網上也有很多方案,找到一個適用於自己的最好。
  3. 將文檔分割成句子。
  4. 將句子分割成詞。專業的叫法是 tokenize。
  5. 拼寫錯誤糾正。pyenchant 可以幫你!(中文就沒有這麼些破事!)
  6. POS Tagging。nltk 是不二選擇,還可以使用 pattern。
  7. 去掉標點符號。使用正則表達式就可以。
  8. 去掉長度過小的單詞。len<3 的是通常選擇。
  9. 去掉 non-alpha 詞。同樣,可以用正則表達式完成 W 就可以。
  10. 轉換成小寫。
  11. 去掉停用詞。Matthew L. Jockers 提供了一份比機器學習和自然語言處理中常用的停詞表更長的停詞表。中文的停詞表 可以參考這個。
  12. lemmatization/stemming。nltk 裡面提供了好多種方式,推薦用 wordnet 的方式,這樣不會出現把詞過分精簡,導致詞丟掉原型的結果,如果實在不行,也用 snowball 吧,別用 porter,porter 的結果我個人太難接受了,弄出結果之後都根本不知道是啥詞了。MBSP 也有相關功能。
  13. 重新去掉長度過小的詞。是的,再來一遍。
  14. 重新去停詞。上面這兩部完全是為了更乾淨。
  15. 到這裡拿到的基本上是非常乾淨的文本了。如果還有進一步需求,還可以根據 POS 的結果繼續選擇某一種或者幾種詞性的詞。

  • Bag-of-Words! nltk 和 scikit.learn 裡面都有很完整的方案,自己選擇合適的就好。這裡如果不喜歡沒有次序的 unigram 模型,可以自行選擇 bi-gram 和 tri-gram 以及更高的 n-gram 模型。nltk 和 sklearn裡面都有相關的處理方法。
  • 更高級的特徵。
    • TF-IDF。這個 nltk 和 sklearn 裡面也都有。
    • Hashing!
  • 訓練模型
    • 到這裡,就根據自己的應用選擇合適的學習器就好了。
    • 分類,情感分析等。sklearn 裡面很多方法,pattern 里有情感分析的模塊,nltk 中也有一些分類器。
    • 主題發現
      • NMF
      • (Online) Latent Dirichlet Allocation
      • word2vec
    • 自動文摘。這個自己寫吧,沒發現什麼成型的工具。
  • Draw results
    • Matplotlib
    • Tag cloud
    • Graph

----------更新分割線 2013.12.06 --------------

說明:在預處理部分僅僅針對英文的情況,由於中英文在分詞上是不同的機制,所以在處理中文的時候需要根據情況進行,個人經驗是在去停詞之前分詞。這部分有待完善。

  • 中文分詞。jieba 或者 Stanford (Chinese) Word Segmenter。jieba 是純 Python 寫的,Stanford 的可以通過 nltk 調用,復旦 NLP 也可以用 Python 調用。

推薦閱讀:

透過數據看 Github
python的應該一個class放一個文件嗎?
namedstruct: 二進位結構體的正則表達式
用 Python 實現一個大數據搜索引擎

TAG:Python | 文本挖掘 |