2016年7月14日 星期四

python文字探勘,資料前處理流程介紹


當拿到文本資料想進行探勘時,若直接將原始資料去訓練 model或是代入套件通常都會得到雜訊非常嚴重的結果。因此,要擷取資料中真正有意義的部份,前處理是不可或缺的一個步驟。

以下的介紹是基於中文文本資料來撰寫的,簡述常用到的幾個技巧:

●讀取文本資料
在處理文件時,最好是希望能批次性的處理。因此在抓取資料時,最好就預先注意輸出的格式,以及排除錯誤的資料,這都將會使後續的步驟更加地順利省事。

程式碼實作,利用 python內建的 os.listdir,就可以列出所有包含在某資料夾內的檔案。再配合上 startswith或是 endswith來限定檔名,就可以進一步縮小列出的範圍。接著,就可以依照自己資料的格式,撰寫一個讀檔的 function,將文本資料一一的讀進程式中。

import os
rootdir = os.path.join(os.getcwd(),'your_directory')
your_files = [os.path.join(rootdir,item) for item in os.listdir(rootdir) if item.endswith('.txt')] #舉例找出檔名結尾為.txt的檔案

corpus = []

def load_text(file):
    with open(file,'r') as I:
        return I.readlines

for file in your_files:
    corpus += load_text(file)    

將雜訊轉換為單一標籤
進行機器學習時,一般會希望盡量減少分析目標外的干擾,以達到更高的準確率。例如分析中文資料時,就可以統一利用 NUM及 ENG來將資料中包含的數字以及英文給取代掉。

程式碼實作的部份,像這種關於字串特徵的處理,一般都是應用正則表示式(regular expression)的方式來解決。所謂的正則表示式,就是利用一些符號來找出文字中特定的特徵,推薦看這篇部落格文章來作瞭解以及後續的查詢。

import re
for sentence in corpus:
    sentence = re.sub(r'[A-Za-z]+', ' ENG ', sentence)
    sentence = re.sub(r'\d+', ' NUM ',  sentence)

python有內建相當強大的正則表示式模組re,可以利用re.sub (substitute)的功能來將符合特徵的文字作替換。大家可以搭配上面的連結來看看程式碼中的 \d+、[A-Za-z]+等等是什麼意思,肯定更能體會正則表示式的用途。

中文斷詞
由於中文的詞與詞之間並不像英文存在空格隔開,因此如何適當地將成串的文字斷開成詞的組合一直是中文自然語言處理(natural language processing, NLP)中重要的問題。

在斷詞處理上,python最廣為使用的套件當屬結巴斷詞 (jieba)了。僅管結巴斷詞的正確率不是最優秀的,但它方便擴充自訂辭典的設計以及簡單的操作方式讓使用者可以快速上手。

程式碼實作,我認為這篇部落格文章舉例說明的相當清楚,推薦大家參考看看,這邊就不再贅述。

去除停止詞
在斷完詞之後,若你去進行詞頻分析時一定會發現,許多無法突顯主題的冗字出現的頻率總是名列前矛,例如:的、我、你、嗎,以及標點符號等等。對於這些字,這個領域中就稱之為停止詞 (stopword),而一般在進行文字探勘時都會預先將這些字詞剔除。

網路上可以搜尋到不少人家準備好的停止詞詞庫,但大多都是簡體中文的資源。不用擔心,利用 Google網頁翻譯或是線上簡轉繁的服務大家就可以建立好繁體的停止詞詞庫了。當然,在使用過程中也可以依照自己的需要去增減它。

程式碼實作,最方便的作法是先以 with open將停止詞詞庫讀入一個 list後,再利用個 for迴圈檢查句子中的每一個詞是否包含在停止詞詞庫中。

with open('stopword.txt','r') as f:
    stopwords = f.readlines()

your_words = segmented_sentence #已經斷詞好的語料
words_filtered = ' '.join([word for word in your_words if word not in stopwords]) #將停止詞濾掉

題外話,若今天是想檢查整個文本而非一個單詞是否含有停止詞時,可以利用python中內建的 function:any(),詳細可參考這篇 stackoverflow的回答

經過上述步驟後,基本上你就完成了文字探勘的前處理了!後續在做詞頻分析、關鍵字萃取或是建立 word2vector的model時都能更加精確的描述手中的資料囉。若是追求效率的人,也可以將資料讀入 pandas的 dataframe後再進行處理,其優化後的演算法應該會比自己寫的迴圈來得省時哦!


喜歡這篇文章的話請不要忘了點個
關鍵字:文字探勘資料處理, text mining, 機器學習machine learning

沒有留言 :

張貼留言