我正在执行一个NLP任务,该任务需要使用称为Yoruba的语言的语料库。约鲁巴语是一种在字母表中带有变音符号的语言。如果我在python环境中读取了任何文本/语料库,则某些上级变音符号会移位/移位,尤其是对于字母ẹ和ọ:
对于顶部带有变音符号的字符they,他们会移位。也有:ẹ同样的事情也会发生。(ọ)
def readCorpus(directory="news_sites.txt"):
with open(directory, 'r',encoding="utf8", errors='replace') as doc:
data = doc.readlines()
return data
预期结果是将变音符号正确放置在顶部
(我很惊讶stackoverflow能够解决变音符号)。
后来,已被替换的变音符号被视为标点符号,因此被删除(通过我的NLP处理功能),从而影响了整个任务。
最佳答案
作为noted in the comments,您的文本是正确的,只是显示错误(您的控制台,无论它是什么,都不支持Unicode,并且不能正确处理Unicode组合字符)。
您的真正问题似乎是you're trying to do some processing to remove punctuation, and the combining diacritics are being seen as punctuation and removed。
在您的情况下,您涉及多个组合变音符号,并且没有单个Unicode序数表示它们全部组合在一起,因此使用unicodedata.normalize('NFC', originalstring)
不会帮您(它将ọ́
的组合字符之一组合在一起) >,但不能同时使用两者)。
因此,您唯一真正的解决方案是修复标点符号过滤器,使其不会掉落组合字符。这应该不太困难,只需将过滤代码从以下位置更改:
if is_punctuation(letter): # is_punctuation is whatever test you're using to find punctuation
# drop letter
else:
# keep letter
到(在文件顶部添加
import unicodedata
之后):if is_punctuation(letter) and not unicodedata.combining(letter):
# drop letter
else:
# keep letter
unicodedata.combining
returns 0
for combining characters, non-0
otherwise,因此即使使用其他标准算作标点符号,也可以使用它来确保不删除组合字符。关于python - 变音符号/重音符号在python字符串中的位移,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56869968/