检测Ruby中类似的发音词

JP.*_*JP. 4 ruby phoneme

我知道SOUNDEX和(双)Metaphone,但这些不让我测试整个单词的相似性 - 例如"Hi"听起来非常类似于"Bye",但这两种方法都会标记它们完全不同.

Ruby中是否有任何库或您知道的任何方法能够确定两个单词之间的相似性?(布尔值是/不相似,或数字40%相似)

编辑:如果有一种简单的方法可以"插入"不同的方言或语言,可以获得额外奖励积分!

Lev*_*evi 8

我想你在描述levenshtein的距离.是的,有宝石.如果你是纯Ruby,请去文本gem.

$ gem install text
Run Code Online (Sandbox Code Playgroud)

文档有更多细节,但这里有它的关键:

Text::Levenshtein.distance('test', 'test')    # => 0
Text::Levenshtein.distance('test', 'tent')    # => 1
Run Code Online (Sandbox Code Playgroud)

如果你对本机扩展没问题......

$ gem install levenshtein
Run Code Online (Sandbox Code Playgroud)

它的用法类似.它的表现非常好.(它在我的系统上每分钟处理大约1000次拼写纠正.)

如果您需要知道两个单词的相似程度,请使用距离超过单词长度.

如果你想要一个简单的相似性测试,考虑这样的事情:

未经测试,但直截了当:

String.module_eval do
   def similar?(other, threshold=2)
    distance = Text::Levenshtein.distance(self, other)
    distance <= threshold
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 哦,当然这没有考虑到两个角色之间的可变距离; 转换为IPA:'微笑 - >蜗牛=>smaɪl - >sneɪl`将有一个小的Levenshtein距离,其中`步态 - >晚=> /geɪt/ - > /leɪt/`将具有相同的距离,但是蜗牛和由于"g"和"l"之间的语音差异以及"n"和"m"之间的相似性(想象一下像'fan'和'fang'这样的词),微笑的声音比步态和晚期更相似.假设我可以创建一个准确的数字地图,说明各种声音之间的转换成本,这可以导入到红宝石Leveinshtein吗? (2认同)