2010-08-13 68 views
8

我已经做了一些谷歌搜索,但找不到我在找什么。在Rails中验证单词是否符合英文字典?

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

是否验证某些英文字典数据库在应用程序中加载的最佳解决方法?如果是这样,是否有任何库提供这种功能?如果不是,你会建议什么?

感谢您的帮助!

回答

2

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

+0

对于ruby,你可能想要使用一个'Set':一个数组需要一个与字典大小成线性比例的时间,如果你使用了一个散列,你可以使用键而不是值。 – 2010-08-13 02:51:16

+0

除非字典非常小,否则甚至是一个可怜的和解释的DAWG都会击败基于散列的Set。 DAWG在字典大小方面本质上是O(1),只有字长会影响它(哈希创建往往也受字大小的影响),但是与算法有关的所有其他因素DAWG都表现得更好。 DAWG对于大量字符串(字,DNA序列等)来说是一个非常正常的结构。 – 2010-08-13 07:47:47

11

你需要两样东西:

  1. 单词列表
  2. 一些代码

的词列表是棘手的部分。在大多数Unix系统上,有一个单词列表/usr/share/dict/words/usr/dict/words - 有关更多详细信息,请参阅http://en.wikipedia.org/wiki/Words_(Unix)。我的Mac上有一个文件有234,936字。但它们并不是全部有效的拼字游戏单词。所以你必须以某种方式获得Scrabble字典,确保你有正确的许可证来使用它,并处理它,所以它是一个文本文件。

(更新:为LetterPress这个词列表现在是open source,并available 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 

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

+0

嗯,这是一个拼字游戏变体类型的游戏,所以任何有声望的(webster's et al)字典都可能没问题。我只是将代码包装在一个验证器函数中,并用字典API替换“usr/share/dict/words”(或者我得到这些单词的来源)? – dartfrog 2010-08-14 07:03:17

+0

[LetterPress](http://www.atebits.com/letterpress/)的字典现在是开源的,[在GitHub上可用](https://github.com/atebits/Words)。 – AlexChaffee 2013-03-11 17:19:03