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