歡迎光臨
每天分享高質量文章

關於NLP和機器學習之文字處理的你需要知道的一切(附學習資源)

作者:Kavita Ganesan 翻譯:陳雨琳 校對:丁楠雅

本文4800字,建議閱讀20分鐘。

本文將介紹自然語言處理和機器學習中常見的文字預處理方法。

標簽:

  • 資料處理

https://www.kdnuggets.com/tag/data-preprocessing

  • 機器學習

https://www.kdnuggets.com/tag/machine-learning

  • NLP

https://www.kdnuggets.com/tag/nlp

  • Python

https://www.kdnuggets.com/tag/python

  • 文字分析

https://www.kdnuggets.com/tag/text-analysis

  • 文字挖掘

https://www.kdnuggets.com/tag/text-mining

本文全面介紹了文字預處理,涵蓋了不同的技術,包括詞乾提取,詞形還原,噪聲消除,規範化,以及何時應該使用它們的示例和解釋。 

By Kavita Ganesan, Data Scientist.

http://kavita-ganesan.com/

透過最近的一些交流對話,我意識到文字預處理是一個被嚴重忽視的話題。我接觸過的一些人提到他們的NLP應用程式的結果不一致,最後意識到他們只是沒有預處理文字或者他們使用了錯誤的文字預處理方法。

考慮到這一點,我想到要使大家瞭解文字預處理的真正含義,文字預處理的不同方法,以及估計可能需要多少預處理的方法。對於那些感興趣的人,我也為你做了一些文字預處理程式碼片段。現在,讓我們開始吧

文字預處理程式碼片段

https://github.com/kavgan/nlp-text-mining-working-examples/tree/master/text-pre-processing

什麼是文字預處理?

預處理文字指的是將文字轉換為可預測且可分析的任務形式。這裡的任務是方法和域的結合。例如,從推文(域)中使用TF-IDF(方法)提取頂級關鍵字。

任務=方法+域

一項任務的理想預處理可能成為另一項任務中最糟糕的噩夢。所以請註意:文字預處理不能直接從任務轉移到任務。

讓我們舉一個非常簡單的例子,假設你試圖發現新聞資料集中常用的單詞。如果你的預處理步驟包括刪除停用詞,因為其他任務中做過這一步,那麼你可能會錯過一些常用詞,因為你已經將其刪除了。實際上,這不是一種通用的方法。

停用詞

http://kavita-ganesan.com/what-are-stop-words/

幾種文字預處理技術

文字預處理有不同的方法。以下是一些你需要瞭解的方法,並且我會強調每一個方法的重要性。

轉換為小寫

儘管把所有文字資料轉換為小寫這一點通常被忽略,但它是文字預處理中最簡單,最有效的形式之一。它適用於大多數文字挖掘和NLP問題,並且可以在資料集不是很大時提供幫助,同時為預期輸出一致性帶來巨大幫助。

最近,我的一位部落格讀者為相似性查詢任務訓練了一個嵌入單詞的模型。他發現有著不同大小寫變化方式(比如“Canada”和“canada”)的輸入產生了不同型別的輸出,或者根本沒有輸出。這可能是因為資料集中出現了“Canada”這個詞的混合情況,並且沒有足夠的證據讓神經網路能夠有效地學習不常見版本的權重。當你的資料集相當小時,這種型別的問題肯定會發生,而小寫是處理文字稀少問題的好方法。

嵌入單詞的模型

http://kavita-ganesan.com/gensim-word2vec-tutorial-starter-code/

以下是一個小寫預處理解決文字稀少問題的例子,同一個單詞的不同大小寫變化都對映到同一個小寫形式。

同一個單詞的不同大小寫變化都對映到同一個小寫形式

另一種小寫轉換非常管用的情況是,想象一下,你在查詢含有“usa”的檔案,然而,查詢結果為空因為“usa”被索引為“USA”。現在我們該怪誰呢?是設計介面的使用者介面設計師還是設定搜尋索引的工程師呢?

雖然轉換為小寫應該作為標準操作,我也同樣經歷過保留大寫非常重要的情況。比如,當我們在預測原始碼檔案的程式語言的時候。Java的語言系統跟Python很不一樣。小寫轉換使得兩者相同,導致分類器失去了重要的預測特徵。雖然小寫轉換通常都很有幫助,它也並不適用於所有的任務。

詞乾提取

詞乾提取是將詞語中的屈折變化(比如 troubled,troubles)減少到詞根(比如trouble)的過程。在這種情況下,“根”可能不是真正的詞根,而只是原始詞的規範形式。

