2016-01-14 1 views
2

J'écris un code pour arrêter un tweet, mais j'ai des problèmes avec l'encodage. Quand j'ai essayé d'appliquer le stemmer de porteur il montre l'erreur. Peut-être je ne peux pas tokenize correctement.UnicodeDecodeError: le codec 'utf8' ne peut pas décoder l'octet 0xc3 en position 0: fin inattendue des données

Mon code est le suivant ...

import sys 
import pandas as pd 
import nltk 
import scipy as sp 
from nltk.classify import NaiveBayesClassifier 
from nltk.stem import PorterStemmer 
reload(sys) 
sys.setdefaultencoding('utf8') 


stemmer=nltk.stem.PorterStemmer() 

p_test = pd.read_csv('TestSA.csv') 
train = pd.read_csv('TrainSA.csv') 

def word_feats(words): 
    return dict([(word, True) for word in words]) 

for i in range(len(train)-1): 
    t = [] 
    #train.SentimentText[i] = " ".join(t) 
    for word in nltk.word_tokenize(train.SentimentText[i]): 
     t.append(stemmer.stem(word)) 
    train.SentimentText[i] = ' '.join(t) 

Lorsque je tente de l'exécuter renvoie l'erreur:


UnicodeDecodeError      Traceback (most recent call last) 
<ipython-input-10-5aa856d0307f> in <module>() 
    23  #train.SentimentText[i] = " ".join(t) 
    24  for word in nltk.word_tokenize(train.SentimentText[i]): 
---> 25   t.append(stemmer.stem(word)) 
    26  train.SentimentText[i] = ' '.join(t) 
    27 

/usr/lib/python2.7/site-packages/nltk/stem/porter.pyc in stem(self, word) 
    631  def stem(self, word): 
    632   stem = self.stem_word(word.lower(), 0, len(word) - 1) 
--> 633   return self._adjust_case(word, stem) 
    634 
    635  ## --NLTK-- 

/usr/lib/python2.7/site-packages/nltk/stem/porter.pyc in _adjust_case(self, word, stem) 
    602   for x in range(len(stem)): 
    603    if lower[x] == stem[x]: 
--> 604     ret += word[x] 
    605    else: 
    606     ret += stem[x] 

/usr/lib64/python2.7/encodings/utf_8.pyc in decode(input, errors) 
    14 
    15 def decode(input, errors='strict'): 
---> 16  return codecs.utf_8_decode(input, errors, True) 
    17 
    18 class IncrementalEncoder(codecs.IncrementalEncoder): 

UnicodeDecodeError: 'utf8' codec can't decode byte 0xc3 in position 0: unexpected end of data 

quelqu'un a la moindre idée, wat ne va pas avec mon code .Je suis coincé avec cette erreur. Toutes les suggestions ..?

+0

Utiliser 'python3', voir https://www.youtube.com/watch?v=sgHbC6udIqc – alvas

+0

Copie possible de [UnicodeDecodeError: le codec 'utf8' ne peut pas décoder l'octet 0x9c] (http://stackoverflow.com/questions/12468179/unicodedecodeerror-utf8-codec-cant-décode-byte-0x9c) – alvas

+0

Connexe: http://stackoverflow.com/questions/19699367/unicodedecodeerror-utf-8-codec-cant-decode-byte et http: //stackoverflow.com/questions/12468179/unicodedecodeerror-utf8-codec-cant-decode-byte-0x9c – alvas

Répondre

2

Je pense que la ligne clé est 604, un cadre au-dessus du lieu qui soulève l'erreur:

--> 604     ret += word[x] 

probablement ret est une chaîne Unicode et word est une chaîne d'octets. Et vous ne pouvez pas décoder l'octet UTF-8 par octet, comme cette boucle essaie de le faire.

Le problème est que read_csv renvoie des octets, et vous essayez de faire du traitement de texte sur ces octets. Cela ne fonctionne tout simplement pas, ces octets doivent d'abord être décodés en Unicode. Je pense que vous pouvez utiliser:

pandas.read_csv(filename, encoding='utf-8') 

Si possible, utilisez Python 3. Ensuite, essayer de concaténer octets et unicode soulèvera toujours une erreur, ce qui rend beaucoup plus facile de repérer ces problèmes.