2012-02-23 7 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) 

べきではありません'結合する'には動詞のようなタグが付けられますか?これはnltkの欠陥ですか?または私は何か間違っているのですか?

+0

上記のコードを生成するために現在使用しているコードを表示できますか? –

+0

ちょうどコードを追加しました – mdogg

+2

私はnltkについて何も知らないが、珍しい偶然で今年はNFLスカウト・コンバインがインディアナポリスで開催されていて、名詞として「結合」が使われています。 – DSM

答えて

10

あなたが見ているのは、伝統的な統計自然言語処理(NLP)の非常に一般的な問題です。要するに、あなたがタガーを使用しているデータは、訓練されたデータのようには見えません。 NLTKには詳細は書かれていませんが、私が知っている限り、デフォルトのタガーはWall Street Journalの記事、Brown Corpus、またはその2つの組み合わせで訓練されています。これらのコーパスには非常に少ない命令が含まれています。したがって、命令にデータを渡すと正しいことはありません。

大規模なレシピコーパスのタグを修正し、修正されたデータを訓練することで、訓練データとテストデータの不一致の問題を解決できます。しかし、これは膨大な量の作業です。理想的には、多くの命令を持つコーパスが既に存在するでしょう。私の研究グループはこれを検討してきましたが、適切なものを見つけられませんでした。

最近のプロジェクトでは、命令を正しく理解することが必要な非常に簡単な解決策は、命令が何を望んでいるのかを簡単にメモし、それらの単語のタグを正確にすることです。

以下の例では、「結合」を動詞として扱い、その後リストの理解度を使用してタグを変更するという辞書を作成しました。

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

+1

タグは一般に、タグ間の位置情報(すなわち、名詞は 'the'のような決定子に従う)と、各単語が取ることができるタグに関する情報(すなわち、どのくらいの頻度で動詞または名詞)。この場合、訓練データの文章はほとんど動詞で始まらないので、主に位置情報です。これは問題です。 – Constantine

+0

ドイツ語のテキストをMatePosTaggerで分析すると、同じ問題が発生します。 –

1

「結合」という名詞のマップは、それが名詞だと思うかもしれないからかもしれません。コンバインハーベスターなど。私の推測では、あなたのユースケースの名詞アルゴリズムを調整するか、単語コーパスを変更/変更する必要があります。

+0

どうやってそれをやりますか?私はそれがNLTKになると完全なnoobだ – mdogg

+0

私は両方を持っている2つの素晴らしいnltkのPythonの本。これが大事なことになるなら、あなたはそれらを笑ってください。それ以外の場合は、奨励金を上げ、私はあなたのための例をコード化するかもしれません。 –

+0

あなたが正しいと思うなら、私の答えを投票してください。 –

3

命令型コーパスでのトレーニングが最適です。しかし、時間がない、あるいは努力がそれに値すると思っていないならば、ここでは簡単な解決法(より多くのハック)があります:すべての文の前に 'they'のような代名詞を入れてください)。今すぐ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タガーをどうやって交換しますか? –

関連する問題