2010-02-09 23 views
5

Básicamente, lo que estoy buscando es algún tipo de clase o método para implementar un diccionario en PHP. Por ejemplo, si estaba construyendo un descifrador de palabras, digamos que utilicé las letras 'a, e, l, p, p'. El número de posibilidades para el arreglo es enorme: ¿cómo puedo mostrar solo las que son palabras reales (manzana, pálido, etc.)?clase de diccionario PHP? o alternativa?

Gracias!

+4

¿Sabe usted que en PHP, cualquier matriz asociativa es en realidad un diccionario? – amn

Respuesta

3

Los problemas de búsqueda de palabras clásicamente pueden resolverse eficientemente usando un Trie.

Yo sugeriría encontrar una lista de palabras, por ejemplo, de WordNet, almacenarlo en un trie, y luego realizar rápidas búsquedas de palabras posibles.

Una solución sería de la forma:

  1. carga la lista de palabras
  2. tienda de la lista de palabras en un trie
  3. aceptar la entrada de una palabra para descifrar
  4. tratar permutaciones i = 1..N

    a. búsqueda de permutación i usando el trie

    b. si hay un resultado positivo, guárdelo para visualizar

    c. iterate (i ++)

  5. repetición de 3.

edición:

Una nota aquí es que para cualquier palabra de caracteres de longitud N que podría ser N! búsquedas requeridas (para 7 caracteres que serían 5040). Debería considerar realizar algunas optimizaciones para el algoritmo de búsqueda trie. Por ejemplo, obtienes una eficiencia sustancial al descartar las subcadenas no válidas antes de tiempo y no repetir las permutaciones finales.

p. Ej. dada la palabra manzana, si tuviera la permutación en la que seleccionó "ppl" como los primeros tres caracteres, no se encontrará ninguna palabra. Entonces, no importa cómo permutes la a y la e al final no puedes construir una palabra.La terminación temprana de las permutaciones puede ser importante para la eficacia de su algoritmo.

+0

Gracias. Esto tiene sentido =) – Rohan

+0

Esto no ayuda con las palabras codificadas. Primero tiene que normalizarlos como en la respuesta de zerkms –

+0

@Michael, no, simplemente puede probar todas las permutaciones. Como las búsquedas de Trie serán increíblemente rápidas, la penalización por buscar varias veces será baja; para cadenas largas puede haber una gran cantidad de permutaciones, y esta solución no tendrá sentido con palabras mucho más grandes que, digamos, 7 caracteres –

0

Almacene una lista de palabras en un archivo o una base de datos, y luego pruebe todas las combinaciones. También podría considerar la posición probable de las vocales frente a las consonantes para acelerarla potencialmente. En lugar de hacer su propia lista de palabras, podría usar algo como WordNet.

+1

interesante. ¿Cómo usaría WordNet con PHP? – Rohan

+0

Sería bueno que alguien diera una razón para votar esto. De todos modos, en respuesta: http://wordnet.princeton.edu/wordnet/related-projects/#PHP –

3

Ah, y la otra respuesta:

Si lo que desea es obtener todas las palabras reales - y luego encontrar ningún diccionario grande. luego guárdelo en la forma de:

palabra | hash de

donde la palabra es la palabra en sí y el hash está ordenada alfabéticamente letras:

de hash de Apple será: aelpp o aelp2

luego de letras dadas atraviesan todas las combinaciones que utilizan el mismo algo para hash y buscar a través de Esta mesa.

+0

"hash" es la palabra incorrecta. "clave" sería mejor, como en uso como una clave en una tabla hash. –

+0

de acuerdo, "clave" es más relevante aquí – zerkms

+0

Mi pregunta es, ¿dónde obtengo este gran diccionario? – Rohan

2

también se puede considerar pspell

http://php.net/manual/en/book.pspell.php

$ps = pspell_new("en"); 
foreach(array('alppe', 'plape', 'apple') as $word) 
    if(pspell_check($ps, $word)) 
     echo $word; 
+1

A partir de PHP 5.3, pspell ha sido reemplazado por Enchant: http: //www.php .net/manual/es/book.enchant.php – Glacials

0

hecho, me gusta la solución de zerkms mejor, pero aquí hay otra

crear 2 mesas

words 
----- 
word_id (primary key) 
word 


letter_index 
----- 
letter (idx) 
word_id (idx) 

Cuando se agrega una palabra a la tabla de palabras, debe agregar una entrada al l etter_index para cada letra única. letter_index tiene una clave principal basada tanto en la letra como en el word_id.
encontrar palabras que comprenden de un grupo de letras se crea una consulta algo como:

SELECT word FROM words w 
// for each letter in the search 
INNER JOIN letter_index i ON (w.word_id = i.word_id AND i.letter = letter_1) 
INNER JOIN letter_index i ON (w.word_id = i.word_id AND i.letter = letter_2) 
INNER JOIN letter_index i ON (w.word_id = i.word_id AND i.letter = letter_3) 
... 
INNER JOIN letter_index i ON (w.word_id = i.word_id AND i.letter = letter_n) 
0

o, puede utilizar la API de developer.dictionary.com y sólo hacer una búsqueda de la palabra para su validación. también puede realizar verificaciones de ortografía.

Cuestiones relacionadas