如何使casefold()适用于某些阿拉伯语unicodes

时间:2017-08-18 14:58:50

标签: python unicode arabic case-insensitive

我在Python 2.7中检测到一些阿拉伯语单词对中的“相等”时遇到了一些问题:

  1. أكثرvsاكثر
  2. قائمةvsقائمه
  3. إنشاءvsانشاء
  4. 每对元素并不完全相同,但它们是用不同的情况编写的。对我来说一个有用的比喻(我不知道任何阿拉伯语)是 Word vs word 。它们不相同,但如果我将它们都小写,我将获得 word vs word ,它们是相同的。这就是我想要从这3对阿拉伯语单词中获得的。

    我将使用第一对(1أكثرvsاكثر)来举例说明我现在尝试的内容。顺便说一句,第一对中的两个阿拉伯语单词的含义是“menu”“more”,但它们有不同的情况(作为并行: 菜单 vs 菜单 更多 vs 更多)。我根本不懂阿拉伯语,也不懂阿拉伯语规则,所以如果知道阿拉伯语的人可以确认这些单词是“相同的”,那就太棒了。

    str1 = u'أكثر'
    str2 = u'اكثر'
    

    所以我要做的是将str1str2带到同一个表单(如果可能的话),所以我想要一个为两个字符串产生相同输出的函数:

    transform(str1) == transform(str2)
    

    在英语中,这很容易实现:

    a = u'More'
    b = u'more'
    
    def transform(text):
        return text.lower()
    
    >>> transform(a) == transform(b)
    >>> True
    

    但是,当然,这对阿拉伯语不起作用,因为没有像小写或大写这样的东西。

    >>> str1
    u'\u0623\u0643\u062b\u0631'
    
    >>> str2
    u'\u0627\u0643\u062b\u0631'
    

    请注意,只有第一个字符在unicode表示中有所不同。

    我还使用以下方法对字符串进行了规范化:

    import unicodedata
    
    >>> n_str1 = unicodedata.normalize('NFKD', str1)
    >>> n_str2 = unicodedata.normalize('NFKD', str2)
    
    >>> n_str1
    u'\u0627\u0654\u0643\u062b\u0631'
    
    >>> n_str2
    u'\u0627\u0643\u062b\u0631'
    

    正如您已经注意到的那样:

    >>> n_str1 == n_str2
    False
    

    之后,我尝试使用unicode.casefold()但它在Python 2中不可用。我已经安装了py2casefold库但是我没有设法获得字符串之间的相等性。所以我尝试使用Python 3的unicode.casefold(),但没有任何运气:

    >>> str1.casefold() == str2.casefold()
    False
    
    >>> n_str1.casefold() == n_str2.casefold()
    False
    

    Python 2中的解决方案将是完美的,但它在Python 3中也会很棒。

    谢谢。

1 个答案:

答案 0 :(得分:3)

这些词语并不完全相同:你们的“أك'”和“اثر”不一样。第一个单词中的第一个字母上面有字母Alif和Hamazah,或许你不会注意到由于字形的小尺寸:

Alif with Hamaza

然而,第二个单词中的第一个字母是Alif *(从右到左):

Alif

因此他们不能比较平等。这些字母中的每一个都由其自己的Unicode字符代码点表示。从语言的角度来看,它们并不相同:

>>> u'أكثر'; u'اكثر'
u'\u0623\u0643\u062b\u0631'
u'\u0627\u0643\u062b\u0631'
  

它们不完全相同,但如果我将它们两者都小写,我将获得单词vs单词,它们是相同的。这就是我想要从这3对阿拉伯语单词中获得的。

阿拉伯语没有小写或大写字母。你手中的字不一样,它们有不同的字母。有些单词的拼写正确,而其他单词拼写错误。它们似乎是相同的,但对于阿拉伯语读者来说,他们也可能认为它们是相同的,对于语言怪胎来说,它们是不一样的。但是它们表达了意思,你的英文阿拉伯语单词大致如下:

1-更多,moore

2-菜单,manu

3-建立,建立

  

我将使用第一对(1أكثرvsاكثر)来举例说明我现在尝试的内容。顺便说一句,第一对中的两个阿拉伯语单词的含义都是“菜单”,但它们有不同的情况(作为并行:菜单与菜单)

不,أكثر表示更多。你的第二对意味着菜单,但没有阿拉伯语中的菜单或菜单。我无法深入研究细节,因为这不是主题。