2010-08-13 69 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