我有一个大型Oracle DB表,其中包含整个国家的街道名称,其中有600000+行。在我的应用程序中,我接受一个地址字符串作为输入,并希望检查该地址字符串的特定子字符串是否与表中的一个或多个街道名称匹配,这样我就可以将该地址子字符串标记为街道名称。
显然,这应该是一个模糊文本匹配问题,我查询的子字符串与DB表中的街道名称完全匹配的可能性很小。因此,应该有一种模糊文本匹配方法。我正在尝试阅读http://docs.oracle.com/cd/B28359_01/text.111/b28303/query.htm上的Oracle文档,其中解释了CONTAINS和CATSEARCH搜索运算符。但它们似乎用于更复杂的任务,比如在文档中搜索给定字符串的匹配项。我只想对表的一列执行此操作。
在这种情况下,您对我有什么建议? Oracle是否支持这种模糊文本匹配查询?
发布于 2014-08-15 15:00:56
UTL_MATCH包含匹配字符串和比较其相似性的方法。编辑距离,也称为Levenshtein距离,可能是一个很好的起点。由于一个字符串是一个子字符串,因此将编辑距离与字符串的大小进行比较可能会有所帮助。
--Addresses that are most similar to each substring.
select substring, address, edit_ratio
from
(
--Rank edit ratios.
select substring, address, edit_ratio
,dense_rank() over (partition by substring order by edit_ratio desc) edit_ratio_rank
from
(
--Calculate edit ratio - edit distance relative to string sizes.
select
substring,
address,
(length(address) - UTL_MATCH.EDIT_DISTANCE(substring, address))/length(substring) edit_ratio
from
(
--Fake addreses (from http://names.igopaygo.com/street/north_american_address)
select '526 Burning Hill Big Beaver District of Columbia 20041' address from dual union all
select '5206 Hidden Rise Whitebead Michigan 48426' address from dual union all
select '2714 Noble Drive Milk River Michigan 48770' address from dual union all
select '8325 Grand Wagon Private Sleeping Buffalo Arkansas 72265' address from dual union all
select '968 Iron Corner Wacker Arkansas 72793' address from dual
) addresses
cross join
(
--Address substrings.
select 'Michigan' substring from dual union all
select 'Not-So-Hidden Rise' substring from dual union all
select '123 Fake Street' substring from dual
)
order by substring, edit_ratio desc
)
)
where edit_ratio_rank = 1
order by substring, address;这些结果不是很好,但希望这至少是一个好的起点。它应该适用于任何语言。但是,您可能仍然希望将其与某些特定于语言或区域设置的比较规则相结合。
SUBSTRING ADDRESS EDIT_RATIO
--------- ------- ----------
123 Fake Street 526 Burning Hill Big Beaver District of Columbia 20041 0.5333
Michigan 2714 Noble Drive Milk River Michigan 48770 1
Michigan 5206 Hidden Rise Whitebead Michigan 48426 1
Not-So-Hidden Rise 5206 Hidden Rise Whitebead Michigan 48426 0.5发布于 2014-08-12 17:22:56
您可以利用Oracle数据库中的SOUNDEX函数。SOUNDEX计算文本字符串的数字签名。这可用于查找发音相似的字符串,从而减少字符串比较的次数。
编辑:如果SOUNDEX不适合你的本地语言,你可以向谷歌索要一个语音签名或语音匹配功能,性能更好。对于每个新的表项和每个查询,都必须对此函数求值一次。因此,它不需要驻留在Oracle中。
例如:土耳其的SOUNDEX被提升为here。
为了提高匹配质量,首先应该统一街道名称的拼写。这可以通过应用一组规则来完成:
简化的规则示例:
字符串将所有字符转换为lowercase
”,删除名称末尾的“
”。在名称末尾,对具有多个单词和辅助词的名称进行排序,如" of ",“alphabetically
”,...
https://stackoverflow.com/questions/25258954
复制相似问题