天天看點

秒懂!看機器學習如何淨化處理文本

你不能直接把原始文本送出給機器學習或深層學習模型,而必須首先對文本進行淨化,也就是将文本分解成單詞,以及處理标點符号和大小寫。

事實上,你需要使用一整套的文本預處理方法,而且這個方法的選擇取決于你需要對自然語言做何種處理。

在本教程中,你将學到如何為機器學習模組化而淨化和處理文本,包括:

如何開發簡單的文本淨化工具。

如何使用NLTK庫中更複雜的方法。

在使用現代文字表示方法時如何處理文本。

讓我們開始吧。

秒懂!看機器學習如何淨化處理文本

本教程包含六個部分,分别為:

弗蘭茨·卡夫卡的《變形記》

文本淨化是一件依賴于具體任務的工作

手動标記

使用NLTK進行标記和淨化

文本淨化注意事項

首先選擇一個資料集。

《變形記》全文可以從Gutenberg項目免費獲得。

<a href="http://www.gutenberg.org/cache/epub/5200/pg5200.txt">Gutenberg項目上的《變形記》(弗蘭茨·卡夫卡)</a>

你也可以在這裡下載下傳ASCII文本版:

下載下傳該檔案,并将其放在你目前的工作目錄中,檔案名為“metamorphosis.txt“。

該檔案包含了我們不感興趣的頁眉和頁腳,特别是版權和授權資訊。請打開檔案,删除頁眉和頁腳,并将檔案另存為“metamorphosis_clean.txt“。

這個幹淨檔案的開頭應該是這樣的:

One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin.

檔案的結尾應該是這樣的:

And, as if in confirmation of their new dreams and good intentions, as soon as they reached their destination Grete was the first to get up and stretch out her young body.

在拿到了文本資料之後,清理文本資料的第一步是為了讓你對要實作的目标有一個清晰的概念。

仔細看看這篇文章。你能注意到哪些東西?

這是我發現的:

它是純文字,是以沒有标記需要解析。

原始德語的翻譯使用的是英國英語(例如“travelling“)。

文本被人工斷行,每一行70個字元。

沒有明顯的列印錯誤或拼寫錯誤。

存在一些标點符号,如逗号、撇号、引号、問号等等。

存在連字元,如“armour-like”。

有很多地方都用破折号(“ - ”)來繼續句子(是否可以用逗号替代)?

存在很多人名(例如“Mr. Samsa”)

似乎沒有需要處理的數字(例如1999)

存在段标記字元(例如“II”和“III”),之前已經删除了第一個“I”。

我相信有很多雙訓練有素的眼睛能觀察到這些細節問題。

下文将展示最常見的文本淨化步驟。不過,請思考一下在處理這個文本檔案時可能會遇到的一些小問題。

例如:

如果對将文檔歸類為“Kafka”和“非Kafka”感興趣,也許可以去掉大小寫、标點符号。

請根據你要完成的任務來選擇如何處理文本資料。

文字淨化很難,而本教程使用的文字已經很幹淨了。

我們可以編寫一些Python代碼來手動淨化它,這對于遇到的那些簡單問題來說是一個不錯的處理方法。而諸如正規表達式和分割字元串的工具則可能需要耗費你較多的時間。

現在我們來加載文本資料吧。

這個文本檔案很小,加載到記憶體的速度很快。但并不是所有的文本檔案都會這麼小,你可能需要寫代碼将記憶體映射到檔案上。像NLTK這樣的工具(下一節将介紹)能簡化對大型檔案的處理。

将“metamorphosis_clean.txt”整個加載到記憶體中,如下所示:

運作該示例将整個檔案加載到記憶體中。

幹淨的文本通常意味着可以在機器學習模型中使用的單詞或标記清單。是以,我們需要将原始文本轉換為單次清單,并儲存下來。

最簡單的方法就是将文檔按空格進行分割,包括引号、新的一行、制表符等等。我們可以在Python中對加載的字元串使用split()函數。

運作這個示例可以将文檔分割成一個很長的清單,然後列印前100個元素。

可以看到,标點符号被保留下來了(例如“wasn’t”和“armour-like”),這很好。還還可以看到,句尾的标點符号與最後一個單詞放在了一起,沒有分割開(例如“thought.”),這不太好。

另一種方法是使用正規表達式模型,并通過使用字母數字過濾字元串(a-z,A-Z,0-9和‘_’)将文檔分割成單詞。

運作該示例,可以看到最終的單詞清單。 這一次,“armour-like”變成了兩個單詞“armour”和“like”(很好),但縮略詞,像“What’s”也變成了兩個單詞“What”和“s”(不是很好)。

注意:本示例是用Python 3編寫的。

我們想要的是單詞,而不是标點符号,比如逗号或引号。我們也希望縮略詞不要被分割開。

一種方法是将文檔按空格進行分割(在“2. 按空格分隔”中提到的),然後使用字元串轉換來替換所有标點符号(例如删除标點符号)。

Python提供了一個名為string.punctuation的常量,它是所有标點符号清單。例如:

結果是:

我們可以将上面這些代碼放在一起,加載文本檔案,将其按空格分割成單詞,然後轉換每個單詞以删除标點符号。

在通常情況下,可以看到這已經達到了預期的效果。

諸如“What’s”這樣的縮略語已經變成了“Whats”,而“armour-like”已經變成了“armourlike”。

