it-swarm.com.de

Wie benutze ich pos_tag in NLTK?

Also habe ich versucht, eine Reihe von Wörtern in einer Liste zu markieren (genauer gesagt POS-Kennzeichnung):

pos = [nltk.pos_tag(i,tagset='universal') for i in lw]

wo lw eine Liste von Wörtern ist (es ist wirklich lang oder ich hätte es gepostet, aber es ist wie [['hello'],['world']] (aka eine Liste von Listen, in denen jede Liste ein Wort enthält), aber wenn ich versuche, es auszuführen, erhalte ich:

Traceback (most recent call last):
  File "<pyshell#183>", line 1, in <module>
    pos = [nltk.pos_tag(i,tagset='universal') for i in lw]
  File "<pyshell#183>", line 1, in <listcomp>
    pos = [nltk.pos_tag(i,tagset='universal') for i in lw]
  File "C:\Users\my system\AppData\Local\Programs\Python\Python35\lib\site-packages\nltk\tag\__init__.py", line 134, in pos_tag
    return _pos_tag(tokens, tagset, tagger)
  File "C:\Users\my system\AppData\Local\Programs\Python\Python35\lib\site-packages\nltk\tag\__init__.py", line 102, in _pos_tag
    tagged_tokens = tagger.tag(tokens)
  File "C:\Users\my system\AppData\Local\Programs\Python\Python35\lib\site-packages\nltk\tag\perceptron.py", line 152, in tag
    context = self.START + [self.normalize(w) for w in tokens] + self.END
  File "C:\Users\my system\AppData\Local\Programs\Python\Python35\lib\site-packages\nltk\tag\perceptron.py", line 152, in <listcomp>
    context = self.START + [self.normalize(w) for w in tokens] + self.END
  File "C:\Users\my system\AppData\Local\Programs\Python\Python35\lib\site-packages\nltk\tag\perceptron.py", line 240, in normalize
    Elif Word[0].isdigit():
IndexError: string index out of range

Kann mir jemand sagen, warum und wie ich diesen Fehler erhalte und wie ich ihn beheben kann? Danke vielmals.

3

Erstens, verwenden Sie lesbare Variablennamen, es hilft =)

Als nächstes ist pos_tag Eingabe eine Liste von Zeichenfolgen. So ist es

>>> from nltk import pos_tag
>>> sentences = [ ['hello', 'world'], ['good', 'morning'] ]
>>> [pos_tag(sent) for sent in sentences]
[[('hello', 'NN'), ('world', 'NN')], [('good', 'JJ'), ('morning', 'NN')]]

Wenn Sie die Eingabe als unformatierte Zeichenfolgen haben, können Sie Word_tokenize vor pos_tag verwenden:

>>> from nltk import pos_tag, Word_tokenize
>>> a_sentence = 'hello world'
>>> Word_tokenize(a_sentence)
['hello', 'world']
>>> pos_tag(Word_tokenize(a_sentence))
[('hello', 'NN'), ('world', 'NN')]

>>> two_sentences = ['hello world', 'good morning']
>>> [Word_tokenize(sent) for sent in two_sentences]
[['hello', 'world'], ['good', 'morning']]
>>> [pos_tag(Word_tokenize(sent)) for sent in two_sentences]
[[('hello', 'NN'), ('world', 'NN')], [('good', 'JJ'), ('morning', 'NN')]]

Und Sie haben die Sätze in einem Absatz. Mit sent_tokenize können Sie den Satz aufteilen.

>>> from nltk import sent_tokenize, Word_tokenize, pos_tag
>>> text = "Hello world. Good morning."
>>> sent_tokenize(text)
['Hello world.', 'Good morning.']
>>> [Word_tokenize(sent) for sent in sent_tokenize(text)]
[['Hello', 'world', '.'], ['Good', 'morning', '.']]
>>> [pos_tag(Word_tokenize(sent)) for sent in sent_tokenize(text)]
[[('Hello', 'NNP'), ('world', 'NN'), ('.', '.')], [('Good', 'JJ'), ('morning', 'NN'), ('.', '.')]]

Siehe auch: Wie wird das POS-Tagging mit dem NLTK-POS-Tagger in Python durchgeführt?

5
alvas

Eine übliche Funktion zum Parsen eines Dokuments mit pos-Tags. 

def get_pos(string):
    string = nltk.Word_tokenize(string)
    pos_string = nltk.pos_tag(string)
    return pos_string

get_post(sentence)

Hoffe das hilft !

0
Vivek Ananthan