5

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)
}

加法:有序参数,现在我有三件事在工作。

韩文字母中没有一个字符丢失。

无论如何,我可以更具体地看到错误吗?我就是想不通。

4

1 回答 1

5

玩弄您的代码,似乎是您KoreanKnownEdits2花费了太长时间。在您的第四个示例(失败的示例)中,model.KoreanEdits1(input_word)is28197的长度和第一个示例的长度model.KoreanEdits1(elem1)23499,这使得大约 6.62 亿个案例可供尝试。在前 14.7 万个之后,该程序似乎失败了,因为它需要的时间太长(操场)。

任何不需要调用KoreanKnownEdits2似乎都可以工作的示例,所以我怀疑你应该重写这个函数以避免详尽的搜索,或者如果你想在操场的时间限制下使用它,至少将它限制在更合理的大小。我没有对你的代码进行足够详细的研究以 100% 确定这一点,但我怀疑 26 个西方字母表使其对英文版来说是可以管理的,而扩展的韩文字母表会使你的输入量太大而无法无论每个字符编码的字节数如何,都在操场的时间限制内处理。

于 2013-11-06T11:46:24.490 回答