【问题标题】:Python: Replacing character error with read in filePython:用读入文件替换字符错误
【发布时间】:2017-01-21 18:05:45
【问题描述】:

目标:我只想去掉逗号,因为它是唯一会搞砸我的(课程要求的)文件解析以进行贝叶斯分析的字符(即 word,2,4)而不是说(即 word,,2 ,4)

因此,我目前正在尝试阅读来自 Enron 公共在线语料库的文本文件形式的电子邮件,并构建贝叶斯垃圾邮件过滤器。

我注意到,在尝试操作存在的字符串时,读取某些文件会引发错误。我完全知道其中一些文件包含病毒,因此某些字符的编码可能无效。但是,我试图简单地替换字符串中的逗号,但出现以下错误:

UnicodeDecodeError:“ascii”编解码器无法解码位置 1169 中的字节 0xc1:序数不在范围内 (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 通过的版本进行正则表达式,但我注意到垃圾邮件的准确性受到许多垃圾邮件文件具有此类特殊字符的事实的严重影响。

任何建议将不胜感激。谢谢。

-罗伯特

【问题讨论】:

  • 顺便说一句,我也尝试在 ascii 和 utf8 和 16 中进行编码和解码
  • 你能完成堆栈跟踪吗?

标签: python spam bayesian


【解决方案1】:

如果您只想删除多余的逗号,并且正如您所说的,您可以使用简单的拆分和连接(假设逗号是这里唯一的分隔符)

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

【讨论】:

  • 谢谢。像魅力一样工作。我没想到在事后将其删除
【解决方案2】:

所以我最终使用了另一个我发现也有用的实现。事实证明,出于某种原因,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' 中的逗号不会被替换。使用上面的代码,您可以保证逗号将从每个单词中删除,而不是转换为 unicode 字符串

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

就代码的性能而言,我仍在以不错的速度训练大量文件。所以它应该对你有那么大的影响。

希望这会有所帮助!

-罗伯特

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2014-09-07
    相关资源
    最近更新 更多