计算字符串相似度
Start
今天有个需求中需要定时同步数据,同步的判断条件是某个字段的相似度要大于 80%
于是有了下面这篇文章。
为了方便同步脚本的编写,提供了 Oracle 的函数版本,以便在sql中调用。
Levenshtein距离
首先介绍下 Levenshtein 距离(编辑距离)
莱文斯坦距离(英语:Levenshtein distance)是编辑距离的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。
允许的编辑操作包括:
- 将一个字符替换成另一个字符
- 插入一个字符
- 删除一个字符
俄罗斯科学家弗拉基米尔·莱文斯坦在1965年提出这个概念。
下面是它的数学定义
字符串相似度的实现
java 全矩阵迭代(动态规划) 实现
1 | public static float getSimilarityRatio(String str, String target) { |
oracle 函数 全矩阵迭代 实现
1 | -- 创建临时表,用于存储矩阵(过程值) |
java 递归实现
递归返回 Levenshtein 距离,相似度可按照 1 - (Levenshtein 距离 / 两字符串最大长度) * 100%
公式计算。
1 | public static int getSimilarityRatio(String str, int strLength, String target, int targetLength) { |
2024-10-09 fix: 添加对中文字符的支持
1 | create FUNCTION func_get_similarity_ratio(str VARCHAR2, target VARCHAR2) RETURN NUMBER DETERMINISTIC IS |
End
这种基于矩阵迭代的算法,时间复杂度和空间复杂度都是 O(m * n) 。其中,m 是第一个字符串的长度,n 是第二个字符串的长度。
对于长字符串效率可能会较低。
0 评论