人工智慧:python 實現 第十章,NLP 第二天 基於詞義的詞形還原
基於詞義的詞形還原
lemmatization 是另一種詞形還原的方式。 在前一節中,我們可以明白從詞幹中提取詞的基本形式沒有任何意義。例如,三個三個詞幹提取器都顯示calves的基本形式是calv,但它並不是一個真正的單詞。Lemmatization 採取了一種更具結構化的方法解決了這個問題。
lemmatizatio原理是使用語法和詞態分析器進行單詞分析,它包含了去除了如ing和ed等字尾的單詞基本形式,所有基本的形式的單詞集合被稱作為字典。如果你使用lemmatization對calves進行詞形還原,將輸出calf。值得注意的是單詞基本形式的輸出依賴於該詞是動詞還是名詞。下面讓我們看看如何使用NLTK
建立 一個姓的python 檔案 並且匯入 下列包:
from nltk.stem import WordNetLemmatizer
定義輸入單詞。我們將使用先前使用的單詞集以便我們能夠比較輸出結果
input_words =['writing','calves','be',branded','horse','randomize','possibly','provision',hospital,‘hospital','kept','scratchy','code']
建立一個lemmatizer物件
#建立物件
lemmatizer = WordNetLemmatizer()
為顯示列表建立名字和格式
#建立顯示列表名字
lemmatizer_names =['noun Lemmatizer','verb lemmatizer']
formatted_text = '{:>24}'*(len(lemmatizer_names)+1)
print('\n',formatted_text.format('INPUT WORD'),*lemmatizer_names,'\n','='*75)
輸入單詞集並使用動詞和名詞詞形還原器還原單詞:
#對每一個單詞進行還原並輸出
for word in input_words:
output =[word,lemmatizer.lemmatize(word,pos='n'),lemmatizer.lemmatize(word,pos='v')]
print(formatted_text.format(*output))
完整程式碼如下
from nltk.stem import WordNetLemmatizer
input_words = ['writing', 'calves', 'be', 'branded', 'horse', 'randomize',
'possibly', 'provision', 'hospital', 'kept', 'scratchy', 'code']
# 建立 lemmatizer物件
lemmatizer = WordNetLemmatizer()
# 建立輸出表格格式
lemmatizer_names = ['NOUN LEMMATIZER', 'VERB LEMMATIZER']
formatted_text = '{:>24}' * (len(lemmatizer_names) + 1)
print('\n', formatted_text.format('INPUT WORD', *lemmatizer_names),
'\n', '='*75)
#對輸入的單詞進行還原並輸出
for word in input_words:
output = [word, lemmatizer.lemmatize(word, pos='n'),lemmatizer.lemmatize(word, pos='v')]
print(formatted_text.format(*output))
執行結果:
我們能看到,當遇到形如writing或者calves 這些單詞時,名詞還原器和動詞還原器分詞結果是不一樣的 。如果將這些輸出與之前的stemmer 的輸出結果相比,這兩者的結果也有不同。基於字典的分詞方式比基於規則的方式是更準確的還原單詞,更加有意義。