Токенайзер предложений nltk дает AttributeError
Я очень новичок в Python и NLTK. Одна проблема сбивает меня с толку:
Когда я делаю
tokenized = custom_sent_tokenizer.tokenize("some long text")
Это дает мне идеальный результат. Но когда я изменяю эту жестко закодированную строку на переменную, содержащую огромный текст, это дает мне ошибку, упомянутую в теме, а именно:
tokenized = custom_sent_tokenizer.tokenize(text)
...
AttributeError: 'list' object has no attribute 'abbrev_types'
Ниже мой полный код:
from __future__ import division
import urllib.request
import csv
import nltk
from string import punctuation
from nltk.corpus import stopwords
from nltk.tokenize import PunktSentenceTokenizer
comments = open("CNPS_Comments.txt").read()
comments_list = comments.split('\n')
custom_sent_tokenizer = PunktSentenceTokenizer(comments_list[:300])
##tokenized = custom_sent_tokenizer.tokenize("some long text")
text=""
for comment in comments_list:
text += comment
tokenized = custom_sent_tokenizer.tokenize(text)
def process_content():
try:
for i in tokenized[:5]:
words = nltk.word_tokenize(i)
tagged = nltk.pos_tag(words)
print(tagged)
except Exception as e:
print(str(e))
process_content()
Я начал с Python сегодня, и может быть много вещей, которые я не делаю здесь эффективно.
1 ответ
Строка, которая доставляет вам неприятности, верна: вот как вы должны использовать токенизатор предложений с единственной строкой в качестве аргумента. Вы получаете ошибку, потому что создали монстра:-)
Токенизатор предложений Punkt основан на неконтролируемом алгоритме: вы даете ему длинный текст, и он выясняет, где должны лежать границы предложения. Но вы обучили свой токенизатор списку предложений (первые 300 элементов в comments_list
), что неверно. Каким-то образом токенизатор не замечает и выдает ошибку, когда вы пытаетесь использовать его правильно.
Чтобы решить проблему, тренируйте ваш токенизатор одной строкой. Вы можете лучше всего объединить список строк в одну из них:
tokenizer = PunktSentenceTokenizer(" ".join(comments_list[:300]))
PS. Вы должны ошибаться, если он успешно работает, когда вы токенизировали литеральную строку. Конечно, были и другие различия между кодом, который работал, и кодом в вашем вопросе.