2012-07-07 95 views
2

我今天搜索了一些词,但没有任何帮助。 我不知道现在如果它可能,所以我想我只是在stackoverflow aks。查找类似单词的词

这种情况: 用户可以输入一个单词或输入框中。当他完成一个功能检查单词是否在单词数组中时很容易。现在我想写一个帮助,如果一个字母丢失或者字母写错了方式,应该弹出一条消息。

搜索的关键是什么? 我想:

  • 的JavaScript字符串,找到在阵列
  • JavaScript的数组找到类似的话
  • JavaScript的正则表达式类似的话
  • ...更多

我希望你已了解了我的意思是,可以给我一些提示。

+7

看看这里的Levenshtein距离:HTTP:// en.wikipedia.org/wiki/Levenshtein_distance 以及此处的实现:http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance 它为您提供了单词相似性的度量标准。 – peshkira 2012-07-07 17:21:14

+1

@peshkira这将是一个很好的答案 – Stefan 2012-07-07 21:19:41

回答

1

为见here算法来检查单词之间的相似性。

从那里使用代码,您可以使用array.any?{|e| e.similar?(user_input)}

可以根据实际需要可以调整阈值。 当然,这是红宝石,所以你必须翻译成JavaScript ...

我复制从那里代码:

class String 

    def levenstein(other, ins=2, del=1, sub=1) 

    return nil if self.nil? || other.nil? 

    dm = [] 
    dm[0] = (0..self.length).collect { |i| i * ins} 
    fill = [0] * (self.length - 1) 

    for i in 1..other.length 
     dm[i] = [i * del, fill.flatten] 
    end 

    for i in 1..other.length 
     for j in 1..self.length 
     dm[i][j] = [ 
      dm[i-1][j-1] + (self[i-1] == other[i-1] ? 0 : sub), 
      dm[i][j-1] + ins, 
      dm[i-1][j] + del 
      ].min 
     end 
    end 

    dm[other.length][self.length] 
    end 

    def similar?(other, thresh = 2) 
    self.levenstein(other) < thresh 
    end 

end 

# Tryout 
"Foobar".similar?("Fuubar", 3) # => true