我正在清除.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”。字符“ồ”变成两个字符:“ô”和“`”。
当我使用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
结果应与原始结果相同,但不是。怎么了?
答案 0 :(得分:0)
问题不在Python语言中- 问题是您所指向的特定字符(可能还有其他字符)具有两个组合的变音标记。问题是并非所有的文本处理应用程序都可以处理该问题。我本人正在使用基于Qt的终端,只需将您问题中的第一个字符串粘贴到第二个变音符号“消失”处,即“消失”,仅保留“ô”标记即可。 (不过,基于GTK +的终端可以正确处理它。)
所以,事实是,Python提供的unicode字符串是正确的。您用来查看它的终端应用程序无法正确处理,但是在同一个字符上放置了两个变音符号。
过滤变音符使其远离Unicode字符几乎绝不是“正确的事情”。如果您的应用程序支持越南文字,则应正确执行此操作,而不是静默转换某些字符。
对于“基于西方的”语言,字母通常具有一个变音符,这很容易-不仅终端和输出库支持那么变音,而且通常所有字符都由单个unicode-codepoint表示。
但是,当每个字符需要更多变音符时,将“字符串中的一个字符”的等效性等同于“屏幕上的一个字符”(不管输出是否正确)。然后您必须担心代码中的问题。
如果您只是将事物编入索引以进行搜索,甚至是为训练而使用文本语料库,也可以去除变音符号,但是也许您应该去除所有变音符号。
执行此操作的方法是将字符串强制为标准化的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'