我在数据库中有一个大学(学校模型)列表,我有用户输入,应该决定将用户链接到哪个学校。
问题是,人类是错误的。因此,他们可以输入迈阿密大学或波士顿大学而不是波士顿大学,而不是迈阿密大学。
我需要能够找到这些学校,尽管存在这些错误,并且如果不存在确定的匹配,至少为用户提供类似学校名称的列表。我不想使用Sphinx或任何全文独立搜索引擎之类的东西,因为这种搜索仅在注册时发生,字符串很小。
关于解决方案的任何想法?
先谢谢你们。
答案 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