當前位置:
首頁 > 知識 > Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

在上一篇文章中,我們開始討論如何使用Python進行自然語言處理。我們學習了如何讀寫文本和PDF文件。在本文中,我們將開始使用spaCy庫來執行一些更基本的NLP任務,如標記化、詞幹提取和詞形還原。

SpaCy簡介

spaCy庫與NLTK都是最流行的NLP庫之一。這兩個庫的基本區別在於,NLTK包含多種演算法來解決一個問題,而spaCy只包含一種演算法,但它是解決問題的最佳演算法。

NLTK是在2001年發布的,而spaCy相對較新,是在2015年開發的。在這一系列關於NLP的文章中,我們將主要討論spaCy,因為它的藝術性質。但是,當使用NLTK而不是spaCy更容易執行任務時,我們還將接觸NLTK。

安裝 spaCy

如果你使用pip安裝程序安裝Python庫,打開命令行並執行以下語句:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

當然,如果你正在使用Anaconda,你需要在Anaconda提示符上執行以下命令:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

下載並安裝spaCy之後,下一步是下載語言模塊。我們將使用英語語言模塊。語言模塊用於執行各種NLP任務,我們將在後面的內容中看到。

下面的命令會下載語言模塊:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

基本功能

在深入研究不同的spaCy函數之前,我們來簡要地看看如何使用它。

作為第一步,你需要使用以下代碼導入spacy庫:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

接下來,我們需要載入spaCy語言模塊。

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

在上面的腳本中,我們使用spacy庫中的load函數來載入核心英語語言模塊。模塊存儲在sp變數中。

現在我們使用這個模塊來創建一個小文檔。文檔可以是一個句子,也可以是一組句子,長度不限。下面的腳本創建一個簡單的spaCy文檔。

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

當使用該模塊創建文檔時,SpaCy會自動將文檔分解為一系列標記。

標記是指句子中具有某種語義價值的單個部分。我們來看看我們的文檔中都有哪些標記:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

上面腳本的輸出看起來會是這樣:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

可以看到我們的文檔中有以下標記。我們還可以使用下面所示的.pos_屬性來查看每個標記的詞性:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

輸出:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

你可以看到,我們句子中的每個單詞或標記都被指定了一個詞性。例如,「Manchester」被標記為專有名詞,「Looking」被標記為動詞,等等。

最後,除了詞性部分,我們還可以看到詞性的依賴項。

我們來創建另一個文檔:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

依賴項解析使用屬性dep_,如下圖所示:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

輸出如下:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

從輸出中,你可以看到spaCy足夠智能,可以找到標記之間的依賴關係,例如在我們的句子中有一個單詞is"nt。依賴項解析器將其分解為兩個單詞,並說明n"t實際上是對前一個單詞的否定。

有關依賴項解析的詳細理解,請參閱本文。

除了列印單詞外,還可以從文檔中列印句子。

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

現在,我們可以使用下面的腳本遍歷每個句子:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

輸出如

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

你還可以檢查一個句子是否以特定標記開頭。你可以使用索引和方括弧(類似於數組)獲取單個標記:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

在上面的腳本中,我們正在搜索文檔中的第5個單詞。請記住,索引是從零開始,句點作為標記。在輸出你應該能看到:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

現在,要查看文檔中是否有以The開頭的句子,我們可以使用is_sent_startattribute屬性,如下所示:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

在輸出中,你會看到True,因為在第二句的開頭使用了The標記。

在本節中,我們看到了spaCy庫的一些基本操作。現在讓我們更深入地研究,詳細了解標記化、詞幹提取和詞形還原。

標記化

如前所述,標記化是將文檔分解為單詞、標點符號、數字等的過程。

我們來詳細看看spaCy標記化。使用以下腳本創建一個新文檔:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

你可以看到這個句子的開頭和結尾都有引號。縮寫 "U.K" 和 "U.S.A."中還包含標點符號。

我們來看看spaCy是如何標記化這個句子的。

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

輸出:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

在輸出中,可以看到spaCy標記了開始和結束的雙引號。但是,它還是很智能的,沒有標記縮寫詞(例如U.K. 和 U.S.A.)之間的標點符號。

我們來看另一個標記化的例子:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

在上面的句子中,「non-vegetarian」一詞和電子郵件地址中都有破折號。我們來看看spaCy會如何標記這個:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

輸出:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

從輸出結果可以明顯看出,spaCy實際上能夠檢測到這個電子郵件,儘管它有一個「-」,但並沒有對其進行標記。另一方面,「non-vegetarian」一詞被標記出來。

