首页 > 解决方案 > 寻找阿拉伯语文本之间的相似性

问题描述

我目前正在开发一个 Oracle 12c 数据库产品,在这个产品中,表中包含大约 200 万条记录,表中包含一个名称列,其中包含阿拉伯文和英文文本。我想要做的是找到一种方法来分析名称列以获取与给定名称相似的所有行。我尝试使用utl_match包含用于edit_distancejaro_winkler实现的包,但这不适用于阿拉伯语文本,因为阿拉伯语中有更多相似的字母,算法将它们视为完全不同的字母,如 (أ, ا, إ) 导致效率低下结果。所以我现在正在寻找的是标准化阿拉伯文本的东西,所以我可以将它与utl_match包或任何可以帮助我完成工作的替代方案。该任务应该在PL/SQl中完成,但如果不可能,我愿意使用任何其他工具或想法

标签: plsqlnlporacle12c

解决方案


使用TRANSLATE之前的功能UTL_MATCH

例如,初始编辑距离为 2:

select
    utl_match.edit_distance
    (
        s1 => text1,
        s2 => text2
    ) edit_distance
from
(
    select
        'ليونيكود أاإ' text1,
        'ليونيكود ااا' text2
    from dual
);

手动将相似字符翻译成完全相同的字符后,编辑距离现在为 0:

select
    utl_match.edit_distance
    (
        s1 => translate(text1, 'أإ', 'اا'),
        s2 => translate(text2, 'أإ', 'اا')
    ) edit_distance
from
(
    select
        'ليونيكود أاإ' text1,
        'ليونيكود ااا' text2
    from dual
);

使用 NLS 设置和工具比较字符串可能有更好、更正式的方法,但如果只有几个字符会导致问题,则使用TRANSLATE.


推荐阅读