詞乾提取使用粗略的啟髮式過程來切掉單詞的末尾,以期正確地將單詞轉換為其根形式。 因此,“trouble”, “troubled” 和 “troubles”實際上可能會被轉化為“troubl”而不是“trouble”,因為兩端都被切掉了(呃,多麼粗暴!)。

詞乾提取有不同的演演算法。最常見的演演算法,經驗上也對英語很有效的,是Porters演演算法。以下是Porter Stemmer進行詞乾提取的一個例子:

Porters演演算法

https://tartarus.org/martin/PorterStemmer/

對有屈折變化的詞進行詞乾提取的作用

詞乾對於處理文字稀少問題以及詞彙標準化非常有用。尤其是在搜尋應用程式中取得了成功。其本質在於,假設你正在尋找“deep learning classes”,你想要搜尋到提到“deep learning class”以及“deep learn classes”的檔案,儘管後者聽起來不對。但是你的要求恰好是我們的標的。你希望匹配單詞的所有變體以顯示最相關的檔案。

然而,在我之前的大多數文字分類工作中,詞乾提取僅僅略微提高了分類準確性,而不是使用更好的工程特徵和文字豐富方法,例如使用單詞嵌入。

詞形還原

錶面上的詞形還原與詞乾還原非常相似,其標的是刪除變形並將單詞對映到其根形式。唯一的區別是,詞形還原試圖以正確的方式去做。它不只是切斷單詞,它實際上將單詞轉換為實際的根。例如,“better”這個詞會對映到“good”。它可以使用諸如WordNet的字典或一些基於規則的特殊方法來進行對映。以下是使用基於WordNet的方法實現的詞形還原的示例:

WordNet

https://www.nltk.org/_modules/nltk/stem/wordnet.html

基於規則的特殊方法

https://www.semanticscholar.org/paper/A-Rule-based-Approach-to-Word-Lemmatization-Plisson-Lavrac/5319539616e81b02637b1bf90fb667ca2066cf14

使用WordNet實現的詞形還原的作用

根據我的經驗,在搜尋和文字分類方面,詞形還原與詞乾還原相比沒有明顯的優勢。實際上,因為你選擇的演演算法,與使用非常基本的詞乾分析器相比,它可能要慢得多,你可能必須知道相關單詞的詞性才能得到正確的詞乾。本文發現,詞形還原對神經結構文字分類的準確性沒有顯著影響。

本文

https://arxiv.org/pdf/1707.01780.pdf

就我個人而言,我會保守地使用詞形還原。額外的開銷是否值得很難說。但你可以隨時嘗試檢視它對你的效果指標的影響。

刪除停用詞

停用詞是一種語言中常用的詞彙。英語中的停用詞的例子是“a”,“the”,“is”,“are”等。使用停用詞背後的直覺是,透過從文字中刪除低資訊詞,我們可以專註於重要的詞。

例如,在搜尋系統的背景關係中,如果你的搜尋查詢是“什麼是文字預處理?”,你希望搜尋系統專註於呈現談論文字預處理的檔案,而不是談論“什麼是“。這可以透過對所有在停用詞串列中的單詞停止分析來完成。停用詞通常應用於搜尋系統,文字分類應用程式,主題建模,主題提取等。

根據我的經驗,刪除停用詞雖然在搜尋和主題提取系統中有效,但在分類系統中顯示為非關鍵。但是,它確實有助於減少所考慮的特徵數量,這有助於保持一個較小的模型。

以下是一個刪除停用詞的示例。所有的停用詞都被一個啞字元“W“代替了。

原句= this is a text full of content and we need to clean it up

刪除停用詞後的句子=W W W text full W content W W W W clean W W

停止詞串列可以來自預先建立的集合,也可以為你的域建立自定義單詞串列。某些庫(例如sklearn)允許你刪除一定比例檔案中都出現的單詞,這也可以為你提供刪除停止詞效果。

停止詞串列

http://kavita-ganesan.com/what-are-stop-words/

自定義單詞串列

http://kavita-ganesan.com/tips-for-constructing-custom-stop-word-lists/

規範化

一個被高度忽視的預處理步驟是文字規範化。文字規範化是將文字轉換為規範(標準)形式的過程。例如,“gooood”和“gud”這兩個詞可以轉換為“good”,即其規範形式。另一個例子是將近似相同的單詞(例如“stopwords”,“stop-words”和“stop words”)對映到“stopwords”。

文字規範化對於噪聲多的文字非常重要,例如社交媒體評論,簡訊和對部落格文章的評論,其中縮寫,拼寫錯誤和使用標準詞彙以外的詞(out-of-vocabulary words)很普遍。這篇文章透過對推文進行文字規範化處理的例子證明該方法能夠將情緒分類準確度提高約4%。

這篇文章

