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