Привет, я написал код ниже, чтобы выполнить анализ настроений:
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'
Как это исправить?
У вас есть файл, открытый в двоичном режиме. Когда он читается, он возвращает 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