2010-08-13 16 views
8

Ich habe einige Google-Suche gemacht, konnte aber nicht finden, wonach ich suchte.Validieren Sie Wörter in Rails mit einem englischen Wörterbuch?

Ich entwickle ein Scrabble-ähnliches Wortspiel in Rails und habe mich gefragt, ob es einen einfachen Weg gibt zu validieren, was der Spieler im Spiel eingibt. Sie würden das Wort eingeben.

Ist die Validierung gegen eine Art von Englisch Wörterbuch Datenbank innerhalb der App am besten zur Lösung dieses Problems geladen? Wenn ja, gibt es Bibliotheken, die diese Art von Funktionalität bieten? Wenn nicht, was würden Sie vorschlagen?

Danke für Ihre Hilfe!

Antwort

2

Ein Stück sprachunabhängiger Ratschlag hier ist, dass wenn Sie nur für die Existenz eines Wortes interessieren (was in einem solchen Fall Sie tun), und Sie planen, die gesamte Datenbank in die Anwendung zu laden (die Ihre Abfrage schlägt vor, dass Sie in Betracht ziehen) dann ein DAWG ermöglicht es Ihnen, die Existenz in O (n) Zeit Komplexität zu überprüfen, wobei n die Größe des Wortes ist (Wörterbuch Größe hat keine Wirkung - insgesamt ist die Suche im Wesentlichen O (1)) Obwohl einige Einfügungen die Größe der Struktur tatsächlich reduzieren, hat eine DAWG für "top, tap, taps, tops" weniger Knoten als eine für "tops, tap".

+0

Für Ruby, würden Sie wahrscheinlich ein 'Set' verwenden wollen: ein Array würde eine Zeit linear proportional zur Wörterbuchgröße nehmen, und wenn Sie einen Hash verwenden, würden Sie die Schlüssel verwenden, aber nicht die Werte. –

+0

Wenn das Wörterbuch nicht sehr klein ist, schlägt die selbst eine schlechte und interpretierte DAWG ein Hash-basiertes Set. DAWG ist im Wesentlichen O (1) in Bezug auf die Dictionary-Größe, nur Word-Größe beeinflusst es (Hash-Erstellung wird auch von Wortgröße beeinflusst), aber mit allen anderen Faktoren in Bezug auf die Algorithmen DAWG kommt besser aus. DAWG ist eine ziemlich normale Struktur für große Sätze von Strings (Wörter, DNA-Sequenzen usw.). –

11

Sie müssen zwei Dinge:

  1. eine Wortliste
  2. einige Code

Die Wortliste ist der schwierige Teil. Auf den meisten Unix-Systemen gibt es eine Wortliste unter /usr/share/dict/words oder /usr/dict/words - siehe http://en.wikipedia.org/wiki/Words_(Unix) für weitere Details. Der auf meinem Mac hat 234.936 Wörter. Aber es sind nicht alle gültigen Scrabble-Wörter. Sie müssten also irgendwie ein Scrabble-Wörterbuch erwerben, sicherstellen, dass Sie über die richtige Lizenz verfügen, um es zu verwenden, und es so verarbeiten, dass es eine Textdatei ist.

(Update:. Die Wortliste für LetterPress ist jetzt open source und available on GitHub)

Der Code ist kein Problem im einfachen Fall. Hier ist ein Skript, das ich gerade jetzt aufgepeitscht:

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"] 

Dies wird Ausgang

true 
nil 

Ich lasse es als eine Übung für die Leser es in ein richtigen Worten Objekt zu machen. (Technisch ist es kein Wörterbuch, da es keine Definitionen hat.) Oder eine DAWG anstelle eines Hash zu verwenden, obwohl ein Hash für Ihre Bedürfnisse wahrscheinlich in Ordnung ist.

+0

Nun, es ist ein Scrabble-Variante-Spiel, so würde jedes seriöse (Webster's et al) Wörterbuch wahrscheinlich in Ordnung sein. Würde ich den Code einfach in eine Validator-Funktion einfügen und "usr/share/dict/words" (oder die Quelle, wo ich die Wörter erhalte) durch eine Wörterbuch-API ersetzen? – dartfrog

+0

Das Wörterbuch für [LetterPress] (http://www.atebits.com/letterpress/) ist jetzt Open Source und [verfügbar auf GitHub] (https://github.com/atebits/Words). – AlexChaffee

Verwandte Themen