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

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

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'

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

1 ответ

У вас есть файл, открытый в двоичном режиме. Когда читаешь возвращай 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
Другие вопросы по тегам