1、使用Oracle的UTL_MATCH.edit_distance_similarity计算非英文字符编辑相似度时会存在问题:
错误示例如下
select UTL_MATCH.edit_distance_similarity('附件11','通用'),UTL_MATCH.edit_distance_similarity('分类2-1','通用') from dual;
两个毫不相干的字符理论上编辑距离应该为0才对。
2、使用PostgreSQL扩展函数计算编辑距离,经验证对于非英文字符是正确的:
-- 扩展函数加载
CREATE EXTENSION "fuzzystrmatch";
-- 编码距离相似度分析
CREATE FUNCTION "levenshtein_similarity" (in_source TEXT, target TEXT) RETURNS INTEGER AS $BODY$
BEGIN
IF (length(in_source) > length(target)) THEN
RETURN (1-levenshtein (in_source, target) / length(in_source)::float8)*100;
ELSE RETURN (1-levenshtein(in_source, target) / length(target)::float8)*100;
END IF;
END;
$BODY$ LANGUAGE plpgsql VOLATILE COST 100;
3、验证结果正确性
使用Python提供的编辑距离函数验证
import Levenshtein
def edit_distance_similarity(str1: str, str2:str):
distance=Levenshtein.distance(str1, str2);
maxLen:int;
if len(str1) > len(str2):
maxLen=len(str1);
else:
maxLen = len(str2);
return (maxLen-distance)/maxLen * 100
print(edit_distance_similarity("서울시중구퇴계로73길 35 신일빌딩203","인천 중구 항동7가 유한빌딩 27-21"));
上面的编辑距离相似度结果为21.739;
对比PostgreSQL函数结果:
对比Oracle函数结果:
总结:UTL_MATCH.edit_distance_similarity计算非英文字符编辑相似度时,结果有时会存在问题,故记录下来,供参考!