天天看點

教你用Python進行自然語言處理(附代碼)

自然語言處理(NLP)是資料科學中最有趣的子領域之一,越來越多的資料科學家希望能夠開發出涉及非結構化文本資料的解決方案。盡管如此,許多應用資料科學家(均具有STEM和社會科學背景)依然缺乏NLP(自然語言處理)經驗。

在這篇文章中,我将探讨一些基本的NLP概念,并展示如何使用日益流行的Python spaCy包來實作這些概念。這篇文章适合NLP初學者閱讀,但前提是假設讀者具備Python的知識。

spaCy是一個相對較新的包,“工業級的Python自然語言工具包”,由Matt Honnibal在Explosion AI.開發。它在設計時目标使用者以應用資料科學家為主,這也意味着它不需要使用者來決定使用哪個算法來處理常見任務,而且它非常地快—快得難以置信(它用Cython來實作)。如果你熟悉Python資料科學棧,spaCy就是NLP的numpy,它雖然理所當然地位于底層,但是卻很直覺,性能也相當地高。

spaCy為任何NLP項目中常用的任務提供一站式服務.包括:

教你用Python進行自然語言處理(附代碼)

符号化(Tokenizatioin)

教你用Python進行自然語言處理(附代碼)

詞幹提取(Lemmatization)

教你用Python進行自然語言處理(附代碼)

詞性标注(Part-of-speech tagging)

教你用Python進行自然語言處理(附代碼)

實體識别(Entity recognition)

教你用Python進行自然語言處理(附代碼)

依存句法分析(Dependency parsing)

教你用Python進行自然語言處理(附代碼)

句子的識别(Sentence recognition)

教你用Python進行自然語言處理(附代碼)

字-向量變換(Word-to-vector transformation)

教你用Python進行自然語言處理(附代碼)

許多友善的清除文本和标準化文本的方法(cleaning and normalizing text)

我會對這些功能做一個高層次的概述,并說明如何利用spaCy通路它們。

首先,我們加載spaCy的管線,按照約定,它存儲在一個名為nlp的變量中。需要花幾秒鐘時間聲明該變量,因為spaCy預先将模型和資料加載到前端,以節省時間。實際上,這樣做可以提前完成一些繁重的工作,使得nlp解析資料時開銷不至于過大。 請注意,在這裡,我們使用的語言模型是英語,同時也有一個功能齊全的德語模型,在多種語言中均可實作标記化(将在下面讨論)。

我們在示例文本中調用NLP來建立Doc對象。Doc 對象是文本本身NLP任務容器,将文本切分成文字(Span 對象)和元素(Token 對象),這些對象實際上不包含資料。值得注意的是Token 和 Span對象實際上沒有資料。相反,它們包含Doc對象中的資料的指針,并且被惰性求值(即根據請求)。絕大多數spaCy的核心功能是通過對Doc (n=33), Span (n=29),和 Token (n=78)對象的方法來實作的。

分詞是許多自然語言處理任務中的一個基本步驟。分詞就是将一段文本拆分為單詞、符号、标點符号、空格和其他元素的過程,進而建立token。這樣做的一個簡單方法是在空格上拆分字元串:

從表面上,直接以空格進行分詞效果還不錯。但是請注意, 它忽略了标點符号,且沒有将動詞和副詞分開("was", "n't")。換句話說,它太天真了,它無法識别出幫助我們(和機器)了解其結構和含義的文本元素。讓我們來看看spaCy如何處理這個問題:

這裡,我們通路的每個token的.orth_方法,它傳回一個代表token的字元串,而不是一個SpaCytoken對象。這可能并不總是可取的,但值得注意。SpaCy能夠識别标點符号,并能夠将這些标點符号與單詞的token分開。許多SpaCy的token方法為待處理的文字同時提供了字元串和整數的傳回值:帶有下劃線字尾的方法傳回字元串而沒有下劃線字尾的方法傳回的是整數。例如:

很酷,對吧?

和分詞相關的任務是詞幹提取。詞幹提取是将一個單詞還原成它的基本形式--母詞的過程。不同用法的單詞往往具有相同意義的詞根。例如,practice(練習), practiced(熟練的),和 practising(實習)這三個單詞實質上指的是同一件事情。通常需要将相似意義的單詞進行标準化,标準化到其基本的形式。使用SpaCy,我們利用标記的.lemma_ 方法通路到每個單詞的基本形式。

為什麼這個會有用?一個即時用例便是機器學習,特别是文本分類。例如:在建立“單詞袋”之前需對文本進行詞幹提取,避免了單詞的重複,是以,該模型可以更清晰地描述跨多個文檔的單詞使用模式。

詞性标注是将文法屬性(如名詞、動詞、副詞、形容詞等)指派給詞的過程。共享相同詞性标記的單詞往往遵循類似的句法結構,在基于規則的處理過程中非常有用。

例如,在給定的事件描述中,我們可能希望确定誰擁有什麼。通過利用所有格,我們可以做到這一點(提供文本的文法)。SpaCy采用流行的Penn Treebank POS标記(參見這裡)。利用SpaCy,可以分别使用.pos_ 和 .tag_方法通路粗粒度POS标記和細粒度POS标記。在這裡,我通路細粒度的POS标記:

我們可以看到,'s 的标簽被标記為 POS.我們可以利用這個标記提取所有者和他們擁有的東西:

這将傳回所有者擁有元組的清單。如果你想在這件事上表現成為超級Python能手的話,你可以把它寫成一個完整的清單(我認為這是最好的!):

在這裡,我們使用的是每個标記的.nbor 方法,它傳回一個和這個标記相鄰的标記。

實體識别是将文本中的指定實體分類為預先定義的類别的過程,如個人、地點、組織、日期等。spaCy使用統計模型對各種模型進行分類,包括個人、事件、藝術作品和國籍/宗教(參見完整清單檔案))

例如,讓我們從貝拉克·奧巴馬的維基百科條目中選出前兩句話。我們将解析此文本,然後使用Doc 對象的 .ents方法通路辨別的實體。通過調用Doc 的這個方法,我們可以通路其他的标記方法 ,特别是 .label_ 和 .label兩個方法:

您可以看到在本例中,模型所識别的實體以及它們的精确程度。PERSON 是不言自明的;NORP是國籍或宗教團體;GGPE辨別位置(城市、國家等等);DATE 辨別特定的日期或日期範圍, ORDINAL辨別一個表示某種類型的順序的單詞或數字。

在我們讨論Doc方法的主題時,值得一提的是spaCy的句子辨別符。NLP任務希望将文檔拆分成句子的情況并不少見。利用SpaCy通路Doc's.sents 方法并不難做到:

目前就是這樣。在以後的文章中,我将展示如何在複雜的資料挖掘和ML的任務中使用spaCy。

TrueSight是一個AIOps平台,由機器學習和分析提供動力支援,它解決了多個雲的複雜性,并且提高了數字轉化的速度,進而提升了IT運­作的效率。

原文釋出時間為:2018-03-28

本文作者:Jayesh Ahire