Ошибка VaderSentiment: TypeError: требуется байтоподобный объект, а не 'str'

1

Привет, я написал код ниже, чтобы выполнить анализ настроений:

from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer

import time
analyzer = SentimentIntensityAnalyzer()

pos_count = 0
pos_correct = 0

with open('EVG_text mining.txt', mode='rb') as f: 
    bytes = f.read()
    text = bytes.decode('utf-8', 'ignore') 
    for line in f.read().split('\n'):
        vs = analyzer.polarity_scores(line)
        if not vs['neg'] > 0.1:
            if vs['pos']-vs['neg'] > 0:
                pos_correct += 1
            pos_count +=1


neg_count = 0
neg_correct = 0

with open('EVG_text mining.txt', mode='rb') as f: 
    for line in f.read().split('\n'):
        vs = analyzer.polarity_scores(line)
        if not vs['pos'] > 0.1:
            if vs['pos']-vs['neg'] <= 0:
                neg_correct += 1
            neg_count +=1

print("Positive accuracy = {}% via {} samples".format(pos_correct/pos_count*100.0, pos_count))
print("Negative accuracy = {}% via {} samples".format(neg_correct/neg_count*100.0, neg_count))

Однако, я получаю сообщение об ошибке:

Traceback (most recent call last):
  File "<ipython-input-9-62462b5174b4>", line 12, in <module>
    for line in f.read().split('\n'):
TypeError: a bytes-like object is required, not 'str'

Как это исправить?

  • 0
    Из документа python: « Файлы, открытые в двоичном режиме (включая« b »в аргументе mode), возвращают содержимое в виде байтовых объектов без какого-либо декодирования ». Почему вы используете бинарный режим?
Теги:
sentiment-analysis
vader

1 ответ

0

У вас есть файл, открытый в двоичном режиме. Когда он читается, он возвращает bytes, а не str.

Эта строка:

bytes = f.read()

Будет прочитан весь файл переменной, которую вы назвали bytes (не делайте этого, у python уже есть функция с именем bytes и с помощью этого имени вы "затеняете" встроенную функцию).

Затем вы можете декодировать байты:

text = bytes.decode('utf-8', 'ignore') 

Но потом вы снова читаете файл!

for line in f.read().split('\n'):

Поскольку файл уже был прочитан, он возвращает пустую байтовую строку (b''), а вызов .split() приведет к ошибке, которую вы видите.

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

with open('EVG_text mining.txt', encoding='utf-8') as f: 
    for line in f: # lines come already decoded
  • 0
    Я прошу прощения. Не понимаю. Вы имеете в виду, что я должен просто закомментировать байты = f.read () и text = bytes.decode ('utf-8', 'ignore')? Я попробовал это, и это все еще дает ту же ошибку.
  • 0
    Как вы получите ту же ошибку, если убрана строка с ошибкой? По крайней мере строка с ошибкой должна измениться! Пожалуйста, отредактируйте вопрос и добавьте полную трассировку ошибок, снова показывая строку с ошибкой @JoeyTribhuvan
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню