Ошибка 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