Jaro-Winkler相似度是一种用于测量两个字符串之间相似度的算法,它特别适合于短字符串的比较,如人名。
-- 计算两个字符串的Jaro-Winkler相似度
-- @param {string} s1 - 第一个字符串
-- @param {string} s2 - 第二个字符串
-- @param {number} [prefixWeight=0.1] - 前缀权重,默认为0.1
-- @returns {number} - 相似度值,范围在0到1之间
function jaroWinklerDistance(s1, s2, prefixWeight)
prefixWeight = prefixWeight or 0.1
-- 确保输入的字符串是字符串类型
s1 = tostring(s1)
s2 = tostring(s2)
-- 计算两个字符串的长度
local len1 = #s1
local len2 = #s2
-- 如果两个字符串长度为0,则返回1
if len1 == 0 and len2 == 0 then
return 1
end
-- 定义匹配窗口大小
local matchDistance = math.floor(math.max(len1, len2) / 2) - 1
-- 初始化匹配数组
local match1 = {}
local match2 = {}
local matches = 0
-- 标记匹配项
for i = 1, len1 do
local start = math.max(0, i - matchDistance - 1)
local end_pos = math.min(i + matchDistance, len2)
for j = start + 1, end_pos do
if s1:sub(i, i) == s2:sub(j, j) and not match2[j] then
match1[i] = true
match2[j] = true
matches = matches + 1
break
end
end
end
-- 如果没有匹配项,则返回0
if matches == 0 then
return 0
end
-- 初始化转置匹配数组
local transpositions = 0
local p1 = 1
local p2 = 1
while p1 <= len1 and p2 <= len2 do
while p1 <= len1 and not match1[p1] do
p1 = p1 + 1
end
while p2 <= len2 and not match2[p2] do
p2 = p2 + 1
end
if p1 <= len1 and p2 <= len2 and s1:sub(p1, p1) ~= s2:sub(p2, p2) then
transpositions = transpositions + 1
p1 = p1 + 1
p2 = p2 + 1
else
p1 = p1 + 1
p2 = p2 + 1
end
end
-- 计算Jaro距离
local jaro = ((matches / len1) + (matches / len2) + ((matches - transpositions / 2) / matches)) / 3
-- 计算前缀长度
local prefixLength = 0
p1 = 1
p2 = 1
while p1 <= len1 and p2 <= len2 and s1:sub(p1, p1) == s2:sub(p2, p2) do
prefixLength = prefixLength + 1
p1 = p1 + 1
p2 = p2 + 1
end
-- 计算Jaro-Winkler距离
local jaroWinkler = jaro + (prefixLength * prefixWeight * (1 - jaro))
return jaroWinkler
end
print(jaroWinklerDistance("关丽", "美丽")) -- 0.666667
print(jaroWinklerDistance("包裹", "包惠")) -- 0.766667
相关资料
1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】比较两个字符串的相似度,用于OCR低精度识别和匹配
飞云脚本圈: 586333520

Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】比较两个字符串的相似度,用于OCR低精度识别和匹配