TypeError: требуется байтовоподобный объект, а не 'str' с pd.read_csv - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь код с этого сайта: https://datanice.wordpress.com/2015/09/09/sentiment-analysis-for-youtube-channels-with-nltk/

Код с ошибкой:

import nltk
from nltk.probability import *
from nltk.corpus import stopwords
import pandas as pd

all = pd.read_csv("comments.csv")

stop_eng = stopwords.words('english')
customstopwords =[]

tokens = []
sentences = []
tokenizedSentences =[]
for txt in all.text:
    sentences.append(txt.lower())
    tokenized = [t.lower().encode('utf-8').strip(":,.!?") for t in txt.split()]
    tokens.extend(tokenized)
    tokenizedSentences.append(tokenized)

hashtags = [w for w in tokens if w.startswith('#')]
ghashtags = [w for w in tokens if w.startswith('+')]
mentions = [w for w in tokens if w.startswith('@')]
links = [w for w in tokens if w.startswith('http') or w.startswith('www')]
filtered_tokens = [w for w in tokens if not w in stop_eng and not w in customstopwords and w.isalpha() and not len(w)<3 and not w in hashtags and not w in ghashtags and not w in links and not w in mentions]

fd = FreqDist(filtered_tokens)

Это дает мне ошибку:

tokenized = [t.lower().encode('utf-8').strip(":,.!?") for t in txt.split()]
TypeError: a bytes-like object is required, not 'str'

Я получаю CSV с этим кодом:

commentDataCsv = pd.DataFrame.from_dict(callFunction).to_csv("comments4.csv", encoding='utf-8')

Я заменил все pd.read_json("comments.csv") на read_csv.

1 Ответ

0 голосов
/ 22 апреля 2019

В Py3 тип строки по умолчанию - Юникод.encode преобразует его в строку байтов.Чтобы применить strip к строке байтов, вам необходимо указать соответствующий символ:

In [378]: u'one'.encode('utf-8')                                                     
Out[378]: b'one'
In [379]: 'one'.encode('utf-8').strip(':')                                           
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-379-98728e474af8> in <module>
----> 1 'one'.encode('utf-8').strip(':')

TypeError: a bytes-like object is required, not 'str'

In [381]: 'one:'.encode('utf-8').strip(b':')                                         
Out[381]: b'one'

Если вы не кодируете в первую очередь, вы можете использовать символы Юникода по умолчанию

In [382]: 'one:'.strip(':')                                                          
Out[382]: 'one'

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

...