Étiquetage POS-NLTK pense que le nom est un adjectif

dans le code suivant, pourquoi nltk pense que "fish" est un adjectif et non un nom?

>>> import nltk
>>> s = "a woman needs a man like a fish needs a bicycle"
>>> nltk.pos_tag(s.split())
[('a', 'DT'), ('woman', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('man', 'NN'), ('like', 'IN'), ('a', 'DT'), ('fish', 'JJ'), ('needs', 'NNS'), ('a', 'DT'), ('bicycle', 'NN')]
4
demandé sur waigani 2012-11-23 17:18:16

5 réponses

Je ne suis pas sûr de ce qui est la solution, mais vous pouvez vérifier la source ici https://nltk.googlecode.com/svn/trunk/nltk/nltk/tag /

pendant ce temps j'ai essayé votre phrase avec une approche un peu différente.

>>> s = "a woman needs a man. A fish needs a bicycle"
>>> nltk.pos_tag(s.split())
[('a', 'DT'), ('woman', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('man.', NP'), ('A','NNP'),   ('fish', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('bicycle', 'NN')]

, ce qui a donné au poisson le nom"NN".

4
répondu Chandan Gupta 2012-12-12 09:27:04

si vous avez utilisé un marqueur de recherche tel que décrit dans le NLTK book, Chapitre 5 (par exemple en utilisant WordNet comme référence de recherche) d'abord, votre marqueur" sait "déjà que poisson ne peut pas être un adjectif. Pour tous les mots avec plusieurs Tags POS possibles, vous pouvez alors utiliser un tagger statistique comme un tagger de retour.

4
répondu Suzana 2013-01-23 17:43:14

c'est parce que vous voulez a woman needs a man like a fish needs a bicycle pour obtenir des étiquettes POS pour une telle" parse":

[ [[a woman] needs [a man]] like [[a fish] needs [a bicycle]] ]

mais au lieu de cela le NLTK tagger pos par défaut n'est pas assez intelligent et vous a donné l'étiquette POS pour une telle parse:

[ [[a woman] needs [a man]] like [a fish needs] [a bicycle] ]

3
répondu alvas 2013-01-17 10:28:50

cela dépend de la façon dont le POS tagger est entré. Par exemple, pour la phrase: "une femme a besoin d'un homme comme un poisson a besoin d'un vélo"

si vous utilisez le tokenizer NLTK word par défaut et un tokenizer regex, les valeurs seront différentes.

import nltk 
from nltk.tokenize import RegexpTokenizer

TOKENIZER = RegexpTokenizer('(?u)\W+|$[\d\.]+|\S+')

s = "a woman needs a man like a fish needs a bicycle"

regex_tokenize = TOKENIZER.tokenize(s)
default_tokenize = nltk.word_tokenize(s)

regex_tag = nltk.pos_tag(regex_tokenize)
default_tag = nltk.pos_tag(default_tokenize)

print regex_tag
print "\n"
print default_tag

la sortie est la suivante:

  Regex Tokenizer: 

[('a', 'DT'), (' ', 'NN'), ('woman', 'NN'), (' ', ':'), ('needs', 'NNS'), (' ', 'VBP'), ('a', 'DT'), (' ', 'NN'), ('man', 'NN'), (' ', ':'), ('like', 'IN'), (' ', 'NN'), ('a', 'DT'), (' ', 'NN'), ('fish', 'NN'), (' ', ':'), ('needs', 'VBZ'), (' ', ':'), ('a', 'DT'), (' ', 'NN'), ('bicycle', 'NN')]

 Default Tokenizer: 

[('a', 'DT'), ('woman', 'NN'), ('needs', 'VBZ'), ('a', 'DT'), ('man', 'NN'), ('like', 'IN'), ('a', 'DT'), ('fish', 'JJ'), ('needs', 'NNS'), ('a', 'DT'), ('bicycle', 'NN')]

dans Regex Tokenizer fish est un nom alors que dans le tokenizer fish par défaut est un adjectif. Selon le tokenizer utilisé, le parsing diffère résultant en une structure différente de l'arbre d'analyse.

3
répondu Aravind Asok 2014-04-17 09:11:06

si vous utilisez le Stanford POS tagger (3.5.1) alors la phrase est correctement étiquetée:

from nltk.tag.stanford import POSTagger
st = POSTagger("/.../stanford-postagger-full-2015-01-30/models/english-left3words-distsim.tagger",
               "/.../stanford-postagger-full-2015-01-30/stanford-postagger.jar")
st.tag("a woman needs a man like a fish needs a bicycle".split())

donne:

[('a', 'DT'),
 ('woman', 'NN'),
 ('needs', 'VBZ'),
 ('a', 'DT'),
 ('man', 'NN'),
 ('like', 'IN'),
 ('a', 'DT'),
 ('fish', 'NN'),
 ('needs', 'VBZ'),
 ('a', 'DT'),
 ('bicycle', 'NN')]
2
répondu Raffael 2015-03-16 23:37:46