将所有單詞轉換為統一的大小寫很常見。這能減少單詞量,但也會丢失某些差異(例如,“Apple”公司和“apple”水果是最常見的例子)。

可以對每個單詞調用lower()函數來将所有的單詞轉換為小寫。

運作示例,可以看到所有的單詞現在都變成小寫了。

淨化文本真的很難,需要具體問題具體分析。記住,越簡單越好。文本資料越簡單,則模型越簡單,詞彙表更小。

下面來看一下NLTK庫中的一些工具,可不僅僅是簡單的字元串拆分哦。

它提供了不錯的加載和淨化文本工具,我們可以用這些工具來為機器學習和深度學習算法擷取資料。

你可以使用你最喜歡的軟體包管理器來安裝NLTK,例如pip:

安裝完成之後,你還需要安裝與庫一起配套使用的資料,其中包含了大量的文檔,你可以使用這些文檔來測試NLTK中的其他工具。

有多種方法來安裝資料和文檔,例如,用腳本:

或用指令行:

有關安裝和設定NLTK的更多幫助,請參閱:

<a href="http://www.nltk.org/install.html">安裝 NLTK</a>

<a href="http://www.nltk.org/data.html">安裝 NLTK 資料</a>

第一步是将文本分割成句子。

一些模組化任務傾向于以段落或句子的形式輸入文本,例如word2vec。你可以先将文本分割成句子,再将每個句子分割成單詞,然後将每個句子儲存到檔案中,每行一個句子。

NLTK提供的sent_tokenize()函數可以将文本分割成句子。

下面的示例将“metamorphosis_clean.txt”檔案加載到記憶體中,将其分割成句子,并列印第一個句子。

運作這個示例,可以看到文檔被分割成了句子。

One morning, when Gregor Samsa woke from troubled dreams, he found himself transformed in his bed into a horrible vermin.

NLTK提供了一個名為word_tokenize()的函數,可用于将字元串分割成标記(也就是單詞)。

它根據空格和标點符号進行分割。例如,逗号和句點被視為單獨的标記。而縮略語也會分割開(例如“What’s”變成“What”和“’s“)。引号會被保留。

運作這段代碼,可以看到标點符号現在已經成為了标記,後面可以決定是否要過濾掉。

我們可以過濾掉我們不感興趣的标記,例如所有獨立的标點符号。

運作這個示例,你可以看到不僅标點符号,而且“armour-like”和“‘s”也被過濾掉了。

這些是最常見的停止詞:“the”,“a”和“is”。

對于某些應用(如文檔分類)來說,删除停止詞非常必要。

NLTK提供了各種語言(如英語)最常用的停止詞清單,可以像如下代碼那樣加載:

你可以看到完整的清單:

可以看到,它們都是小寫字母,并且标點符号已被删除。你可以将你的标記與停止詞進行比較,并将其過濾掉。

下面來示範一下這個過程:

加載原始文本。

分成多個标記。

轉換為小寫。

從每個标記中删除标點符号。

濾除不是字母的标記。

過濾掉停止詞。

運作這個例子,可以看到除了其他的轉換之外,像“a”和“to”這樣的停止詞已被删除。但是還留下了像“nt”這樣的标記。 革命尚未成功,同志仍須努力。

運作這個例子,可以看到很多單詞都已經被抽取了詞幹,比如,“trouble”已經變成“troubl”。而且,詞幹提取還使标記變為小寫。

在NLTK中有一整套很棒的詞幹和詞彙算法可供選擇。

由于本教程所使用的原始文本非常幹淨,是以我們可能忽略了你本需要在自己的項目中要做的文本淨化工作。

以下是淨化文本的一些注意事項:

處理那種不适合全部加載到記憶體裡的大型檔案和大批量的文本文檔。

從HTML、PDF或其他結構化文檔格式的标記中提取文本。

從其他語言翻譯為英文。

将Unicode字元解碼為标準的形式,比如UTF8。

處理特定領域的單詞、短語和縮略詞。

處理或删除數字,比如日期和數量。

查找和糾正常見的列印錯誤和拼寫錯誤。

……

真正幹淨的文本是不可能存在的,我們需要根據自己所擁有的時間、資源和知識來做到最好。“幹淨”這個概念是由項目的具體要求來決定的。

在每次轉換文本之後都要儲存為新的檔案,以便後期可以把所有的資料放在一起進行比較檢視。

如果你想閱讀更深入的内容,本章節提供了相關的内容。

<a href="http://www.gutenberg.org/ebooks/5200">Gutenberg項目上的《變形記》(弗蘭茨·卡夫卡)</a>

<a href="http://www.nltk.org/api/nltk.tokenize.html">nltk.tokenize package API</a>

<a href="http://www.nltk.org/api/nltk.stem.html">nltk.stem package API</a>

<a href="http://www.nltk.org/book/ch03.html">第3章:使用Python處理原始文本,自然語言處理</a>

在本教程中,你學會了如何用Python為機器學習淨化文本。

具體一點說,你學到了:

在使用現代文字表示方法時如何準備文本。

文章原标題《How to Clean Text for Machine Learning with Python》,作者:Jason Brownlee,譯者:夏天,審校:主題曲。

本文由北郵@愛可可-愛生活老師推薦,阿裡雲雲栖社群組織翻譯。