【问题标题】:Detect same words using different alphabets?使用不同的字母来检测相同的单词?
【发布时间】:2016-10-23 21:34:05
【问题描述】:

Python 对单词 МАМАMAMA 的处理方式不同,因为其中一个使用拉丁文,另一个使用西里尔文。

如何让python将它们视为一个相同的字符串?

我只关心异形体。

【问题讨论】:

  • 在python中搜索encodingdecoding的字符串
  • @jonrsharpe 这是一个关于看起来相似但没有任何共同点的角色的问题。这不是将 Unicode 字符串“压缩”成 ASCII 表示。
  • @vpekar 但这就是你如何说服它它们是同一个字符串,否则它不会相信你
  • @jonrsharpe 问题是关于音译的。俄语字符通常可以音译成拉丁语字符,而您无法使用 unicodedata.normalize 实现此目的。请参阅 Brendan Abel 的更新答案。
  • 您能否澄清一下您是否只关心同种异形体,或者音译是否重要?例如,您想如何处理“PAPA”?

标签: python


【解决方案1】:

有一个 python 库可以将西里尔文翻译成拉丁文 unicode,称为 transliterate

>>> from transliterate import translit
>>> 
>>> cy = u'\u041c\u0410\u041c\u0410'
>>> en = u'MAMA'
>>> cy == en
False
>>> cy_converted = translit(cy, 'ru', reversed=True)
>>> cy_converted == en
True
>>> cy_converted
u'MAMA'

【讨论】:

  • 这不会使“ДРП”被认为等于“DRP”吗?听起来有点像 OP 只想考虑同种异形体相等。这似乎也像“РАРА”会音译为“RARA”,我怀疑 OP 不想要。
【解决方案2】:

音译没有帮助(它会将西里尔字母 P 变成拉丁字母 R)。乍一看,Unicode 兼容形式(NFKD 或 NFKC)看起来很有希望,但这会将 U+041C(西里尔大写字母 EM)变成 U+041C(而不是 U+004D(拉丁大写字母 EM))——这样就不会工作。

唯一的解决方案是建立自己的同种异形表,并在比较之前将所有字符串转换为规范形式。

注意:当我说“西里尔字母 P”时,我作弊并使用了拉丁语异形体 - 我没有简单的方法输入西里尔字母。

【讨论】:

  • 好的。谢谢。我认为这是唯一的方法。
【解决方案3】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2017-06-03
    • 2014-12-19
    • 1970-01-01
    相关资源
    最近更新 更多