在考虑可能的拼写错误时,我可以使用什么宝石/算法来查找字符串?

时间:2011-10-18 02:17:11

标签: ruby-on-rails ruby database ruby-on-rails-3 search

我在数据库中有一个大学(学校模型)列表,我有用户输入,应该决定将用户链接到哪个学校。

问题是,人类是错误的。因此,他们可以输入迈阿密大学或波士顿大学而不是波士顿大学,而不是迈阿密大学。

我需要能够找到这些学校,尽管存在这些错误,并且如果不存在确定的匹配,至少为用户提供类似学校名称的列表。我不想使用Sphinx或任何全文独立搜索引擎之类的东西,因为这种搜索仅在注册时发生,字符串很小。

关于解决方案的任何想法?

先谢谢你们。

3 个答案:

答案 0 :(得分:3)

我使用MySQL实现的Soundex哈希函数。 Docs。在为用户提供可能匹配的下拉菜单和“创建新”操作时,效果很好。

答案 1 :(得分:1)

你可以查看text gem,虽然我不认为它对像“波士顿学院”/“波士顿学院”这样的东西有帮助。这些类型的错误范围非常大;我不确定最好的方法是什么。

答案 2 :(得分:0)

我使用的那个叫做基于答案here的打击匹配,虽然它可能更适合变长字符串。

#Returns between 0 and 1 based on how close two strings are
def strikematch(str1, str2)
  str1.downcase! 
  pairs1 = (0..str1.length-2).collect {|i| str1[i,2]}.reject {
    |pair| pair.include? " "}
  str2.downcase! 
  pairs2 = (0..str2.length-2).collect {|i| str2[i,2]}.reject {
    |pair| pair.include? " "}
  union = pairs1.size + pairs2.size 
  intersection = 0 
  pairs1.each do |p1| 
    0.upto(pairs2.size-1) do |i| 
      if p1 == pairs2[i] 
        intersection += 1 
        pairs2.slice!(i) 
        break 
      end 
    end 
  end 
  (2.0 * intersection) / union
end