https://sentic.net/microtext-normalization.pdf

這是規範化之前和之後的單詞示例:

文字規範化的效果

請註意變體如何對映到相同的規範形式。

根據我的經驗,文字規範化甚至可以有效地分析高度非結構化的臨床文字,因為醫生的筆記總是沒有規範的。我還發現它對於主題提取很有用,其中近似同義詞和拼寫差異十分常見(例如topic modelling, topic modeling, topic-modeling, topic-modelling)。

高度非結構化的臨床文字

http://kavita-ganesan.com/general-supervised-approach-segmentation-clinical-texts/

主題提取

https://githubengineering.com/topics/

不幸的是,與詞乾和詞形還原不同,沒有一種標準的文字規範化方法。它通常隨任務不同而不同。例如,你將臨床文字規範化的方式可能與你對簡訊文字訊息的規範化方式有所不同。

文字規範化的一些常用方法包括字典對映(最簡單),統計機器翻譯(SMT)和基於拼寫校正的方法。這篇有趣的文章比較了使用基於字典的方法和SMT方法來規範化文字訊息。

這篇有趣的文章

https://nlp.stanford.edu/courses/cs224n/2009/fp/27.pdf

噪音消除

噪聲消除是指刪除可能幹擾文字分析的字元數字和文字。噪聲消除是最基本的文字預處理步驟之一。它也是高度依賴域的。

例如,在推文中,噪聲可能是除了主題標簽之外的所有特殊字元,因為它表示可以描述推文的概念。噪音的問題在於它會在下游任務中產生不一致的結果。我們來看下麵的例子:

沒有去除噪音的詞乾提取

請註意,上面的所有原始單詞都有一些周圍的噪音。如果你對這些詞進行詞乾提取,你會發現結果看起來不太漂亮。他們都沒有正確的詞乾。但是,透過這個筆記本中寫的一些噪音清除,結果現在看起來好多了:

這個筆記本

https://github.com/kavgan/nlp-text-mining-working-examples/blob/master/text-pre-processing/Text%20Pre-Processing%20Examples.ipynb

除噪後的詞乾提取

在文字挖掘和NLP中,噪聲消除是你應該首先考慮的事情之一。有各種方法可以消除噪音。這包括刪除標點符號,刪除特殊字元,刪除數字,刪除html格式,刪除特定域的關鍵字(例如轉發的“RT”),刪除原始碼,刪除標題等。這一切都取決於你的工作域以及什麼文字為你的任務帶來的噪音。我的筆記本中的程式碼片段顯示瞭如何進行一些基本的噪音消除。

我的筆記本中的程式碼片段

https://github.com/kavgan/nlp-text-mining-working-examples/tree/master/text-pre-processing

文字豐富/增強

文字豐富涉及使用你以前沒有的資訊來擴充原始文字資料。文字豐富為原始文字提供了更多語意,從而提高了預測能力以及可以對資料執行的分析深度。

在資訊檢索示例中,擴充套件使用者的查詢以改進關鍵字的匹配是一種增強形式。像文字挖掘這樣的查詢可以成為文字檔案挖掘分析。雖然這對一個人沒有意義,但它可以幫助獲取更相關的檔案。

豐富文字的方式多種多樣。你可以使用詞性標註來獲取有關文字中單詞的更詳細資訊。

詞性標註

https://en.wikipedia.org/wiki/Part-of-speech_tagging

例如,在檔案分類問題中,單詞“book“作為名詞和動詞會導致不同的分類,因為前者用於表示閱讀含義的背景關係中,而後者用於表示儲存含義的背景關係中。本文討論瞭如何結合使用名詞和動詞作為輸入特徵來改進中文文字分類。

本文

http://www.iapr-tc11.org/archive/icdar2011/fileup/PDF/4520a920.pdf

然而,由於大量文字的可用性,人們開始使用嵌入來豐富單詞,短語和句子的含義,以便進行分類,搜尋,總結和文字生成。在基於深度學習的NLP方法中尤其如此,其中字級嵌入層非常常見。你可以從預先建立的嵌入開始,也可以建立自己的嵌入併在下游任務中使用它。

嵌入

https://en.wikipedia.org/wiki/Word_embedding

字級嵌入層

https://keras.io/layers/embeddings/

預先建立的嵌入

https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html

豐富文字資料的其他方法包括短語提取,你可以將複合詞識別為一個整體(也稱為分塊),使用同義詞和依賴詞解析進行擴充套件。

同義詞

http://aclweb.org/anthology/R09-1073

依賴詞解析

http://www.cs.virginia.edu/~kc2wc/teaching/NLP16/slides/15-DP.pdf

是不是所有的預處理都是必要的?

