Descarga de planos

Necesitaba probar diferentes cosas con un conjunto de datos de fórmulas sensatamente enorme, para jugar con algún festín arreglando los pensamientos. El problema era que no tenía un conjunto de datos.

Olvídalo, pensé, hay montones de planes en línea. ¡Utilizaré una parte de ellos!

Debido a la implantación de organizaciones de información como el microformato de la fórmula h y el esquema de la fórmula de Schema.org, un gran número de los planes distribuidos en línea aumentan semánticamente. Mucho mejor, hay una perla de Rubí llamada Hangry para analizar estas configuraciones. En cuestión de segundos, estaba transformando los planes en información organizada.

Lo que más me gustaba eran los arreglos, y aquí llegué a mi siguiente número: Tenía arreglos comprensibles de fijaciones, sin embargo nada organizado adecuadamente para mirar cantidades, descubrir similitudes, o convertir unidades.

Los ingredientes son duros

Los primeros ejemplos que miré parecían bastante simples:

 “2 cucharadas de mantequilla”,

 “2 cucharadas de harina”,

 “1/2 taza de vino blanco”,

 “1 taza de caldo de pollo”,

Parecía que un patrón claro estaba emergiendo, y tal vez una línea de código Ruby sería suficiente:

cantidad, unidad, nombre = descripción.split(” “, 3)

Lamentablemente, la verdad era sustancialmente más desconcertante. Descubrí un número cada vez mayor de modelos que no encajaban en este sencillo ejemplo. Unos pocos fijadores tenían numerosas cantidades que deberían haberse unido (“3 tazas y 2 cucharadas”, o “2 fajos de 10 onzas”); otros tenían cantidades electivas en métrico y magnífico, o en tazas y onzas; otros perseguían el nombre del fijador con directrices de planificación, o registraban diferentes fijadores juntos en una cosa similar.

Los casos poco comunes se amontonaban cada vez más elevados, y mi sencillo código Ruby se enredó cada vez más. Dejé de gustar el código, en ese momento, dejé de sentir que estaría bien después de la refactorización, y al final lo descarté.

Necesitaba un arreglo completamente diferente.

Reconocimiento de la sustancia nombrada

Esto parecía como si la cuestión ideal para la IA gestionada -tenía montones de información que necesitaba clasificar; la disposición física de un modelo solitario era verdaderamente simple; sin embargo, distinguir físicamente un ejemplo general era, en el mejor de los casos, difícil, e incluso desde un punto de vista pesimista inconcebible.

Después de pensar en mis elecciones, un reconocedor de sustancias con nombre se parecía al aparato correcto a utilizar. Los reconocedores de sustancias nombradas distinguen clasificaciones precaracterizadas en el contenido; para mi situación necesitaba uno para percibir el nombre, las cantidades y las unidades de fijaciones.

Me decidí por el NER de Stanford, que utiliza un modelo de agrupación de campo arbitrario contingente. Para ir directamente al grano, no comprendo las matemáticas detrás de este tipo específico de modelo, sin embargo, puedes examinar el papel1 en caso de que necesites todas las malditas sutilezas. Lo importante para mí era que podía preparar este modelo de NER sin ningún otro conjunto de datos.

El procedimiento que seguí para preparar mi modelo dependía del modelo de Jane Austen del NER de Stanford.

Preparando el modelo

Lo principal que hice fue reunir la información de mi modelo. Dentro de una fórmula solitaria, la forma en que se componen las fijaciones es muy uniforme. Necesitaba asegurarme de tener un alcance decente de las configuraciones, así que uní las fijaciones de unos 30.000 planos en línea en un resumen solitario, las arreglé arbitrariamente, y elegí las 1.500 iniciales para que fueran mi juego de preparación.

Se parecía a esto:

azúcar de pastelería para espolvorear el pastel

1 1/2 tazas de salmón ahumado cortado en dados

1/2 taza de almendras enteras (3 onzas), tostadas

Luego, utilicé una pieza de la suite de aparatos de PNL de Stanford para dividirlos en fichas.

La dirección acompañante examinará el contenido de la información estándar y entregará fichas de rendimiento estándar:

java – cp stanford-ner.jar edu.stanford.nlp.process.PTBTokenizer

Para esta situación, necesitaba montar un modelo que comprendiera una representación fija solitaria, no un arreglo completo de representaciones fijas. En el discurso de la PNL, eso implica que cada representación fija debe ser vista como un informe diferente. Para hablar de eso con los instrumentos de Stanford NER, tenemos que aislar cada arreglo de fichas con una línea clara.

Los separé utilizando un poco de contenido de la cáscara:

mientras se lee la línea; hacer

 echo $line | java -cp stanford-ner.jar edu.stanford.nlp.process.PTBTokenizer >> train.tok

 eco >> train.tok

hecho < tren.txt

La salida se veía así:

Confiteros

azúcar

para

desempolvar

el

pastel

1 1/2

tazas

en cubitos

fumado

salmón

1/2

taza

todo

almendras

-LRB-

3

oz

-RRB-

,

tostado

El último avance manual fue etiquetar las fichas, demostrando cuál era un trozo del nombre de una fijación, cuál era un trozo de la cantidad, y cuál era un trozo de la unidad. 1.500 modelos eran alrededor de 10.000 fichas, cada una nombrada a mano – nunca dejes que nadie te revele la IA es todo un encanto.

Cada ficha necesita una marca, incluso las fichas que no son intrigantes, que se nombran con O. Stanford NER anticipa que las fichas y la marca deben ser aisladas por un carácter de ficha. Para empezar, marqué cada ficha con O:

perl -ne ‘chomp; $_ =~ /^$/ ? print “\n” : print “$_\tO\n”‘ \N

 train.tok > train.tsv

Varias horas después en Vim, los resultados se veían algo así:

confiteros NOMBRE

N              OMBRE

azúcar           NOMBRE

para             O

desempolvar         O

la             O

pastel            O

1 1/2           CANTIDAD

tazas            UNIT

cubo           O

N         OMBRE FUMADO

salmón          NOMBRE

1/2             CANTIDAD

taza             UNIT

todo           O

almendras         NOMBRE

-LRB-           O

3               CANTIDAD

oz              UNIDAD

-RRB-           O

,               O

tostado         O

Ahora que el set de entrenamiento estaba terminado, podía construir el modelo:

java -cp stanford-ner.jar edu.stanford.nlp.ie.crf.CRFClassifier \

 -TrenFile train.tsv \ ~ -TrenFile train.tsv

 -serializar a ner-modelo.ser.gz

 -prop train.prop

El archivo train.prop que utilicé era muy similar al archivo de ejemplo de las preguntas frecuentes del NER de Stanford, austen.prop.

¡Y ahí lo tenía! Un modelo que podría clasificar nuevos ejemplos.