だから私は次のようにリスト内の一連の単語にタグを付けようとしました(正確にはPOSタグ付け):
pos = [nltk.pos_tag(i,tagset='universal') for i in lw]
ここで、lw
は単語のリストです(非常に長いか、投稿したはずですが、[['hello'],['world']]
(別名リストのリストで、各リストに1つのWordが含まれています)が、実行すると、次のようになります。
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
誰かが私にこのエラーが発生する理由と方法、およびそれを修正する方法を教えてもらえますか?どうもありがとう。
まず、人間が読める変数名を使用します。これは=)に役立ちます
次に、pos_tag
入力は文字列のリストです。っていうことは
>>> 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')]]
また、入力が生の文字列の場合は、Word_tokenize
の前にpos_tag
を使用できます。
>>> 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')]]
そして、段落に文があれば、sent_tokenize
を使用して文を分割できます。
>>> 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'), ('.', '.')]]
Posタグでドキュメントを解析する一般的な関数、
def get_pos(string):
string = nltk.Word_tokenize(string)
pos_string = nltk.pos_tag(string)
return pos_string
get_post(sentence)
お役に立てれば !
入力が生の文字列の場合は、Word_tokenize
の前にpos_tag
を使用できます。
import nltk
is_noun = lambda pos: pos[:2] == 'NN'
lines = 'You can never plan the future by the past'
lines = lines.lower()
tokenized = nltk.Word_tokenize(lines)
nouns = [Word for (Word, pos) in nltk.pos_tag(tokenized) if is_noun(pos)]
print(nouns) # ['future', 'past']