在對文本做資料分析時,我們一大半的時間都會花在文本預處理上,而中文和英文的預處理流程稍有不同,本文就對中文文本挖掘的預處理流程做一個總結。
首先我們看看中文文本挖掘預處理和英文文本挖掘預處理相比的一些特殊點。
第二,中文的編碼不是utf8,而是unicode。這樣會導緻在分詞的時候,和英文相比,我們要處理編碼的問題。
這兩點構成了中文分詞相比英文分詞的一些不同點,後面我們也會重點講述這部分的處理。當然,英文分詞也有自己的煩惱,這個我們在以後再講。了解了中文預處理的一些特點後,我們就言歸正傳,通過實踐總結下中文文本挖掘預處理流程。
在文本挖掘之前,我們需要得到文本資料,文本資料的擷取方法一般有兩種:使用别人做好的語料庫和自己用爬蟲去在網上去爬自己的語料資料。
對于第一種方法,常用的文本語料庫在網上有很多,如果大家隻是學習,則可以直接下載下傳下來使用,但如果是某些特殊主題的語料庫,比如“機器學習”相關的語料庫,則這種方法行不通,需要我們自己用第二種方法去擷取。
由于Python2不支援unicode的處理,是以我們使用Python2做中文文本預處理時需要遵循的原則是,存儲資料都用utf8,讀出來進行中文相關處理時,使用GBK之類的中文編碼,在下面一節的分詞時,我們再用例子說明這個問題。
常用的中文分詞軟體有很多,個人比較推薦結巴分詞。安裝也很簡單,比如基于Python的,用"pip install jieba"就可以完成。下面我們就用例子來看看如何中文分詞。
首先我們準備了兩段文本,這兩段文本在兩個檔案中。兩段文本的内容分别是nlp_test0.txt和nlp_test2.txt:
沙瑞金贊歎易學習的胸懷,是金山的百姓有福,可是這件事對李達康的觸動很大。易學習又回憶起他們三人分開的前一晚,大家一起喝酒話别,易學習被降職到道口縣當縣長,王大路下海經商,李達康連連賠禮道歉,覺得對不起大家,他最對不起的是王大路,就和易學習一起給王大路湊了5萬塊錢,王大路自己東挪西撮了5萬塊,開始下海經商。沒想到後來王大路竟然做得風生水起。沙瑞金覺得他們三人,在困難時期還能以沫相助,很不容易。
沙瑞金向毛娅打聽他們家在京州的别墅,毛娅笑着說,王大路事業有成之後,要給歐陽菁和她公司的股權,她們沒有要,王大路就在京州帝豪園買了三套别墅,可是李達康和易學習都不要,這些房子都在王大路的名下,歐陽菁好像去住過,毛娅不想去,她覺得房子太大很浪費,自己家住得就很踏實。
我們先講文本從第一個檔案中讀取,并使用中文GBK編碼,再調用結巴分詞,最後把分詞結果用uft8格式存在另一個文本nlp_test1.txt
中。代碼如下:
輸出的文本内容如下:
沙 瑞金 贊歎 易 學習 的 胸懷 , 是 金山 的 百姓 有福 , 可是 這件 事對 李達康 的 觸動 很大 。 易 學習 又 回憶起 他們 三人 分開 的 前一晚 , 大家 一起 喝酒 話别 , 易 學習 被 降職 到 道口 縣當 縣長 , 王 大路 下海經商 , 李達康 連連 賠禮道歉 , 覺得 對不起 大家 , 他 最 對不起 的 是 王 大路 , 就 和 易 學習 一起 給 王 大路 湊 了 5 萬塊 錢 , 王 大路 自己 東挪西撮 了 5 萬塊 , 開始 下海經商 。 沒想到 後來 王 大路 竟然 做 得 風生水 起 。 沙 瑞金 覺得 他們 三人 , 在 困難 時期 還 能 以沫 相助 , 很 不 容易 。
可以發現對于一些人名和地名,jieba處理的不好,不過我們可以幫jieba加入詞彙如下:
現在我們再來進行讀檔案,編碼,分詞,編碼和寫檔案,代碼如下:
沙瑞金 贊歎 易學習 的 胸懷 , 是 金山 的 百姓 有福 , 可是 這件 事對 李達康 的 觸動 很大 。 易學習 又 回憶起 他們 三人 分開 的 前一晚 , 大家 一起 喝酒 話别 , 易學習 被 降職 到 道口 縣當 縣長 , 王大路 下海經商 , 李達康 連連 賠禮道歉 , 覺得 對不起 大家 , 他 最 對不起 的 是 王大路 , 就 和 易學習 一起 給 王大路 湊 了 5 萬塊 錢 , 王大路 自己 東挪西撮 了 5 萬塊 , 開始 下海經商 。 沒想到 後來 王大路 竟然 做 得 風生水 起 。 沙瑞金 覺得 他們 三人 , 在 困難 時期 還 能 以沫 相助 , 很 不 容易 。
基本已經可以滿足要求。同樣的方法我們對第二段文本nlp_test2.txt進行分詞和寫入檔案nlp_test3.txt。
沙瑞金 向 毛娅 打聽 他們 家 在 京州 的 别墅 , 毛娅 笑 着 說 , 王大路 事業有成 之後 , 要 給 歐陽 菁 和 她 公司 的 股權 , 她們 沒有 要 , 王大路 就 在 京州 帝豪園 買 了 三套 别墅 , 可是 李達康 和 易學習 都 不要 , 這些 房子 都 在 王大路 的 名下 , 歐陽 菁 好像 去 住 過 , 毛娅 不想 去 , 她 覺得 房子 太大 很 浪費 , 自己 家住 得 就 很 踏實 。
可見分詞效果還不錯。
在我們用scikit-learn做特征處理的時候,可以通過參數stop_words來引入一個數組作為停用詞表。
現在我們将停用詞表從檔案讀出,并切分成一個數組備用:
TfidfVectorizer類可以幫助我們完成向量化,TF-IDF和标準化三步。當然,還可以幫我們處理停用詞。
現在我們把上面分詞好的文本載入記憶體:
這裡的輸出還是我們上面分完詞的文本。現在我們可以進行向量化,TF-IDF和标準化三步處理了。注意,這裡我們引入了我們上面的停用詞表。
部分輸出如下:
我們再來看看每次詞和TF-IDF的對應關系:
有了每段文本的TF-IDF的特征向量,我們就可以利用這些資料建立分類模型,或者聚類模型了,或者進行主題模型的分析。比如我們上面的兩段文本,就可以是兩個訓練樣本了。此時的分類聚類模型和之前講的非自然語言處理的資料分析沒有什麼兩樣。是以對應的算法都可以直接使用。而主題模型是自然語言處理比較特殊的一塊,這個我們後面再單獨講。
上面我們對中文文本挖掘預處理的過程做了一個總結,希望可以幫助到大家。需要注意的是這個流程主要針對一些常用的文本挖掘,并使用了詞袋模型,對于某一些自然語言處理的需求則流程需要修改。比如我們涉及到詞上下文關系的一些需求,此時不能使用詞袋模型。而有時候我們對于特征的處理有自己的特殊需求,是以這個流程僅供自然語言處理入門者參考。
下一篇我們來總結英文文本挖掘預處理流程,盡情期待。
本文轉自劉建平Pinard部落格園部落格,原文連結:http://www.cnblogs.com/pinard/p/6744056.html,如需轉載請自行聯系原作者