我在Python 2.7中检测到一些阿拉伯语单词对中的“相等”时遇到了一些问题:
每对元素并不完全相同,但它们是用不同的情况编写的。对我来说一个有用的比喻(我不知道任何阿拉伯语)是 Word vs word 。它们不相同,但如果我将它们都小写,我将获得 word vs word ,它们是相同的。这就是我想要从这3对阿拉伯语单词中获得的。
我将使用第一对(1أكثرvsاكثر)来举例说明我现在尝试的内容。顺便说一句,第一对中的两个阿拉伯语单词的含义是“menu”“more”,但它们有不同的情况(作为并行: 菜单 vs 菜单 更多 vs 更多)。我根本不懂阿拉伯语,也不懂阿拉伯语规则,所以如果知道阿拉伯语的人可以确认这些单词是“相同的”,那就太棒了。
str1 = u'أكثر'
str2 = u'اكثر'
所以我要做的是将str1
和str2
带到同一个表单(如果可能的话),所以我想要一个为两个字符串产生相同输出的函数:
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中也会很棒。
谢谢。
答案 0 :(得分:3)
这些词语并不完全相同:你们的“أك'”和“اثر”不一样。第一个单词中的第一个字母上面有字母Alif和Hamazah,或许你不会注意到由于字形的小尺寸:
然而,第二个单词中的第一个字母是Alif *(从右到左):
因此他们不能比较平等。这些字母中的每一个都由其自己的Unicode字符代码点表示。从语言的角度来看,它们并不相同:
>>> u'أكثر'; u'اكثر'
u'\u0623\u0643\u062b\u0631'
u'\u0627\u0643\u062b\u0631'
它们不完全相同,但如果我将它们两者都小写,我将获得单词vs单词,它们是相同的。这就是我想要从这3对阿拉伯语单词中获得的。
阿拉伯语没有小写或大写字母。你手中的字不一样,它们有不同的字母。有些单词的拼写正确,而其他单词拼写错误。它们似乎是相同的,但对于阿拉伯语读者来说,他们也可能认为它们是相同的,对于语言怪胎来说,它们是不一样的。但是它们表达了意思,你的英文阿拉伯语单词大致如下:
1-更多,moore
2-菜单,manu
3-建立,建立
我将使用第一对(1أكثرvsاكثر)来举例说明我现在尝试的内容。顺便说一句,第一对中的两个阿拉伯语单词的含义都是“菜单”,但它们有不同的情况(作为并行:菜单与菜单)
不,أكثر表示更多。你的第二对意味着菜单,但没有阿拉伯语中的菜单或菜单。我无法深入研究细节,因为这不是主题。