plsql - 寻找阿拉伯语文本之间的相似性
问题描述
我目前正在开发一个 Oracle 12c 数据库产品,在这个产品中,表中包含大约 200 万条记录,表中包含一个名称列,其中包含阿拉伯文和英文文本。我想要做的是找到一种方法来分析名称列以获取与给定名称相似的所有行。我尝试使用utl_match
包含用于edit_distance和jaro_winkler实现的包,但这不适用于阿拉伯语文本,因为阿拉伯语中有更多相似的字母,算法将它们视为完全不同的字母,如 (أ, ا, إ) 导致效率低下结果。所以我现在正在寻找的是标准化阿拉伯文本的东西,所以我可以将它与utl_match
包或任何可以帮助我完成工作的替代方案。该任务应该在PL/SQl中完成,但如果不可能,我愿意使用任何其他工具或想法
解决方案
使用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
.
推荐阅读
- visual-c++ - 在 C++ 中创建单链表有点麻烦
- javascript - Redirecting after submit with counter
- dart - 如何验证 Image.Network?
- apache-kafka - 为什么我的kafka连接mysql8.0总是遇到问题?
- c++ - 如何使用c ++将从文本文件中读取的字符串拆分为数组
- javascript - Accessing props in child vue component data function?
- php - How to sum array value and save in list
- android - 指定为非空的改造参数为空
- python - 如何删除 NumPy 数组中的数字?
- java - 如何改变约束偏差?