【懒人精灵】比较两个字符串的相似度,用于OCR低精度识别和匹配

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

相关资料

JavaScript中比较两个文本的相似度:OCR文字识别的巧妙应用

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

企业级大数据智能营销管理系统

源码转让