現在我們來看看如何統計文檔中的單詞:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

在輸出中,你會看到14,這是sentence4中標記的數量。

檢測實體

除了將文檔標記化為單詞之外,你還可以發現該單詞是否為實體短語,如公司、地點、建築物、貨幣、機構等。

我們來看一個命名的實體識別的簡單例子:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

我們首先來簡單對它進行標記:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

輸出:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

我們知道「Manchester United」是一個單詞,所以它不應該被標記成兩個單詞。同樣,「Harry Kane」是一個人的名字,「$ 9000 million」是貨幣值。這些也不應該被標記。

這就是命名實體識別發揮作用的地方。要從一個文檔中獲取命名實體,必須使用ents屬性。我們來從上面的句子中檢索命名實體。執行以下腳本:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

在上面的腳本中,我們列印出實體的文本、實體的標籤和實體的詳細信息。輸出如下:

輸出:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

你可以看到spaCy的命名實體識別器已經成功地將「Manchester United」作為一個組織,「Harry Kane」作為一個人,「$90 million」作為貨幣值識別出。

檢測名詞

除了檢測命名實體外,還可以檢測名詞。為此,可以使用noun_chunks屬性。考慮一下下面這句話:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

我們試著找出這個句子中的名詞:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

輸出:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

從輸出中可以看到,名詞也可以是命名實體,反之亦然。

詞幹提取

詞幹提取是指將一個單詞還原為它的詞根形式。在執行自然語言處理任務時,在遇到的各種場景中,你會發現具有相同詞根的不同單詞。例如,computer, computer, computing, computed等。為了統一起見,你可能希望將單詞縮減為詞根形式。這就是詞幹提取的作用。

你可能會感到驚訝,但是spaCy不包含任何詞幹提取功能,因為它只依賴於詞形還原。因此,在本節中,我們將使用NLTK進行詞幹提取。

在NLTK中有兩種類型的詞幹提取器:Porter Stemmer和Snowball Stemmer。它們都是使用不同的演算法實現的。

Porter Stemmer

我們來實際看一下 porter stemmer:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

先創建一個PorterStemmer類.

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

假設我們有以下的列表,我們想要將這些單詞縮減為詞幹:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

下面的腳本使用porter stemmer查找列表中的單詞的詞幹:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

輸出如下:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

你可以看到,這四個單詞都被簡化成「comput」,這其實根本就不是一個單詞。

Snowball Stemmer

Snowball stemmer是Porter stemmer的一個稍微改進版本,通常比後者更受歡迎。我們來實例看看:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

在上面的腳本中,我們使用Snowball stemmer來查找與porter stemmer實例中相同的4個單詞的詞幹。輸出如下:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

你可以看到結果是一樣的。我們仍然得到「comput」作為詞幹。再說一遍,」comput」 這個詞實際上不是字典里的單詞。

這樣一來詞形還原就派上用場了。詞形還原將這個單詞縮減為在詞典中出現的它的詞幹。通過詞形還原返回的詞幹是實際的字典單詞,它的語義是完整的,不像詞幹提取器返回的單詞。

詞形還原

雖然不能用spaCy進行詞幹提取,但可以用spaCy進行詞形還原。

為此,我們需要使用spaCy文檔中的lemma_屬性。假設我們有下面這句話:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

我們可以通過下面的代碼使用spaCy詞形還原找到所有單詞的詞根:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

上面腳本的輸出如下:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

可以看到不像詞幹提取得到的詞根是「comput」,我們這裡得到的詞根是字典中的實際單詞。

詞形還原將第二種或第三種形式的單詞轉換為它們的第一種變體。請看下面的例子:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

輸出:

Python自然語言處理: 使用SpaCycle庫進行標記化、詞幹提取和詞形還原

從輸出中可以清楚地看到,「written」、「released」等第二、三種形式的單詞已被轉換為第一種形式,即:「write」和「release」。

結論

標記化、詞幹提取和詞形還原是一些最基本的自然語言處理任務。在本文中,我們了解了如何使用spaCy庫執行標記化和詞形還原。我們還了解了如何使用NLTK進行詞幹提取。在下一篇文章中,我們將開始討論Python中的辭彙和短語匹配。


英文原文:https://stackabuse.com/python-for-nlp-tokenization-stemming-and-lemmatization-with-spacy-library/
譯者:浣熊君( ????? )

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

在瀏覽器中運行VSCode:code-server
Python FTP簡介

TAG:Python部落 |