gpt4 book ai didi

python - 如何使 casefold() 在某些阿拉伯语 unicode 上工作

转载 作者:太空宇宙 更新时间:2023-11-03 10:53:29 25 4
gpt4 key购买 nike

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

  1. أكثر vs اكثر
  2. قائمو vs قائمه
  3. إنشاء vs انشاء

每一对的元素并不完全相同,但它们是用不同的大小写写的。对我(我不懂任何阿拉伯语)来说,一个有用的类比是 Wordword。它们不相同,但如果我将它们都小写,我将获得 wordword,它们是相同的。这就是我想从这 3 对阿拉伯语单词中得到的。

我现在将使用第一对(1. أكثر vs اكثر)来举例说明我的尝试。顺便说一下,第一对中的两个阿拉伯语单词的意思都是"menu" "more",但是它们有不同的大小写(平行:Menu菜单 更多更多)。我根本不懂阿拉伯语,也不懂阿拉伯语规则,所以如果懂阿拉伯语的人可以确认这些词是“相同的”,那就太好了。

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 中也会很棒。

谢谢。

最佳答案

这些词不相同:u'أكثر' 和 u'اكثر' 不一样。第一个单词的第一个字母上面有字母 Alif 和 Hamazah,可能由于字形的小尺寸你没有注意到:

Alif with Hamaza

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

Alif

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

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

They are not identical, but if I lowercase both of them, I'll obtain word vs word, which are identical. That's what I want to obtain from these 3 pairs of Arabic words.

阿拉伯语没有大小写之分。你手中的单词不一样,它们有不同的字母。有些单词拼写正确,而另一些单词拼写错误。它们可能看起来是一样的,但对于阿拉伯语读者来说,他们也可能认为它们是一样的,对于语言狂来说,它们是不一样的。但它们传达了意思,你的英语阿拉伯语单词列表大致如下所示:

1-更多,摩尔

2-菜单,手册

3- establish, estblish

I'm going to exemplify what I tried by now using the first pair (1. أكثر vs اكثر). By the way, the meaning of both Arabic words from the first pair is "menu", but they have different cases (as a parallel: Menu vs menu)

不,أكثر 意味着更多。你的第二对意思是菜单,但在阿拉伯语中没有“菜单”或“菜单”这样的东西。我无法深入研究细节,因为这将是题外话。

关于python - 如何使 casefold() 在某些阿拉伯语 unicode 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45759692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com