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

1 回复

更多关于golang计算字符串编辑距离Levenshtein算法插件库levenshtein的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 计算字符串编辑距离 - Levenshtein 算法

Levenshtein 距离(编辑距离)是衡量两个字符串相似度的常用方法,表示将一个字符串转换成另一个字符串所需的最少编辑操作次数(插入、删除或替换字符)。

常用 Levenshtein 算法库

在 Go 中,有几个常用的 Levenshtein 距离计算库:

  1. github.com/agnivade/levenshtein
  2. 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 距离常用于:

  1. 拼写检查
  2. 模糊搜索
  3. DNA序列比对
  4. 自然语言处理
  5. 数据清洗和匹配

选择哪个库取决于你的具体需求,如果只需要基本功能,agnivade/levenshtein 是最佳选择;如果需要更多功能如相似度计算,则选择 texttheater/golang-levenshtein

回到顶部