Токенайзер предложений 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. Вы должны ошибаться, если он успешно работает, когда вы токенизировали литеральную строку. Конечно, были и другие различия между кодом, который работал, и кодом в вашем вопросе.

Другие вопросы по тегам