【问题标题】:Validate words against an English dictionary in Rails?根据 Rails 中的英语词典验证单词?
【发布时间】:2010-08-13 00:32:44
【问题描述】:

我在 Google 上进行了一些搜索,但找不到我要查找的内容。

我正在用 Rails 开发一个拼字游戏类型的文字游戏,我想知道是否有一种简单的方法可以验证玩家在游戏中输入的内容实际上是一个单词。他们会打出这个词。

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

感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails ruby dictionary


    【解决方案1】:

    你需要两件事:

    1. 单词表
    2. 一些代码

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

    (更新: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 而不是散列,即使散列可能适合您的需要。

    【讨论】:

    • 嗯,这是一个拼字游戏变体类型的游戏,所以任何有声望的(韦伯斯特等人的)字典都可能没问题。我是否只需将代码包装在验证器函数中并用字典 API 替换“usr/share/dict/words”(或我获取单词的来源)?
    • LetterPress 的字典现已开源,available on GitHub
    【解决方案2】:

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

    【讨论】:

    • 对于 ruby​​,您可能想要使用 Set:数组将花费与字典大小成线性比例的时间,如果您使用散列,您将使用键但是不是价值观。
    • 除非字典非常小,否则即使是可怜的解释型 DAWG 也会击败基于散列的 Set。就字典大小而言,DAWG 本质上是 O(1),只有字长会影响它(哈希创建往往也会受到字长的影响),但是与算法有关的所有其他因素 DAWG 会更好。 DAWG 对于大量字符串(单词、DNA 序列等)来说是一种非常正常的结构。
    猜你喜欢
    • 2016-07-18
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多