检测Ruby中类似的发音词
我知道SOUNDEX和(双)Metaphone,但这些不让我测试整个单词的相似性 – 例如“Hi”听起来非常类似于“Bye”,但这两种方法都会标记它们完全不同。
Ruby中是否有任何库或您知道的任何方法能够确定两个单词之间的相似性? (布尔值是/不相似,或数字40%相似)
编辑:如果有一种简单的方法可以“插入”不同的方言或语言,可以获得额外奖励积分!
我想你在描述levenshtein的距离。 是的,有gem。 如果你是纯粹的Ruby,请去文本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
您可以先使用同义词库对数据库进行预处理,该数据库会将具有相似含义的单词转换为同一个单词。 那里有各种各样的词库数据库,遗憾的是我找不到一个像样的免费英语( http://www.gutenberg.org/etext/3202是我发现的那个,但这并没有表明具体的关系是什么单词有(类似;相反;替代意义;等等),所以同一行上的所有单词都有一些关系,但你不会知道那个关系是什么)
但是例如匈牙利语有一个很好的免费同义词库数据库,但你没有soundex / metaphone用于匈牙利语文本……
如果你有数据库编写一个预处理文本的程序不是太难(最终它是一个简单的搜索替换,但你可能想要使用Simplex或者它还预先处理同义词库数据库)