Ошибка значения NP-chunker (Python nltk)

Я создаю конвейер NLP на основе книги Python NLTK (глава 7). Первый сегмент кодов корректно выполняет предварительную обработку данных, но я не могу запустить его вывод через свой NP-чанкер:

import nltk, re, pprint

#Import Data

data = 'This is a test sentence to check if preprocessing works' 

#Preprocessing

def preprocess(document):
    sentences = nltk.sent_tokenize(document)
    sentences = [nltk.word_tokenize(sent) for sent in sentences] 
    sentences = [nltk.pos_tag(sent) for sent in sentences]
    return(sentences)

tagged = preprocess(data)
print(tagged)

#regular expression-based NP chunker

grammar = "NP: {<DT>?<JJ>*<NN>}"
cp = nltk.RegexpParser(grammar) #chunk parser
chunked = []
for s in tagged:
    chunked.append(cp.parse(tagged))
print(chunked)

Это трассировка, которую я получаю:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\u0084411\AppData\Local\Continuum\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 866, in runfile
    execfile(filename, namespace)
  File "C:\Users\u0084411\AppData\Local\Continuum\Anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)
  File "C:/Users/u0084411/Box Sync/Procesmanager DH/Text Mining/Tools/NLP_pipeline.py", line 24, in <module>
    chunked.append(cp.parse(tagged))
  File "C:\Users\u0084411\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\chunk\regexp.py", line 1202, in parse
    chunk_struct = parser.parse(chunk_struct, trace=trace)
  File "C:\Users\u0084411\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\chunk\regexp.py", line 1017, in parse
    chunkstr = ChunkString(chunk_struct)
  File "C:\Users\u0084411\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\chunk\regexp.py", line 95, in __init__
    tags = [self._tag(tok) for tok in self._pieces]
  File "C:\Users\u0084411\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\chunk\regexp.py", line 95, in <listcomp>
    tags = [self._tag(tok) for tok in self._pieces]
  File "C:\Users\u0084411\AppData\Local\Continuum\Anaconda3\lib\site-packages\nltk\chunk\regexp.py", line 105, in _tag
    raise ValueError('chunk structures must contain tagged '
ValueError: chunk structures must contain tagged tokens or trees
>>> 

В чем здесь моя ошибка? «Тегированный» токенизирован, так почему же программа этого не распознает?

Большое спасибо! Том


person Tom    schedule 10.03.2017    source источник
comment
Я реализовал это, но я получаю ту же трассировку   -  person Tom    schedule 10.03.2017
comment
Ваш tags должен быть кортежем или деревом. См. nltk.org/_modules/nltk/chunk/regexp.html. .   -  person Wiktor Stribiżew    schedule 10.03.2017
comment
Извините за этот простой вопрос, но есть ли способ преобразовать теги в кортеж или дерево?   -  person Tom    schedule 10.03.2017
comment
Когда я конвертирую tagged в кортеж (используя (tuple(tagged)) проблема не исчезает   -  person Tom    schedule 10.03.2017


Ответы (1)


Вы ударите себя по лбу, когда увидите это. Вместо этого

for s in tagged:
    chunked.append(cp.parse(tagged))

должно было быть так:

for s in tagged:
    chunked.append(cp.parse(s))

Вы получали ошибку, потому что передавали не cp.parse() помеченное предложение, а их список.

person alexis    schedule 10.03.2017
comment
ОК, большое спасибо, теперь я получил некоторый результат, но я не совсем уверен, как его интерпретировать: [Tree('S', [('THis', 'NNP'), Tree('NP', [( 'предложение', 'NN')]), ('содержит', 'VBZ'), ('один', 'CD'), Tree('NP', [('существительное', 'NN')]), Дерево('NP', [('фраза', 'NN')])])] - person Tom; 11.03.2017
comment
Я не могу вызвать chunked.draw, чтобы получить визуальное представление; traceback дает мне: AttributeError: объект «список» не имеет атрибута «рисовать» - person Tom; 11.03.2017
comment
Вы печатаете chunked.draw()? Это список (список, который вы определили), деревья внутри него. Попробуйте chunked[0].draw(). - person alexis; 11.03.2017
comment
@ Том, если этот ответ решил вашу проблему, примите его, нажав на большую галочку слева. - person alexis; 15.03.2017