2015-02-13 4 views
0

Наличие некоторых проблем. Я занимаюсь TwitterSentimentAnalysis в наборе данных длиной 1,6 миллиона. Поскольку мой компьютер не мог выполнить работу (из-за большого количества вычислений), профессор сказал мне использовать университетский сервер.UnicodeDecodeError на Python 2.7

Я просто понял, что на сервере версия python равна 2,7, что не позволяет мне использовать параметр encoding в csv reader для чтения файла.

В любое время, когда я получил UnicodeDecodeError, мне нужно вручную удалить твитер из набора данных, иначе я не смогу сделать все остальное. Я попытался решить весь вопрос на сайте, но я ничего не решил.

Я просто хочу пропустить линию, которая вызывает ошибку, поскольку набор достаточно велик, чтобы дать мне хороший анализ.

class UTF8Recoder: 
    def __init__(self, f, encoding): 
     self.reader = codecs.getreader(encoding)(f) 
    def __iter__(self): 
     return self 
    def next(self): 
     return self.reader.next().encode("utf-8", errors='ignore') 

class UnicodeReader: 
    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 
     f = UTF8Recoder(f, encoding) 
     self.reader = csv.reader(f, dialect=dialect, **kwds) 
    def next(self): 
     '''next() -> unicode 
     This function reads and returns the next line as a Unicode string. 
     ''' 
     row = self.reader.next() 
     return [unicode(s, "utf-8", errors='replace') for s in row] 
    def __iter__(self): 
     return self 

def extraction(file, textCol, sentimentCol): 
    "The function reads the tweets" 
    #fp = open(file, "r",encoding="utf8") 
    fp = open(file, "r") 
    tweetreader = UnicodeReader(fp) 
    #tweetreader = csv.reader(fp, delimiter=',', quotechar='"', escapechar='\\') 
    tweets = [] 
    for row in tweetreader: 
     # It takes the column in which the tweets and the sentiment are 
     if row[sentimentCol]=='positive' or row[sentimentCol]=='4': 
      tweets.append([remove_stopwords(row[textCol]), 'positive']); 
     else: 
      if row[sentimentCol]=='negative' or row[sentimentCol]=='0': 
       tweets.append([remove_stopwords(row[textCol]), 'negative']); 
      else: 
       if row[sentimentCol]=='irrilevant' or row[sentimentCol]=='2' or row[sentimentCol]=='neutral': 
        tweets.append([remove_stopwords(row[textCol]), 'neutral']); 

    tweets = filterWords(tweets) 
    fp.close() 
    return tweets; 

Ошибка:

Traceback (most recent call last): 
    File "sentimentAnalysis_v4.py", line 165, in <module> 
    newTweets = extraction("sentiment2.csv",5,0) 
    File "sentimentAnalysis_v4.py", line 47, in extraction 
    for row in tweetreader: 
    File "sentimentAnalysis_v4.py", line 29, in next 
    row = self.reader.next() 
    File "sentimentAnalysis_v4.py", line 19, in next 
    return self.reader.next().encode("utf-8", errors='ignore') 
    File "/usr/lib/python2.7/codecs.py", line 615, in next 
    line = self.readline() 
    File "/usr/lib/python2.7/codecs.py", line 530, in readline 
    data = self.read(readsize, firstline=True) 
    File "/usr/lib/python2.7/codecs.py", line 477, in read 
    newchars, decodedbytes = self.decode(data, self.errors) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd9 in position 48: invalid continuation byte 
+0

Вы на 100% уверены, что данные кодируются как UTF-8? –

+0

Hrm, трассировка, которую вы показываете, показывает, что 'codecs.getreader (encoding) (f)' возвратил объект, который не возвращает 'unicode', когда вы вызываете' next' на нем. –

+0

@MartijnPieters, если это не так, должно ли оно читать другие твиты? Твиты, которые я должен удалить вручную, имеют тип «à €€» и такие странные вещи. – JackLametta

ответ

1

Если у вас есть ввод данных, которые уродливы, я бы не использовать codecs здесь, чтобы сделать чтение.

Используйте новее io.open() function и укажите стратегический порядок обработки ошибок; 'replace' должны сделать:

class ForgivingUTF8Recoder: 
    def __init__(self, filename, encoding): 
     self.reader = io.open(f, newline='', encoding=encoding, errors='replace') 
    def __iter__(self): 
     return self 
    def next(self): 
     return self.reader.next().encode("utf-8", errors='ignore') 

Я установил newline обработку для '', чтобы убедиться, что модуль CSV получает правильно обрабатывать переводы строк в значениях.

Вместо передачи в открытом файле, просто передать имя файла:

tweetreader = UnicodeReader(file) 

Это не позволит вам пропустить дефектные линии, вместо этого он будет обрабатывать ошибочные строки, заменяя символы, которые не могут быть расшифрованы с U+FFFD REPLACEMENT CHARACTER; вы все равно можете искать тех, кто находится в ваших столбцах, если вы хотите пропустить всю строку.

+0

похоже работа ^^ – JackLametta

Смежные вопросы