Цикл Python NLTK классификатор через список твитов - PullRequest
0 голосов
/ 29 октября 2019

Я обучил классификатор NaiveBaynes, используя корпус twitter_sample. Мне удалось протестировать классификатор на одном твите, чтобы убедиться, что он работает. Тем не менее, я пытаюсь перебрать классификатор по списку из ~ 4000 твитов и получаю AttributeError в моем коде:

test_sample = []
for (words, sentiment) in test_tweets:
     words_filtered = [t.lower() for t in words.split() if len(t) >= 3]
     sentiment = classifier.classify(extract_features(words.split()))
     test_sample.append(words_filtered, sentiment)

AttributeError: 'list' object has not attribute 'split'

test_tweets - это список твитов, которые имеют такую ​​структуру:

('blah tweety blah', 'tbd')

Я выполняю анализ настроений в твитах, и классификатор выдает результат pos или neg для каждого твита, который выдает следующий результат:

('blah tweety blah', 'pos')

Может кто-нибудь сказать мне, что не так с моей петлей?

1 Ответ

0 голосов
/ 29 октября 2019

Эта ошибка атрибута означает, что вы пытаетесь разделить список - поэтому у test_tweets не тот формат, который, как вы думаете, есть. Должен быть список, в котором вы ожидаете строку.

В качестве шага устранения неполадок вы можете временно изменить цикл, чтобы найти слова, являющиеся списками вместо строки:

test_sample = []
for (words, sentiment) in test_tweets:
    if type(words) is list:
        print('This is a list, not a string ', end='') 
        print(words)
     # words_filtered = [t.lower() for t in words.split() if len(t) >= 3]
     # sentiment = classifier.classify(extract_features(words.split()))
     # test_sample.append(words_filtered, sentiment)

ТогдаКак только вы определите, какие слова являются списками, у вас есть несколько вариантов. Вы можете использовать тот же оператор if, чтобы пропустить этот набор данных или очистить его.

test_sample = []
for (words, sentiment) in test_tweets:
    if type(words) is list:
        words_filtered = [t.lower() for t in words if len(t) >= 3] # just skip the split method
        sentiment = classifier.classify(extract_features(words))
        # continue  if you want to skip over lists, you can use continue to go to the next iteration of the loop
    else:
        words_filtered = [t.lower() for t in words.split() if len(t) >= 3]
        sentiment = classifier.classify(extract_features(words.split()))
    test_sample.append(words_filtered, sentiment)
...