在Rails中验证英语词典中的单词?

时间:2010-08-13 00:32:44

标签: ruby-on-rails ruby dictionary

我已经完成了一些谷歌搜索,但找不到我想要的东西。

我正在开发一个拼字游戏类型的单词游戏,并且想知道是否有一种简单的方法来验证玩家在游戏中输入的内容实际上是一个单词。他们正在打字。

对应用程序中加载的某种英语词典数据库进行验证是解决此问题的最佳方法吗?如果是这样,有没有提供此类功能的库?如果没有,你会建议什么?

感谢您的帮助!

2 个答案:

答案 0 :(得分:12)

你需要两件事:

  1. 一个单词列表
  2. 一些代码
  3. 单词列表是棘手的部分。在大多数Unix系统上,/usr/share/dict/words/usr/dict/words都有一个单词列表 - 有关详细信息,请参阅http://en.wikipedia.org/wiki/Words_(Unix)。我Mac上的那个有234,936个单词。但它们并非都是有效的拼字游戏。因此,您必须以某种方式获取Scrabble字典,确保您拥有使用它的正确许可,并处理它以使其成为文本文件。

    (更新:LetterPress的单词列表现为open sourceavailable on GitHub。)

    在简单的情况下,代码没有问题。这是我刚才掀起的剧本:

    words = {}
    File.open("/usr/share/dict/words") do |file|
      file.each do |line|
        words[line.strip] = true
      end
    end
    p words["magic"]
    p words["saldkaj"]
    

    这将输出

    true
    nil
    

    我把它作为练习让读者把它变成一个合适的Words对象。 (从技术上讲,它不是一个字典,因为它没有定义。)或者使用DAWG而不是散列,即使散列可能适合您的需要。

答案 1 :(得分:2)

这里有一条与语言无关的建议,如果你只关心一个单词的存在(在这种情况下,你这样做),并且你打算将整个数据库加载到应用程序中(你的查询建议你正在考虑)然后DAWG将使你能够检查O(n)时间复杂度的存在​​,其中n是单词的大小(字典大小没有影响 - 整体上查找基本上是O( 1)),虽然在内存方面是一个相对最小的结构(事实上,一些插入实际上会减小结构的大小,“top,tap,tap,tops”的DAWG节点比“tops,tap”的节点少“)。