2012-07-07 96 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