並不是,但如果你想獲得良好、一致的結果,你必須採用其中的一些方法。為了讓你瞭解最低限度應該是什麼,我把它分解為必須做,應該做和任務依賴型。在決定你確實需要之前,所有依賴於任務的步驟都可以進行定量或定性測試。

請記住,少即是多,應該盡可能保持你的方法簡潔。你新增的越多,遇到問題時你將需要剝離的層數越多。

必須做:

  • 噪音消除

  • 轉換為小寫(在某些情況下視任務而不同)

應該做:

  • 簡單規範化 – (例如,標準化幾乎相同的單詞)

任務依賴:

  • 高階規範化(例如,解決詞彙外單詞)

  • 刪除停用單詞

  • 詞乾/詞形還原

  • 文字豐富/增強

因此,對於任何任務,你應該做的最小值是嘗試將文字轉換為小寫並消除噪音。什麼樣的文字包含噪音取決於你的域(請參閱噪音消除部分)。你還可以執行一些基本的規範化步驟以獲得更高的一致性,然後根據需要系統地新增其他層。

一般經驗法則

並非所有任務都需要相同級別的預處理。對於某些任務,你可以儘量減少。但是,對於其他任務來說,資料集是如此嘈雜,如果你沒有進行足夠的預處理,最終結果將跟原始輸入同樣糟糕。

這是一般的經驗法則。這並不總是成立,但適用於大多數情況。如果你在一個相當普通的域有大量行文規範流暢的文字,那麼預處理並不是非常關鍵,你可以使用最低限度(例如,使用所有維基百科文字或路透社新聞文章訓練單詞嵌入模型)。

但是,如果你在一個非常狹窄的域進行工作(例如關於健康食品的推文)並且資料稀少且嘈雜,你可以從更多的預處理層中受益,儘管你新增的每個層(例如,刪除停用詞,詞乾提取,文字規範化)都需要被定量或定性地驗證為有意義的層。這是一個表格,總結了你應該對文字資料執行多少預處理。

需要的不同級別文字預處理:

我希望這裡的想法可以引導你為專案選擇正確的預處理步驟。記住,少即是多。我的一位朋友曾經向我提到他是如何透過拋棄不必要的預處理層來使大型電子商務搜尋系統更高效,錯誤更少。

資源

  • 使用NLTK和regex進行基本文字預處理的Python程式碼

https://github.com/kavgan/nlp-text-mining-working-examples/blob/master/text-pre-processing/Text%20Preprocessing%20Examples.ipynb

  • 構建自定義停用詞串列

http://kavita-ganesan.com/tips-for-constructing-custom-stop-word-lists/

  • 短語提取的原始碼

https://kavgan.github.io/phrase-at-scale/

參考資料

有關論文的最新串列,請參閱我的原始文章。

原始文章

https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action;=edit&isNew;=1&type;=10&token;=838611073〈=zh_CN#Relevant-Papers

Bio:Kavita Ganesan是一名資料科學家,擁有自然語言處理,文字挖掘,搜尋和機器學習方面的專業知識。在過去十年中,她曾在多個科技機構工作,包括GitHub(微軟),3M健康資訊系統和eBay。

Kavita Ganesan

http://kavita-ganesan.com/about-me/

原版。 轉載許可。

原版

https://medium.freecodecamp.org/all-you-need-to-know-about-text-preprocessing-for-nlp-and-machine-learning-bc1c5765ff67

資源:

  • 線上和基於網路:分析,資料挖掘,資料科學,機器學習教育

https://www.kdnuggets.com/education/online.html

  • 用於分析,資料科學,資料挖掘和機器學習的軟體

 https://www.kdnuggets.com/software/index.html

相關資料:

  • 基於PyTorch框架的NLP入門

https://www.kdnuggets.com/2019/04/nlp-pytorch.html

  • 利用轉移學習和弱監督建立廉價的NLP分類器

https://www.kdnuggets.com/2019/03/building-nlp-classifiers-cheaply-transfer-learning-weak-supervision.html

  • 超越新聞內容:社會背景對假新聞檢測的作用

https://www.kdnuggets.com/2019/03/beyond-news-contents-role-of-social-context-for-fake-news-detection.html

原文標題:

All you need to know about text preprocessing for NLP and Machine Learning

原文連結:

https://www.kdnuggets.com/2019/04/text-preprocessing-nlp-machine-learning.html

譯者簡介:陳雨琳,清華大學大二在讀,英語專業。專業學習之外喜歡學些數學、計算機類課程,被資料和模型的魅力所吸引,希望未來能往這個方向發展。道阻且長,行則將至。

本文轉自:資料派THU ;獲授權;

贊(0)

分享創造快樂