删除 Python 中的 '\xad' 的最佳方法?
Best way to remove '\xad' in Python?
我正在尝试从 this link 中找到的 .txt 文件构建语料库。
我相信 \xad
的实例应该是 'soft-hyphens',但在 UTF-8 编码下似乎无法正确读取。我已尝试使用以下代码将 .txt 文件编码为 iso8859-15
:
with open('Harry Potter 3 - The Prisoner Of Azkaban.txt', 'r',
encoding='iso8859-15') as myfile:
data=myfile.read().replace('\n', '')
data2 = data.split(' ')
这个 returns 一个 'words' 的数组,但是 '\xad' 仍然附加到 data2 中的许多条目。我试过了
data_clean = data.replace('\xad', '')
和
data_clean = data.replace('\xad|\xad\xad','')
但这似乎并没有删除“\xad”的实例。有没有人 运行 遇到过类似的问题?理想情况下,我想将此数据编码为 UTF-8 以利用 nltk
库,但它不会使用 UTF-8 编码读取文件,因为我收到以下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xad in position 471: invalid start byte
如有任何帮助,我们将不胜感激!
附加上下文:这是一个娱乐项目,目的是能够根据txt文件生成故事。到目前为止我生成的所有内容都充满了'\xad',这破坏了乐趣!
你的文件几乎肯定有实际的 U+00AD soft-hyphen characters。
这些字符用于标记在将行调整到页面时可以拆分单词的位置。这个想法是,如果不需要拆分单词,则软连字符是不可见的,但如果需要拆分,则与 U+2010 normal hyphen 打印相同。
由于您不关心在一本书中以流畅的文字呈现此文本,因此您永远不会对任何内容进行连字,因此您只想删除这些字符。
执行此操作的方法是不使用编码 fiddle。只需从 Unicode 文本中删除它们,使用您认为最易读的任何一个:
data = data.replace('\xad', '')
data = data.replace('\u00ad', '')
data = data.replace('\N{SOFT HYPHEN}', '')
注意单个反斜杠。我们不是在替换文字反斜杠 x
、a
、d
,而是在替换文字软连字符,即代码点为十六进制 0xad 的字符。
您可以在拆分成单词之前对整个文件执行此操作,也可以在拆分后对每个单词执行一次。
与此同时,您似乎对什么是编码以及如何使用它们感到困惑:
I've tried encoding the .txt file as iso8859-15
不,您已尝试将文件解码为 ISO-8859-15。不清楚您为什么首先尝试 ISO-8859-15。但是,由于字符 '\xad'
的 ISO-8859-15 编码是字节 b'\xad'
,也许这是正确的。
Ideally I'd like to encode this data as UTF-8 to avail of the nltk library
但是 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 一样会静默成功,但在每个软连字符前有一个额外的 'Â'
字符。错误通常更有帮助。
我正在尝试从 this link 中找到的 .txt 文件构建语料库。
我相信 \xad
的实例应该是 'soft-hyphens',但在 UTF-8 编码下似乎无法正确读取。我已尝试使用以下代码将 .txt 文件编码为 iso8859-15
:
with open('Harry Potter 3 - The Prisoner Of Azkaban.txt', 'r',
encoding='iso8859-15') as myfile:
data=myfile.read().replace('\n', '')
data2 = data.split(' ')
这个 returns 一个 'words' 的数组,但是 '\xad' 仍然附加到 data2 中的许多条目。我试过了
data_clean = data.replace('\xad', '')
和
data_clean = data.replace('\xad|\xad\xad','')
但这似乎并没有删除“\xad”的实例。有没有人 运行 遇到过类似的问题?理想情况下,我想将此数据编码为 UTF-8 以利用 nltk
库,但它不会使用 UTF-8 编码读取文件,因为我收到以下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xad in position 471: invalid start byte
如有任何帮助,我们将不胜感激!
附加上下文:这是一个娱乐项目,目的是能够根据txt文件生成故事。到目前为止我生成的所有内容都充满了'\xad',这破坏了乐趣!
你的文件几乎肯定有实际的 U+00AD soft-hyphen characters。
这些字符用于标记在将行调整到页面时可以拆分单词的位置。这个想法是,如果不需要拆分单词,则软连字符是不可见的,但如果需要拆分,则与 U+2010 normal hyphen 打印相同。
由于您不关心在一本书中以流畅的文字呈现此文本,因此您永远不会对任何内容进行连字,因此您只想删除这些字符。
执行此操作的方法是不使用编码 fiddle。只需从 Unicode 文本中删除它们,使用您认为最易读的任何一个:
data = data.replace('\xad', '')
data = data.replace('\u00ad', '')
data = data.replace('\N{SOFT HYPHEN}', '')
注意单个反斜杠。我们不是在替换文字反斜杠 x
、a
、d
,而是在替换文字软连字符,即代码点为十六进制 0xad 的字符。
您可以在拆分成单词之前对整个文件执行此操作,也可以在拆分后对每个单词执行一次。
与此同时,您似乎对什么是编码以及如何使用它们感到困惑:
I've tried encoding the .txt file as iso8859-15
不,您已尝试将文件解码为 ISO-8859-15。不清楚您为什么首先尝试 ISO-8859-15。但是,由于字符 '\xad'
的 ISO-8859-15 编码是字节 b'\xad'
,也许这是正确的。
Ideally I'd like to encode this data as UTF-8 to avail of the nltk library
但是 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 一样会静默成功,但在每个软连字符前有一个额外的 'Â'
字符。错误通常更有帮助。