2012-02-23 42 views
12

我在食譜上使用pos_tagger。我遇到的一個問題是,pos_tagger返回命令式中的單詞是名詞,它們不應該是動詞嗎? 例如:NLTK認爲命令是名詞

隨着輸入:

combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder 

輸出是:

[('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',',  ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')] 

下面是我使用此代碼:

def part_of_speech(self,input_sentance): 
     text = nltk.word_tokenize(input_sentance) 
     return nltk.pos_tag(text) 

不應該'combine'被標記爲某種動詞?這是nltk的錯嗎?或者我做錯了什麼?

+0

你能告訴我們你目前使用什麼代碼來生成上述代碼。 – 2012-02-23 02:42:33

+0

yep剛添加了代碼 – mdogg 2012-02-23 04:42:01

+2

儘管我對nltk一無所知,但在一次不尋常的巧合中,本週NFL球探聯合會正在印第安納波利斯舉行,其中「combine」被用作名詞。 – DSM 2012-02-23 04:56:31

回答

10

您所看到的是傳統統計自然語言處理(NLP)中的一個非常常見的問題。簡而言之,您使用標記器的數據看起來不像它所訓練的數據。 NLTK沒有記錄詳細信息,但據我所知,默認標記器是在華爾街日報文章,布朗語料庫或兩者的某種組合上進行培訓的。這些語料庫包含的命令很少,所以當您將命令賦予其數據時,它不會做正確的事情。

一個好的長期解決方案是糾正大量食譜的標籤,並在糾正的數據上訓練,這樣可以解決培訓和測試數據之間不匹配的問題。然而,這是一項大量的工作。理想情況下,一個有很多必要條件的語料庫已經存在;我的研究小組已經研究過這個問題,但我們還沒有找到合適的,儘管我們正在製作一個。

我在最近的一個項目中使用的一個簡單得多的解決方案,要求必須正確理解命令,就是簡單地記下所需的命令,並強制這些單詞的標籤正確。

所以在下面的例子中,我做了一個詞典,說「combine」應該被當作動詞,然後用列表理解來改變標籤。

tagged_words = [('combine', 'NN'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')] 
force_tags = {'combine': 'VB'} 
new_tagged_words = [(word, force_tags.get(word, tag)) for word, tag in tagged_words] 

new_tagged_words的內容現在有原來的標籤,除了改變只要有在force_tags的條目。

>>> new_tagged_words 
[('combine', 'VB'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('flour', 'VBD')] 

這個解決方案確實需要你說出你想要強加給動詞的單詞是什麼。這遠非理想,但沒有更好的通用解決方案。

+0

我明白了。那麼這是否意味着POS只是一個字符串匹配?還是我簡化了它? – mdogg 2012-03-07 08:09:16

+1

Taggers通常會考慮至少兩種信息:標籤之間的位置信息(即,名詞跟隨「the」這樣的確定符),以及關於每個單詞可能採用的標籤的信息(即,'steer'多少次是動詞或名詞)。在這種情況下,主要是位置信息是問題,因爲在訓練數據句子中幾乎從不以動詞開始。 – Constantine 2012-03-08 11:56:27

+0

有關信息,我使用MatePosTagger分析德語文本時遇到同樣的問題。 – 2018-01-23 07:45:31

1

與名詞映射的「組合」可能是由於它認爲它是一個名詞。以聯合收割機爲例。我的猜測是你應該調整你的用例的名詞算法或者更改/修改單詞語料庫。

+0

你如何去做呢?我是一個完全noob當談到NLTK – mdogg 2012-02-23 02:22:27

+0

有兩個偉大的nltk Python書我都有。如果這將是一件大事,你讓他們大聲笑。否則,提高你的賞金,我可能會爲你編寫一個例子。 – 2012-02-23 02:25:53

+0

也請投票我的答案,如果你認爲它是正確的。 – 2012-02-23 02:27:10

3

關於命令語料庫的培訓將是最佳選擇。但是,如果你沒有時間或者不認爲這種努力是值得的,這裏是一個簡單的解決方案(更多的是黑客):只要在每句話之前加一個「他們」這樣的代名詞(你肯定是勢在必行) )。現在nltk在默認標記器上做的很好。

0
>>> from nltk import pos_tag, word_tokenize 
>>> def imperative_pos_tag(sent): 
...  return pos_tag(['He']+sent)[1:] 
... 
>>> sent1 = 'combine 1 1/2 cups floud, 3/4 cup sugar, salt and baking powder' 

>>> imperative_pos_tag(word_tokenize(sent1)) 
[('combine', 'VBD'), ('1', 'CD'), ('1/2', 'CD'), ('cups', 'NNS'), ('floud', 'VBD'), (',', ','), ('3/4', 'CD'), ('cup', 'NN'), ('sugar', 'NN'), (',', ','), ('salt', 'NN'), ('and', 'CC'), ('baking', 'VBG'), ('powder', 'NN')] 

而且,看看Python NLTK pos_tag not returning the correct part-of-speech tagNLTK identifies verb as Noun in Imperatives

1

嘗試Stanford POS tagger

我已經有了更好的運氣。與默認的NLTK標記器相比,它已經被訓練了更多的命令性句子。

也碼頭在cuzzo/stanford-pos-tagger

例如

Follow us on Instagram 
VB PRP IN NN 
+0

你如何替換斯坦福大學的NLTK標記器? – 2017-10-01 15:04:34