Oracle和达梦:相似度函数:UTL_MATCH
UTL_MATCH介绍:
Oracle的UTL_MATCH包是一个提供字符串匹配和相似度计算功能的工具包。它包含了一系列函数,用于执行字符串比较、相似度计算和模式匹配等操作。
UTL_MATCH包中的函数可以用于以下任务:
-
字符串相似度计算:UTL_MATCH提供了多个函数来计算字符串之间的相似度,如Jaro-Winkler相似度、编辑距离等。
-
模式匹配:UTL_MATCH提供了函数来执行基于模式的匹配,如正则表达式匹配、通配符匹配等。
-
字符串比较:UTL_MATCH提供了函数来执行字符串的比较,如大小写敏感或不敏感的比较、基于排序规则的比较等。
-
字符串规范化:UTL_MATCH提供了函数来规范化字符串,如去除多余的空格、转换为大写或小写等。
UTL_MATCH包提供了一些有用的功能,可以帮助开发人员在Oracle数据库中进行字符串处理和匹配操作。请注意,使用UTL_MATCH包需要适当的权限,并且在正确的数据库环境中执行。
1、归一化编辑距离
函数:UTL_MATCH.edit_distance_similarity
-
UTL_MATCH.edit_distance_similarity是Oracle数据库中的一个函数,用于计算两个字符串之间的相似度。它基于编辑距离算法,该算法用于衡量两个字符串之间的相似程度。
-
编辑距离是通过计算将一个字符串转换为另一个字符串所需的最少编辑操作次数来衡量的。这些编辑操作可以是插入、删除或替换字符。
-
函数UTL_MATCH.edit_distance_similarity返回一个介于0和100之间的相似度分数,表示两个字符串之间的相似程度,其中0表示完全不相似,100表示完全相似。
-
通过使用UTL_MATCH.edit_distance_similarity函数,您可以比较两个字符串的相似程度,并根据需要进行进一步的处理或决策。例如,您可以在搜索引擎中使用它来提供与用户查询相关的最佳匹配结果,或者在数据清洗过程中使用它来查找相似的字符串并进行合并或去重操作。
使用
1、第一个参数是要匹配的字符串,第二个参数是要与之进行匹配的字符串
SELECT UTL_MATCH.edit_distance_similarity ('param1', 'param2') AS similarity
- 返回:84
☆2、第一个参数可以是查询表的列,您可以将表的列名作为第一个参数传递给该函数,以计算该列中每个值与指定字符串之间的相似度。
SELECT UTL_MATCH.edit_distance_similarity (列名, '6') AS similarity
SELECT UTL_MATCH.edit_distance_similarity ("列名", '6') AS similarity
实践
- 查询表TABLE_1的C2_VARCHAR2字段的值和6匹配的相似度,并且取相似度大于2的值
SELECT
*
FROM
(
SELECT
UTL_MATCH.edit_distance_similarity (C2_VARCHAR2, '6') AS similarity,
*
FROM
TABLE_1
ORDER BY similarity DESC) AS a
WHERE
similarity >= 2
返回:
2、Jaro-Winkler相似度算法
函数:UTL_MATCH.JARO_WINKLER_SIMILARITY
Jaro-Winkler相似度是一种用于比较两个字符串之间相似程度的度量方法。它基于字符匹配和字符顺序的相似性,常用于姓名、地址等文本数据的相似度计算。
Jaro-Winkler相似度算法由William E. Winkler在1989年提出,是对Jaro相似度算法的改进。它通过计算字符匹配的数量、字符顺序的相似性以及前缀匹配的权重来确定字符串的相似度。
Jaro-Winkler相似度的计算过程如下:
-
计算匹配的字符数量(m):对于两个字符串,计算在相同位置上字符相等的数量。
-
计算相似字符交换的数量(t):对于两个字符串,计算在不同位置上字符相等但顺序不同的数量。
-
计算相似度(similarity):根据公式计算相似度,公式如下:
similarity = (m / |s1| + m / |s2| + (m - t) / m) / 3
- 计算前缀匹配的权重(prefix weight):如果两个字符串的前缀匹配,则根据公式计算前缀匹配的权重,公式如下:
prefix weight = prefixLen * p * (1 - similarity)
其中,prefixLen是前缀匹配的长度,p是一个常数(通常为0.1),similarity是相似度。
- 计算Jaro-Winkler相似度(JW similarity):根据公式计算Jaro-Winkler相似度,公式如下:
JW similarity = similarity + prefix weight
Jaro-Winkler相似度的取值范围为0到100,数值越接近100表示字符串越相似。
在Oracle数据库中,可以使用UTL_MATCH包中的UTL_MATCH.JARO_WINKLER_SIMILARITY函数来计算Jaro-Winkler相似度。该函数接受两个字符串作为参数,并返回它们之间的Jaro-Winkler相似度值。
使用
-- oracle/dm实现的:Jaro-Winkler相似度算法
SELECT UTL_MATCH.JARO_WINKLER_SIMILARITY('h1e2l3l4o', 'ddddhello') AS JaroWinkler相似度;