2016-09-14 6 views
1

Цель: я просто хочу забрать запятую, так как это единственный символ, который испортит мой (конечно необходимый) синтаксический анализ файла для байесовского анализа (т.е. слово, 2,4) вместо слова (например, слово ,, 2,4)Python: замена символьной ошибки на чтение в файле

Итак, в настоящее время я пытаюсь читать по электронной почте в виде текстового файла из публичного корпуса Enron в Интернете и создавать байесовский спам-фильтр.

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

UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0xc1 в позиции 1169: порядковый номер не в диапазоне (128)

Я попробовал все, что этот форум может предложить и я искал везде для решения, такие как:

with open(file+file_path_stings[i],'r') as filehandle: 
     words = str(filehandle.read()) 
     words = words.replace(',','') 
     words = words.split() 

Я также пробовал много регулярных выражений попыток ... это один из вариантов :

with open(file+file_path_stings[i],'r') as filehandle: 
     words = str(filehandle.read()) 
     words = re.sub(',','',words) 
     words = words.split() 

Теперь я могу просто просто создать регулярное выражение, которое позволяет только A-Za-z, но я замечаю, что точность спама сильно зависит от того, что многие спам-файлы имеют такие специальные символы.

Любое предложение было бы наиболее ценным. Благодарю.

-Роберт

+0

BTW ив также попытался кодирования и декодирования как в ASCII и utf8 и 16 –

+0

вы можете, пожалуйста, полный трассировки стека? –

ответ

2

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

','.join([s for s in 'word,,2,4'.split(',') if s]) 
+0

Спасибо. Работал как шарм. Мне не пришло в голову просто удалить его после того, как –

+0

рад, что это сработало. – armak

0

Итак, я закончил использовать другую реализацию, которую я нашел полезной. Оказывается, по какой-то причине python сохраняет любую предварительную информацию, которую он имел для любых предыдущих строк, которые изначально присутствовали. Так я узнал его всегда хорошая идея, чтобы просто повторно назначить его на другой (новой) переменной следующим образом:

with open(file+file_path_stings[i],'r') as filehandle: 
    words = str(filehandle.read()).split() 
    new_array = [] 
    for word in words: 
     new_array.append(word.replace(',','').lower()) 
    return new_array 

Его немного дороже, насколько хранение и назначение данных в целом другой переменной , Тем не менее, я заметил, что это намного безопаснее с точки зрения того, что ваша строка не попадает в строку unicode. Исходной проблемой был этот вывод

print words 

[u'hello,',u'what?',u'is',u'going',u'on?'] 

Запятая в 'hello' не заменялась. С кодом выше вы гарантирован, что запятая будет вырезана из каждого слова, а не отлита в строку Юникода

print new_array 
['hello','what?',u'is',u'going',u'on?'] 

Что касается производительности коды идет, я до сих пор обучение массивных файлов на приличном скорость. Таким образом, это должно сильно повлиять на вас.

Надеюсь, это поможет!

-Роберт