我正在清理.txt文件的文本。然而,在阅读文件后,我发现文本缺少空格,只有一些单词之间有错误的字符。
我使用的是Python 3,文本是越南语。
Orignial text: "vui lòng cởi đồ ra tôi muốn nghe khám bệnh"In[1]: with open('test.txt') as f:
read_text = f.read()
read_text
Out[1] vui lòng cởi đô`ra tôi muốn nghe khám bệnh仔细看看"đồra“->”đóra". A character "ồ" became two characters: "ô" and "“。
当我使用re删除所有特殊字符时
In[2]: import re
read_text = re.sub('\W+',' ',read_text)
read_text
Out[2]: vui lo ng cơ i đô ra tôi muô n nghe kha m bê nh结果应该与原始结果相同,但不是。怎么啦?
发布于 2019-06-18 00:10:00
问题不在Python语言中-问题是您所指向的特定字符,可能还有其他字符,有两个组合变音符号。问题是,并不是所有的文本处理应用程序都能处理这个问题。我自己使用的是基于Qt的终端,粘贴问题中的第一个字符串只是简单地“删除”了第二个发音符号-- "`“标记,只留下了”Don.“。(不过,基于GTK+的终端可以正确地处理它)。
所以问题是Python提供的unicode字符串是正确的。但是,您使用的终端应用程序无法正确处理它,并将两个变音符号放在同一个字符上。
过滤掉unicode字符之外的变音符号几乎从来都不是“正确的做法”。如果你的应用程序要支持越南语文本,它应该正确地这样做,而不是静默地转换一些字符。
对于“基于西方的”语言,字母通常会有一个变音符号,这是相当容易的-不仅终端和输出库支持,然后很好,而且,通常所有字符都由一个unicode代码点表示。
然而,当一个人移动到每个字符需要更多的变音符号时,您就失去了“字符串中的一个字符”等于“屏幕上的一个字符”的等价性(不管输出是否正确)。然后你必须在你的代码中担心这一点。
如果您只是为了搜索而对事物进行索引,甚至是为了训练而对文本语料库进行索引,那么剥离变音符号可能是可以的,但是,然后,您可能应该剥离所有的变音符号。
这样做的方法是强制字符串进入规范化的Unicode表示,其中所有变音符号都表示为单独的“组合字符”,而不是组合字符,然后只过滤掉字母字符;
import unicodedata
a = "vui lòng cởi đồ ra tôi muốn nghe khám bệnh"
# Normalize the internal representation:
b = unicodedata.normalize("NFKD", a)
print(*(c for c in b), sep=" ")
# outputs: "v u i l o ̀ n g c o ̛ ̉ i đ o ̂ ̀ r a t o ̂ i m u o ̂ ́ n n g h e k h a ́ m b e ̣ ̂ n h"
# recreates the string filtering out combining characters:
c = "".join(c for c in b if unicodedata.category(c) != "Mn")
print(c)
# outputs: 'vui long coi đo ra toi muon nghe kham benh'https://stackoverflow.com/questions/56287740
复制相似问题