这里的问题很简单。我从来没有用红宝石编程..。所以我想我要在这里确认我是否已经接近解决方案了。
挑战:
问题定义:这个Ruby方法应该确保单词"Twitter“拼写正确。
def fix_spelling(name)
if name = "twittr"
name = "twitter"
else
fix_spelling(name)
end
return "name"
end我检查了如何在ruby中构建方法,并给出了以下解决方案:
我发现的问题是:
def fix_spelling(name)
if name = "twittr"
name = "twitter"
end
return name
end
puts fix_spelling("twittr")这是对的吗?
恶作剧:
def fix_spelling(name)
if name == "twittr"
name = "twitter"
end
return name
end
puts fix_spelling(name = "twittr");发布于 2021-01-06 01:40:06
修改和缩短原代码
当前解决方案的一个更短、更实用的版本如下所示:
def fix_spelling name
name == 'twittr' ? 'twitter' : name
end# validate inputs
p %w[twitter twittr twit].map { |word| fix_spelling word }
#=> ["twitter", "twitter", "twit"]但是,这实际上只是返回twittr以外的任何其他值的名称,不管拼写是否正确。如果这是你想要的,好吧。否则,您将需要开发一组case语句或返回值,以“纠正”其他类型的拼写错误。您还可以考虑使用Levenshtein距离或其他启发式方法进行模糊匹配,而不是使用固定字符串或正则表达式将输入映射到输出。
模糊匹配
考虑一下这种替代方法,它使用gem来确定达梅罗-莱文编辑距离是否是拼写正确的单词长度的50%左右,允许额外的单词,并在无法更正时返回以问号括起来的原始单词:
require 'damerau-levenshtein'
WORD_LIST = %w[Facebook Twitter]
def autocorrect word
WORD_LIST.map do |w|
max_dist = (w.length / 2).round
return w if DamerauLevenshtein.distance(w, word) <= max_dist
end
'?%s?' % word
end
# validate inputs
p %w[twitter twittr twit facebk].map { |word| autocorrect word }
#=> ["Twitter", "Twitter", "?twit?", "Facebook"]这并不是真正的“方框中的拼写检查器”,但它为更灵活的框架提供了基础,如果这就是您要做的事情的话。有许多边缘情况,如正确的单词映射,大写,单词词干,和缩写(考虑"fb“的脸书),我排除在这个答案的范围之外,但编辑距离肯定会使你进一步走向一个全面的自动校正的解决方案比最初的例子。你的里程肯定会有变化。
https://stackoverflow.com/questions/65585461
复制相似问题