我知道SOUNDEX和(双)Metaphone,但这些不让我测试整个单词的相似性 - 例如“Hi”听起来非常类似于“Bye”,但这两种方法都是如此将它们标记为完全不同。
Ruby中是否有任何库或您知道的任何方法能够确定两个单词之间的相似性? (布尔值是/不相似,或数字40%相似)
编辑:如果有一种简单的方法可以“放入”不同的方言或语言,可以获得额外的奖励积分!
答案 0 :(得分:8)
我认为你在描述levenshtein距离。是的,有宝石。如果你是纯Ruby,请去文本gem。
$ gem install text
The docs有更多细节,但这里有它的关键:
Text::Levenshtein.distance('test', 'test') # => 0
Text::Levenshtein.distance('test', 'tent') # => 1
如果你对本机扩展程序没问题......
$ gem install levenshtein
It's usage is similar。它的表现非常好。 (它在我的系统上每分钟处理大约1000次拼写纠正。)
如果您需要知道两个单词的相似程度,请使用距离超过单词长度。
如果您想进行简单的相似性测试,请考虑以下内容:
未经测试,但直截了当:
String.module_eval do
def similar?(other, threshold=2)
distance = Text::Levenshtein.distance(self, other)
distance <= threshold
end
end
答案 1 :(得分:0)
您需要的是发音词典。最好的免费软件是CMU Pronouncing Dictionary。
将字符串映射为其发音,然后进行一些预处理(例如,您可能希望删除cmudict用于表示重音的数字),然后可以使用其他人建议的一种技术,例如作为levenshtein距离,在发音字符串而不是输入字符串上。
有关类似内容的示例,请参见Rhyme Ninja中的dict / dict.rb。
答案 2 :(得分:-1)
您可能首先使用同义词库对数据库进行预处理,该数据库会将具有相似含义的单词转换为同一个单词。那里有各种各样的词库数据库,不幸的是我找不到一个像样的免费英语(http://www.gutenberg.org/etext/3202是我发现的那个,但这并没有表明具体词有什么关系(如同类似;相反;替代意义;等等),所以同一行上的所有单词都有某种关系,但你不会知道那种关系是什么)
但是例如匈牙利语有一个很好的免费同义词库数据库,但你没有soundex / metaphone用于匈牙利语文本......
如果你有数据库编写一个预处理文本的程序并不太难(最终它是一个简单的搜索替换,但你可能也想使用simplex或者它还预先处理同义词库数据库)