我正在执行一个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/

10-09 16:01
查看更多