2011-10-18 21 views
9

Dado, por ejemplo, una receta (lista de ingredientes, pasos, etc.) en forma de texto libre, ¿cómo podría analizar eso de forma que pueda extraer los ingredientes (por ejemplo, cantidad, unidad de mediciones, nombre del ingrediente, etc.) usin PHP?Procesamiento del lenguaje natural en PHP

Supongamos que el texto libre es algo formateado.

+1

Define "* algo * formateado". –

+0

Diga "1 taza de leche", "leche, 1 taza", "pizca de sal", "2 latas de leche de 250 ml" ... – StackOverflowNewbie

+1

Posible duplicado de http://stackoverflow.com/questions/4457830/nlp-programming -tools-using-php – rid

Respuesta

7

Para hacerlo "correctamente", debe definir algún tipo de gramática, y luego tal vez usar un analizador LALR o algunas herramientas como yacc, bison o Lex para construir un analizador. Asumiendo que no quieres hacer eso, es strpos() ¡ftw!

0

Sin una tonelada de modelado de lenguaje, creo que la única manera sería tener una gran lista de ingredientes y buscarlos en la receta. La cantidad debe ser la palabra inmediatamente anterior al ingrediente.

1

Hay question muy similar para Java. En resumen, necesita diccionarios (por ejemplo, ingredientes) y lenguaje similar a expresiones regulares sobre términos (anotaciones). Puede hacerlo en Java e invocarlo desde PHP a través del servicio web o puede intentar implementarlo en PHP (tenga en cuenta que, en el segundo caso, puede experimentar una desaceleración significativa).

3

Hay OpenNLP en java para la extracción de nombre de la entidad que pueden alcanzar lo que busca ver esto: http://opennlp.sourceforge.net/models-1.5/

continuación, puede utilizar el conector php-java para obtener resultados en php.

0

Si desea hacer esto rápidamente, y con la recolección de la menor cantidad de recolección de recursos, probablemente pueda encontrar algunas buenas heurísticas y algunas expresiones regulares.

Como dices que la lista está "un tanto formateada", trabajaré en la suposición de que hay una directiva de ingredientes por línea.

Comenzaré por crear una lista de nombres de mediciones, que son una clase relativamente cerrada (como la llamamos en lingüística), como $measurements=['cup', 'tablespoon', 'teaspoon', 'pinch', 'dash', 'to taste', ...]. Incluso puede encontrar un diccionario que asigne varios elementos a un valor normalizado ($measurements={cup:['cup', 'c'], tablespoon:['tablespoon', 'tbsp', 'tablesp', ...], ...} o lo que sea)

Luego, en cada línea, puede encontrar la unidad de medida si está en su diccionario. A continuación, busque números (que pueden formatearse como decimales, por ejemplo, 1.5, o como fracciones complejas, por ejemplo, 2 1/2 o 2-1/2), y suponga que es el recuento de las unidades que necesita. Si no hay números, puede suponer que la unidad es uno (como en el caso de "probar" y similares).

Finalmente, puede suponer que todo lo que queda es el ingrediente real.

Imagino que esta heurística cubriría el 75-80% de sus casos. Todavía tendrás muchas cajas de esquina, como cuando la receta requiere "2 naranjas", o ¡peor! - "Jugo de 2 naranjas". En estos casos, podría querer agregarlos (durante algún tipo de curaduría fuera de línea) como excepciones, o permitirse estar "bien" con que no se los trate adecuadamente.

Cuestiones relacionadas