Dat*_*cer 7 python encoding str-replace unicode-escapes
我正在尝试从在此链接中找到的 .txt 文件构建一个语料库。我相信 的实例\xad应该是“软连字符”,但在 UTF-8 编码下似乎无法正确读取。我尝试iso8859-15使用以下代码将 .txt 文件编码为:
with open('Harry Potter 3 - The Prisoner Of Azkaban.txt', 'r',
encoding='iso8859-15') as myfile:
data=myfile.read().replace('\n', '')
data2 = data.split(' ')
Run Code Online (Sandbox Code Playgroud)
这将返回一个 'words' 数组,但 '\xad' 仍然附加到 data2 中的许多条目。我试过了
data_clean = data.replace('\\xad', '')
Run Code Online (Sandbox Code Playgroud)
和
data_clean = data.replace('\\xad|\\xad\\xad','')
Run Code Online (Sandbox Code Playgroud)
但这似乎并没有删除 '\xad' 的实例。有没有人遇到过类似的问题?理想情况下,我想将此数据编码为 UTF-8 以使用该nltk库,但它不会读取具有 UTF-8 编码的文件,因为我收到以下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xad in position 471: invalid start byte
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!
附加上下文:这是一个娱乐项目,旨在能够基于 txt 文件生成故事。到目前为止,我生成的所有内容都充满了 '\xad',这破坏了乐趣!
aba*_*ert 13
您的文件几乎肯定包含实际的U+00AD 软连字符。
这些字符用于标记在将线条拟合到页面时可以拆分单词的位置。这个想法是,如果不需要拆分单词,软连字符是不可见的,但如果需要,则打印与U+2010 普通连字符相同。
由于您不关心在具有流畅文本的书中渲染此文本,因此您永远不会对任何内容进行连字符,因此您只想删除这些字符。
做到这一点的方法不是摆弄编码。只需从 Unicode 文本中删除它们,使用您认为最易读的任何一个:
data = data.replace('\xad', '')
data = data.replace('\u00ad', '')
data = data.replace('\N{SOFT HYPHEN}', '')
Run Code Online (Sandbox Code Playgroud)
注意单个反斜杠。我们不是替换文字反斜杠 , x, a,d而是替换文字软连字符,即代码点为十六进制 0xad 的字符。
您可以在拆分成单词之前对整个文件执行此操作,也可以在拆分后每个单词执行一次。
同时,您似乎对什么是编码以及如何处理它们感到困惑:
我试过将 .txt 文件编码为 iso8859-15
不,您已尝试将文件解码为 ISO-8859-15。不清楚你为什么首先尝试 ISO-8859-15。但是,由于字符的 ISO-8859-15 编码'\xad'是 byte b'\xad',也许这是正确的。
理想情况下,我想将此数据编码为 UTF-8 以利用 nltk 库
但是 NLTK 不需要 UTF-8 字节,它需要 Unicode 字符串。您不需要为此对其进行编码。
另外,您不是要尝试将 Unicode 文本编码为 UTF-8,而是尝试将字节从UTF-8解码。如果那些字节不是这样的话……如果幸运的话,你会得到这样的错误;如果没有,你会得到 mojibake,直到你搞砸了一个 500GB 的语料库并丢弃了原始数据。1
1. UTF-8 是专门设计的,因此您会尽可能地得到早期错误。在这种情况下,读取带有软连字符的 ISO-8859-15 文本就好像它是 UTF-8 会引发您所看到的错误,但是读取带有软连字符的 UTF-8 文本就好像它是 ISO-8859-15 一样会静默成功,但'Â'在每个软连字符之前有一个额外的字符。错误通常更有帮助。
| 归档时间: |
|
| 查看次数: |
6579 次 |
| 最近记录: |