golang计算字符串编辑距离Levenshtein算法插件库levenshtein的使用
Golang计算字符串编辑距离Levenshtein算法插件库levenshtein的使用
介绍
levenshtein是一个Go语言包,用于计算字符串之间的Levenshtein距离。该库完全支持非ASCII字符串的处理,但不会对字符串进行标准化处理。如果需要标准化字符串,请在使用库之前自行处理。
安装
go get github.com/agnivade/levenshtein
限制
作为性能优化,该库最多只能处理65536个字符(rune)的字符串。如果需要处理更大的字符串,请使用1.0.3版本。
使用示例
下面是一个完整的示例代码,展示如何使用levenshtein库计算两个字符串之间的编辑距离:
package main
import (
"fmt"
"github.com/agnivade/levenshtein"
)
func main() {
s1 := "kitten"
s2 := "sitting"
distance := levenshtein.ComputeDistance(s1, s2)
fmt.Printf("The distance between %s and %s is %d.\n", s1, s2, distance)
// Output:
// The distance between kitten and sitting is 3.
}
性能基准测试
以下是该库的性能基准测试结果:
name time/op
Simple/ASCII-4 330ns ± 2%
Simple/French-4 617ns ± 2%
Simple/Nordic-4 1.16µs ± 4%
Simple/Tibetan-4 1.05µs ± 1%
name alloc/op
Simple/ASCII-4 96.0B ± 0%
Simple/French-4 128B ± 0%
Simple/Nordic-4 192B ± 0%
Simple/Tibetan-4 144B ± 0%
name allocs/op
Simple/ASCII-4 1.00 ± 0%
Simple/French-4 1.00 ± 0%
Simple/Nordic-4 1.00 ± 0%
Simple/Tibetan-4 1.00 ± 0%
与其他库的比较
name time/op
Leven/ASCII/agniva-4 353ns ± 1%
Leven/ASCII/arbovm-4 485ns ± 1%
Leven/ASCII/dgryski-4 395ns ± 0%
Leven/French/agniva-4 648ns ± 1%
Leven/French/arbovm-4 791ns ± 0%
Leven/French/dgryski-4 682ns ± 0%
Leven/Nordic/agniva-4 1.28µs ± 1%
Leven/Nordic/arbovm-4 1.52µs ± 1%
Leven/Nordic/dgryski-4 1.32µs ± 1%
Leven/Tibetan/agniva-4 1.12µs ± 1%
Leven/Tibetan/arbovm-4 1.31µs ± 0%
Leven/Tibetan/dgryski-4 1.16µs ± 0%
从基准测试结果可以看出,agnivade/levenshtein库在大多数情况下性能优于其他同类库。
更多关于golang计算字符串编辑距离Levenshtein算法插件库levenshtein的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang计算字符串编辑距离Levenshtein算法插件库levenshtein的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang 计算字符串编辑距离 - Levenshtein 算法
Levenshtein 距离(编辑距离)是衡量两个字符串相似度的常用方法,表示将一个字符串转换成另一个字符串所需的最少编辑操作次数(插入、删除或替换字符)。
常用 Levenshtein 算法库
在 Go 中,有几个常用的 Levenshtein 距离计算库:
github.com/agnivade/levenshtein
github.com/texttheater/golang-levenshtein/levenshtein
1. 使用 agnivade/levenshtein
这是最轻量级的实现,只提供核心功能:
package main
import (
"fmt"
"github.com/agnivade/levenshtein"
)
func main() {
str1 := "kitten"
str2 := "sitting"
distance := levenshtein.ComputeDistance(str1, str2)
fmt.Printf("Levenshtein distance between '%s' and '%s' is %d\n", str1, str2, distance)
// 输出: Levenshtein distance between 'kitten' and 'sitting' is 3
}
2. 使用 texttheater/golang-levenshtein
这个库提供了更多功能,包括计算相似度百分比:
package main
import (
"fmt"
"github.com/texttheater/golang-levenshtein/levenshtein"
)
func main() {
str1 := "kitten"
str2 := "sitting"
options := levenshtein.DefaultOptions
distance := levenshtein.DistanceForStrings([]rune(str1), []rune(str2), options)
fmt.Printf("Levenshtein distance: %d\n", distance)
// 计算相似度比率 (0-1)
maxLen := max(len(str1), len(str2))
similarity := 1 - float64(distance)/float64(maxLen)
fmt.Printf("Similarity ratio: %.2f\n", similarity)
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
自定义实现
如果你想了解算法原理,也可以自己实现:
package main
import "fmt"
func levenshteinDistance(s1, s2 string) int {
m := len(s1)
n := len(s2)
// 创建一个二维数组来存储距离
dp := make([][]int, m+1)
for i := range dp {
dp[i] = make([]int, n+1)
}
// 初始化边界条件
for i := 0; i <= m; i++ {
dp[i][0] = i
}
for j := 0; j <= n; j++ {
dp[0][j] = j
}
// 填充dp数组
for i := 1; i <= m; i++ {
for j := 1; j <= n; j++ {
if s1[i-1] == s2[j-1] {
dp[i][j] = dp[i-1][j-1]
} else {
dp[i][j] = min(
dp[i-1][j]+1, // 删除
dp[i][j-1]+1, // 插入
dp[i-1][j-1]+1, // 替换
)
}
}
}
return dp[m][n]
}
func min(nums ...int) int {
m := nums[0]
for _, num := range nums {
if num < m {
m = num
}
}
return m
}
func main() {
str1 := "kitten"
str2 := "sitting"
distance := levenshteinDistance(str1, str2)
fmt.Printf("Custom Levenshtein distance: %d\n", distance)
}
性能比较
对于大多数应用场景,使用现成的库是更好的选择:
agnivade/levenshtein
是最快的实现texttheater/golang-levenshtein
提供了更多功能- 自定义实现适合学习算法原理
实际应用场景
Levenshtein 距离常用于:
- 拼写检查
- 模糊搜索
- DNA序列比对
- 自然语言处理
- 数据清洗和匹配
选择哪个库取决于你的具体需求,如果只需要基本功能,agnivade/levenshtein
是最佳选择;如果需要更多功能如相似度计算,则选择 texttheater/golang-levenshtein
。