题
我知道SOUNDEX和(双)音位,但这些并不让我测试单词的相似性作为一个整体 - 例如“你好”的声音非常相似,“再见”,但是这两种方法将它们标记为完全不同的。
是否有任何的Ruby库,或你知道的任何方法中,能够确定两个单词之间的相似性? (任一个布尔是/不相似的,或数值40%相似)
编辑:如果有一个简单的方法,以不同的方言或语言“在下降”额外奖励积分
解决方案
我觉得你描述Levenshtein距离。是的,还有该宝石。如果你到纯Ruby去的文本宝石。
$ 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 是我找到了一个,但是这并不能显示什么关系的特定的词有(像类似;相反,交替意义,等等),所以对所有的字同一行有部分的关系,但你不会知道,关系是什么)
但例如匈牙利有一个很好的免费词库数据库,但是你没有同音/音位匈牙利文本...
如果您有数据库编写预处理文本是不是太狠了计划(最终这是一个简单的搜索替换,但你可能使用单面或methaphone太想预处理词库数据库)
不隶属于 StackOverflow