Сложность с analyzer.py, возвращает KeyError: ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; \ п"

Вот как выглядит мой код:

import nltk

class Analyzer():

    def __init__(self, positives, negatives):
        self.positives = set()
        self.negatives = set()

        file = open(positives, "r")
        for line in file:
            self.positives.add(line.strip("\n"))
            if line.startswith(";"):
                self.positives.remove(line)
        file.close()

        file1 = open(negatives, "r")
        for line in file1:
            self.negatives.add(line.strip("\n"))
            if line.startswith(";"):
                self.negatives.remove(line)
        file1.close()

    def analyze(self, text):
        with open("text") as texts:
            for lines in texts:
                # Get a list of words from the lines in text.
                tokens = [self.tokenizer.tokenize(lines)]
                # All the words in postive-words and negative-words are lowercased.
                if tokens.lower() in self.positives:
                    return 1
                elif tokens.lower() in self.negatives:
                    return -1
                else:
                    return 0

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

Traceback (most recent call last):
  File "./smile", line 32, in <module>
    main()
  File "./smile", line 20, in main
    analyzer = Analyzer(positives, negatives)
  File "/home/ubuntu/workspace/pset6/sentiments/analyzer.py", line 13, in __init__
    self.positives.remove(line)
KeyError: ';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n'

Могу ли я получить подсказку о том, что я делаю неправильно? Буду очень признателен за некоторые советы! Спасибо!

1 ответ

Решение

Проблема в том, что вы пытаетесь удалить элемент из набора, которого нет. Вы добавляете line.strip("\n") к набору, но затем пытается удалить line из того же набора. Чтобы убедиться, что вы всегда удаляете что-то, действительно присутствующее в наборе, вы можете сделать что-то вроде следующего:

entry = line.strip("\n")
self.positives.add(entry)
if line.startswith(";"):
    self.positives.remove(entry)

В приведенном выше коде вы никогда не можете случайно попытаться удалить то, что не присутствует в словаре. Вам придется внести аналогичные изменения при работе с self.negatives также, но это не должно быть слишком сложно.

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

if not line.startswith(";"):
  self.positives.add(line.strip("\n"))
Другие вопросы по тегам