自然語言工具包 - 文字分詞



什麼是分詞?

它可以定義為將一段文字分解成更小部分的過程,例如句子和單詞。這些較小的部分稱為標記。例如,在一個句子中,單詞是一個標記;在一個段落中,句子是一個標記。

眾所周知,NLP用於構建情感分析、問答系統、語言翻譯、智慧聊天機器人、語音系統等應用程式,因此,為了構建這些應用程式,理解文字中的模式至關重要。上面提到的標記對於查詢和理解這些模式非常有用。我們可以將分詞視為其他步驟(例如詞幹提取和詞形還原)的基礎步驟。

NLTK包

nltk.tokenize是NLTK模組提供的用於實現分詞過程的包。

將句子分詞為單詞

將句子分割成單詞或從字串中建立一個單詞列表是每個文字處理活動的重要組成部分。讓我們藉助nltk.tokenize包提供的各種函式/模組來了解它。

word_tokenize模組

word_tokenize模組用於基本的單詞分詞。以下示例將使用此模組將句子分割成單詞。

示例

import nltk
from nltk.tokenize import word_tokenize
word_tokenize('Tutorialspoint.com provides high quality technical tutorials for free.')

輸出

['Tutorialspoint.com', 'provides', 'high', 'quality', 'technical', 'tutorials', 'for', 'free', '.']

TreebankWordTokenizer類

上面使用的word_tokenize模組基本上是一個包裝函式,它呼叫tokenize()函式作為TreebankWordTokenizer類的例項。它將給出與使用word_tokenize()模組將句子分割成單詞時相同的輸出。讓我們看看上面實現的相同示例:

示例

首先,我們需要匯入自然語言工具包(nltk)。

import nltk

現在,匯入TreebankWordTokenizer類來實現單詞分詞演算法:

from nltk.tokenize import TreebankWordTokenizer

接下來,建立一個TreebankWordTokenizer類的例項,如下所示:

Tokenizer_wrd = TreebankWordTokenizer()

現在,輸入您想要轉換為標記的句子:

Tokenizer_wrd.tokenize(
   'Tutorialspoint.com provides high quality technical tutorials for free.'
)

輸出

[
   'Tutorialspoint.com', 'provides', 'high', 'quality', 
   'technical', 'tutorials', 'for', 'free', '.'
]

完整的實現示例

讓我們看看下面的完整實現示例

import nltk
from nltk.tokenize import TreebankWordTokenizer
tokenizer_wrd = TreebankWordTokenizer()
tokenizer_wrd.tokenize('Tutorialspoint.com provides high quality technical
tutorials for free.')

輸出

[
   'Tutorialspoint.com', 'provides', 'high', 'quality', 
   'technical', 'tutorials','for', 'free', '.'
]

分詞器最重要的約定是分開縮寫。例如,如果我們為此目的使用word_tokenize()模組,它將給出如下輸出:

示例

import nltk
from nltk.tokenize import word_tokenize
word_tokenize('won’t')

輸出

['wo', "n't"]]

TreebankWordTokenizer的這種約定是不可接受的。這就是為什麼我們有兩個替代的單詞分詞器,即PunktWordTokenizerWordPunctTokenizer

WordPunktTokenizer類

一個替代的單詞分詞器,它將所有標點符號分成單獨的標記。讓我們透過以下簡單的示例來了解它:

示例

from nltk.tokenize import WordPunctTokenizer
tokenizer = WordPunctTokenizer()
tokenizer.tokenize(" I can't allow you to go home early")

輸出

['I', 'can', "'", 't', 'allow', 'you', 'to', 'go', 'home', 'early']

將文字分詞為句子

在本節中,我們將把文字/段落分割成句子。NLTK為此提供sent_tokenize模組。

為什麼需要它?

我們腦海中出現的一個顯而易見的問題是,當我們有單詞分詞器時,為什麼我們需要句子分詞器,或者為什麼我們需要將文字分詞為句子。假設我們需要計算句子中的平均單詞數,我們該怎麼做?為了完成這項任務,我們需要句子分詞和單詞分詞。

讓我們透過以下簡單的示例來了解句子分詞器和單詞分詞器之間的區別:

示例

import nltk
from nltk.tokenize import sent_tokenize
text = "Let us understand the difference between sentence & word tokenizer. 
It is going to be a simple example."
sent_tokenize(text)

輸出

[
   "Let us understand the difference between sentence & word tokenizer.", 
   'It is going to be a simple example.'
]

使用正則表示式的句子分詞

如果您覺得單詞分詞器的輸出不可接受,並且想要完全控制如何分詞文字,我們可以使用正則表示式在進行句子分詞時使用。NLTK提供RegexpTokenizer類來實現這一點。

讓我們透過以下兩個示例來了解這個概念。

在第一個示例中,我們將使用正則表示式匹配字母數字標記加上單引號,這樣我們就不會分割像“won’t”這樣的縮寫。

示例1

import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer("[\w']+")
tokenizer.tokenize("won't is a contraction.")
tokenizer.tokenize("can't is a contraction.")

輸出

["won't", 'is', 'a', 'contraction']
["can't", 'is', 'a', 'contraction']

在第一個示例中,我們將使用正則表示式在空格處進行分詞。

示例2

import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer('/s+' , gaps = True)
tokenizer.tokenize("won't is a contraction.")

輸出

["won't", 'is', 'a', 'contraction']

從上面的輸出中,我們可以看到標點符號保留在標記中。引數gaps = True表示該模式將識別要分詞的間隙。另一方面,如果我們使用gaps = False引數,則該模式將用於識別標記,這可以在以下示例中看到:

import nltk
from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer('/s+' , gaps = False)
tokenizer.tokenize("won't is a contraction.")

輸出

[ ]

它將給我們一個空白輸出。

廣告
© . All rights reserved.