admin 发表于 2022-6-10 00:01:58

golang:stringosim比较两个字符串距离/相似度

■实例说明
我们有时候需要比较两个字符串的相似性,这里介绍一个包stringosim
翻译一下就是:
这个包的计划是实现不同的字符串距离/相似度函数,如列文什坦(标准化、加权、达梅罗)、贾罗-温克勒、贾卡德索引、欧几里德距离、汉明距离。
通过实例,我们可以看到,stringosim包提供了好几种比较的方法。
1)我们需要根据自己业务实际情况,通过测试,看那种方法效果好,然后再使用哪种。
2)支持中文比对,当然,我们也可以将中文转换为拼音后再进行比较。转换方法如:http://www.golangcodes.com/forum.php?mod=viewthread&tid=73&extra=page%3D1

更多实例参见:https://github.com/dexyk/stringosim

■实例代码
package main

import (
        "fmt"
        "github.com/dexyk/stringosim"
)

func main() {
        // Jaccard
        // Jaccard距离可以通过设置n-gram的大小来计算,这将用于比较。如果省略了该大小,则将使用默认值1。
        // 输出分值越小表示两者越接近
        srcTxt := "我是中国人"
        targetTxt := "我美国人"
        fmt.Println(stringosim.Jaccard([]rune(srcTxt), []rune(targetTxt), []int{1}))
        // 0.4666666666666667
        fmt.Println(stringosim.Jaccard([]rune(srcTxt), []rune(targetTxt), []int{2}))
        // 0.6111111111111112
        fmt.Println(stringosim.Jaccard([]rune(srcTxt), []rune(targetTxt), []int{3}))
        // 0.7222222222222222

        srcTxt = "我是中国人"
        targetTxt = "我中国人"
        fmt.Println(stringosim.Jaccard([]rune(srcTxt), []rune(targetTxt), []int{1}))
        // 0.16666666666666663
        fmt.Println(stringosim.Jaccard([]rune(srcTxt), []rune(targetTxt), []int{2}))
        // 0.33333333333333337
        fmt.Println(stringosim.Jaccard([]rune(srcTxt), []rune(targetTxt), []int{3}))
        // 0.4666666666666667

        // Jaro and Jaro-Winkler
        // 值越大,则越相似
        fmt.Println(stringosim.Jaro([]rune(srcTxt), []rune(targetTxt)))
        // 0.9333333333333332
        fmt.Println(stringosim.JaroWinkler([]rune(srcTxt), []rune(targetTxt)))
        // 0.94

        // QGram
        // 越小越相似
        fmt.Println(stringosim.QGram([]rune(srcTxt), []rune(targetTxt)))
        // 5

        // Cosine
        // 越小越相似
        fmt.Println(stringosim.Cosine([]rune(srcTxt), []rune(targetTxt)))
        // 0.19417703597461977

        // Levenshtein
        // 越小越相似
        fmt.Println(stringosim.Levenshtein([]rune(srcTxt), []rune(targetTxt)))
        // 1
}



页: [1]
查看完整版本: golang:stringosim比较两个字符串距离/相似度