http://play.golang.org/p/H5E0ExL85d
我已经用 Go 实现了一些 Peter Norvig 的拼写检查算法。
奇怪的是,前三个调用正确地给了我想要的输出。
但从第二个开始,它就说“过程太长了”。
有人可以看看我的代码并告诉我出了什么问题吗?
这是可能出错的片段。
在英文版中使用相同的代码,一切都完美无缺。
UNICODE 格式和边界因语言而异,因为英语每个字母包含 1 个字节,而亚洲语言在这种情况下每个字符包含 3 个字节。
这是试图运行与运行完美的英语算法相同的算法。但这不起作用。
total_set := []string{}
for _, elem := range splits {
if len(elem.str2) > 3 {
//deletion
total_set = append(total_set, elem.str1+elem.str2[3:])
//replace
for i:=0; i<len(koreanletter)/3; i++ {
total_set = append(total_set, elem.str1+string(koreanletter[3*i:3*(i+1)])+elem.str2[3:])
}
//transpose
if len(elem.str2) > 9 {
total_set = append(total_set, elem.str1+string(elem.str2[3:6])+string(elem.str2[:3])+elem.str2[9:])
}
} else {
//deletion
total_set = append(total_set, elem.str1)
}
//insertion
for _, c := range koreanletter {
total_set = append(total_set, elem.str1+string(c)+elem.str2)
}
return RemoveDuplicateStringArrayForKorean(total_set)
}
英文版如下。这是完美的工作。
//Edits1 is to measure the distance between strings.
func (model *Model) Edits1(word string) []string {
const alphabet = "abcdefghijklmnopqrstuvwxyz"
splits := []Pair{}
for i := 0; i <= len(word); i++ {
splits = append(splits, Pair{word[:i], word[i:]})
}
total_set := []string{}
for _, elem := range splits {
if len(elem.str2) > 0 {
//deletion
total_set = append(total_set, elem.str1+elem.str2[1:])
//replace
for _, c := range alphabet {
total_set = append(total_set, elem.str1+string(c)+elem.str2[1:])
}
//transpose
if len(elem.str2) > 1 {
total_set = append(total_set, elem.str1+string(elem.str2[1])+string(elem.str2[0])+elem.str2[2:])
}
} else {
//deletion
total_set = append(total_set, elem.str1)
}
//insertion
for _, c := range alphabet {
total_set = append(total_set, elem.str1+string(c)+elem.str2)
}
}
return RemoveDuplicateStringArrayLowerCase(total_set)
}
加法:有序参数,现在我有三件事在工作。
韩文字母中没有一个字符丢失。
无论如何,我可以更具体地看到错误吗?我就是想不通。