Ruby on rails 考虑到可能的拼写错误,我可以使用什么gem/算法来查找字符串?

Ruby on rails 考虑到可能的拼写错误,我可以使用什么gem/算法来查找字符串?,ruby-on-rails,ruby,database,ruby-on-rails-3,search,Ruby On Rails,Ruby,Database,Ruby On Rails 3,Search,我在数据库中有一个学院列表(学校模型),我有用户输入,可以决定将用户链接到哪个学校 问题是,人类是容易犯错的。所以,除了迈阿密大学,他们还可以在迈阿密或波士顿学院开设大学,而不是波士顿学院。 我需要能够找到这些学校,尽管这些错误,至少提供给用户一个类似的学校名称列表,如果一个明确的匹配不存在。我不想使用Sphinx或任何全文独立搜索引擎,因为这种搜索只发生在注册时,而且字符串很小 有什么解决办法吗 提前谢谢各位。你们可以查看一下,尽管我认为这对“波士顿学院”/“波士顿学院”之类的东西没什么帮助。

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

问题是,人类是容易犯错的。所以,除了迈阿密大学,他们还可以在迈阿密或波士顿学院开设大学,而不是波士顿学院。 我需要能够找到这些学校,尽管这些错误,至少提供给用户一个类似的学校名称列表,如果一个明确的匹配不存在。我不想使用Sphinx或任何全文独立搜索引擎,因为这种搜索只发生在注册时,而且字符串很小

有什么解决办法吗


提前谢谢各位。

你们可以查看一下,尽管我认为这对“波士顿学院”/“波士顿学院”之类的东西没什么帮助。这些类型错误的范围相当大;我不确定最好的解决办法是什么。

你可以查看一下,尽管我认为这对“波士顿学院”/“波士顿学院”这样的事情没有帮助。这些类型错误的范围相当大;我不确定处理这个问题的最佳方法是什么。

我使用的方法叫做基于答案的删除匹配,尽管它可能更适合于可变长度字符串

#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

我使用的是基于答案的删除匹配,尽管它可能更适合于可变长度字符串

#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

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

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

一种可能的解决方案是利用jQuery的自动完成功能。@hmind:您的标题中说,您的算法后。。。一个简单的方法是:对于每一所学校,根据用户输入的内容计算“Levenhstein编辑距离”。如果学校数据库是正确的,那么编辑距离最小的数据库将是最有可能匹配的数据库。当你做这些事情的时候,你会觉得很别致,但是简单地计算所有的编辑距离,然后从最小的距离中进行选择,就会得到很好的结果。算法本身只有几行代码(还有一个很好的“动态编程”版本),一个可能的解决方案是利用jQuery的自动完成功能。@hmind:你的标题说你的算法后。。。一个简单的方法是:对于每一所学校,根据用户输入的内容计算“Levenhstein编辑距离”。如果学校数据库是正确的,那么编辑距离最小的数据库将是最有可能匹配的数据库。当你做这些事情的时候,你会觉得很别致,但是简单地计算所有的编辑距离,然后从最小的距离中进行选择,就会得到很好的结果。算法本身只有几行代码(还有一个很好的“动态编程”版本)很好,从来都不知道mysql已经内置了soundex。postgres似乎还支持soundex和difference函数以及其他一些文本算法。不错,我从来不知道mysql内置了soundex。postgres似乎还支持soundex和difference函数以及其他一些文本算法。