【发布时间】:2018-07-10 10:34:07
【问题描述】:
总结:
我正在尝试预处理文本以在之后进行分类或主题建模。问题是在预处理的时候,有些编码问题我解决不了,编码真的是个很麻烦的话题。
说明:
给定的字符串取自一个excel文件,
s = " GEÇİCİ \n\t"
现在,当我尝试对这个字符串应用一些替换和标记时,我遇到了字符串变成的问题,
print(re.sub(r'[^a-zıöüşçğ.,\']', ' ', s.lower()))
# ' geçi ci '
结果不应该像那样分开,它会破坏我的标记化过程。然后我尝试了不区分大小写的方法,效果很好。
print(re.sub(r'[^a-zıöüşçğ.,\']', ' ', s, flags=re.I).lower())
# ' geçi̇ci̇ '
现在要了解哪里出了问题,我尝试将原始字符串编码为“utf-8”,这很好,
print(s.encode("utf-8"))
# b' GE\xc3\x87\xc4\xb0C\xc4\xb0 \n\t'
但是当我尝试在使用 lower() 后对其进行编码时,问题就出在了这里,
print(s.lower().encode("utf-8"))
# b' ge\xc3\xa7i\xcc\x87ci\xcc\x87 \n\t'
与预期结果进行比较
print("geçici".encode("utf-8"))
# b'ge\xc3\xa7ici'
问题:
这两个 b'\xcc\x87' 是从哪里来的?
我记得在 C# 中遇到过类似的问题。有一种像ToLowerInvariant 这样的方法绕过了这样的问题。寻找这样的参数,我可以传递给 lower 但没有出现。
【问题讨论】:
-
您的预期结果是错误的:您假设
"İ".lower() == "i"(regular "i") -
@bobrobbob 不应该是这样吗,那正确的做法是什么呢?
-
当然不是。上面的“i”是“I”而不是“İ”
-
这就是我真正要问的问题,我怎样才能避免这种情况来制作
"İ".lower() == "i"。
标签: python python-3.x encoding utf-8