2011-10-18 9 views
9

Dato, diciamo, una ricetta (elenco di ingredienti, passi, ecc.) In forma di testo libero, come potrei analizzare in modo tale da poter estrarre gli ingredienti (ad es. Quantità, unità di misure, nome dell'ingrediente, ecc.) in PHP?Elaborazione del linguaggio naturale in PHP

Supponiamo che il testo libero sia in qualche modo formattato.

+1

Definire "* un po '* formattato". –

+0

Pronuncia "1 tazza di latte", "latte, 1 tazza", "pizzico di sale", "2 lattine di latte 250 ml" ... – StackOverflowNewbie

+1

Possibile duplicato di http://stackoverflow.com/questions/4457830/nlp-programmazione -tools-con-php – rid

risposta

7

Per farlo 'correttamente', è necessario definire una sorta di grammatica, e quindi forse usare un parser LALR o alcuni strumenti come yacc, bison o Lex per costruire un parser. Supponendo che non vuoi farlo, il suo strpos() ftw!

0

Senza un sacco di modellazione linguistica, penso che l'unico modo sarebbe avere una lista enorme di ingredienti e cercarli nella ricetta. La quantità dovrebbe essere la parola immediatamente prima dell'ingrediente.

1

C'è molto simile a question per Java. In breve, hai bisogno di dizionari (di, per esempio, ingredienti) e di espressioni regolari rispetto ai termini (annotazioni). Puoi farlo in Java e invocarlo da PHP tramite il servizio web o puoi provare a ri-implementarlo in PHP (nota che nel secondo caso potresti avere un rallentamento significativo).

3

C'è openNlp in java per l'estrazione nome dell'entità che può prendervi ciò che cerchi vedere questo: http://opennlp.sourceforge.net/models-1.5/

Quindi è possibile utilizzare il connettore php-java per ottenere risultati in php.

0

Se si desidera eseguire questa operazione rapidamente e raccogliendo la quantità minima di raccolta di risorse, è possibile che si ottengano alcune buone euristiche e alcune espressioni regolari.

Poiché si dice che la lista è "un po 'formattata", lavorerò sul presupposto che esiste una direttiva ingrediente per riga.

Vorrei iniziare con una lista di nomi di misure, che sono una classe relativamente chiusa (come la chiamiamo in linguistica), come $measurements=['cup', 'tablespoon', 'teaspoon', 'pinch', 'dash', 'to taste', ...]. Si potrebbe anche creare un dizionario che associa diversi elementi a un valore normalizzato (quindi $measurements={cup:['cup', 'c'], tablespoon:['tablespoon', 'tbsp', 'tablesp', ...], ...} o quant'altro.)

Quindi, su ogni riga, è possibile trovare l'unità di misura se si trova nel dizionario. Successivamente, cerca i numeri (che possono essere formattati come decimali - per esempio 1,5 - o come frazioni complesse - ad es. 2 1/2 o 2-1/2) e supponiamo che sia il conteggio delle unità di cui hai bisogno. Se non ci sono numeri, allora puoi semplicemente supporre che l'unità sia una (come forse è il caso di "assaggiare" e simili).

Infine, si può supporre che tutto ciò che rimane sia l'ingrediente reale.

Immagino che questa euristica copra il 75-80% dei casi. Avrai ancora un sacco di casi d'angolo, come quando la ricetta richiede "2 arance", o - peggio! - "Succo di 2 arance". In questi casi, vorresti aggiungerli (durante una sorta di curazione offline) come eccezioni, o lasciarti "OK" se non vengono trattati correttamente.

Problemi correlati