algorithm - oración - oraciones para bendecir los alimentos para imprimir
Extraer alimentos de las oraciones. (5)
Demasiado para un comentario, pero no realmente una respuesta:
Creo que al menos se acercaría más si tuviera dos alimentos sin un separador adecuado y los combinara en un solo alimento. Eso daría mantequilla de maní, jalea de sándwich, café.
Si tiene el inglés correcto, puede detectar este caso por conteo / no-conteo. Corrigiendo el original a "Comí un sándwich de mantequilla de maní y jalea y una taza de café para el desayuno". La mantequilla no es importante, no puedes tener "una mantequilla", pero puedes tener "un sándwich". Por lo tanto, el a debe aplicarse al sándwich y, a pesar de la "mantequilla de maní" y el "sándwich de jalea", debe ser el mismo artículo: "sándwich de mantequilla de maní y jalea". ¡Tu frase equivocada se analizaría de otra manera, sin embargo!
Sin embargo, me sorprendería mucho si pudiera proponer reglas generales que cubran todos los casos. Llegaría a este tipo de cosas pensando que algunas fugas y necesitarían una base de datos para atrapar.
Dada una frase:
Comí un sándwich de mantequilla de maní y jalea y una taza de café para el desayuno.
Quiero poder extraer de ella los siguientes alimentos:
mantequilla de cacahuete y mermelada
café
Hasta ahora, usando el etiquetado POS, he podido extraer los alimentos individuales, es decir,
maní, mantequilla, jalea, sándwich, café
Pero como dije, lo que necesito es un sándwich de mantequilla de maní y jalea en lugar de los artículos individuales.
¿Hay alguna forma de hacer esto sin tener un corpus o base de datos de alimentos en el backend?
Primero extraiga todas las frases de Noun utilizando Chunking de NLTK (código copiado desde here ):
import nltk
import re
import pprint
from nltk import Tree
import pdb
patterns="""
NP: {<JJ>*<NN*>+}
{<JJ>*<NN*><CC>*<NN*>+}
{<NP><CC><NP>}
{<RB><JJ>*<NN*>+}
"""
NPChunker = nltk.RegexpParser(patterns)
def prepare_text(input):
sentences = nltk.sent_tokenize(input)
sentences = [nltk.word_tokenize(sent) for sent in sentences]
sentences = [nltk.pos_tag(sent) for sent in sentences]
sentences = [NPChunker.parse(sent) for sent in sentences]
return sentences
def parsed_text_to_NP(sentences):
nps = []
for sent in sentences:
tree = NPChunker.parse(sent)
print(tree)
for subtree in tree.subtrees():
if subtree.label() == ''NP'':
t = subtree
t = '' ''.join(word for word, tag in t.leaves())
nps.append(t)
return nps
def sent_parse(input):
sentences = prepare_text(input)
nps = parsed_text_to_NP(sentences)
return nps
if __name__ == ''__main__'':
print(sent_parse(''I ate peanut butter and beef burger and a cup of coffee for breakfast.''))
Esto colocará etiquetas POS en sus oraciones y utiliza un analizador de expresiones regulares para extraer Frases nominales.
1. Defina y refine su expresión nominal de expresiones nominales
Tendrá que cambiar los patrones de expresión regular para definir y refinar sus frases de nombre. Por ejemplo, es decirle al analizador que un NP seguido de un coordinador (CC) como '''' y '''' y otro NP es en sí mismo un NP.
2. Cambie de NLTK POS tagger a Stanford POS tagger
También noté que el etiquetador POS de NLTK no está funcionando muy bien (por ejemplo, considera que tenía cacahuete como una frase verbal. Puede cambiar el etiquetador POS a Stanford Parser si lo desea.
3.Retire frases de nombre más pequeño:
Una vez que haya extraído todas las frases de Nombres para una oración, puede eliminar las que forman parte de una frase de nombre más grande. Por ejemplo, en el siguiente ejemplo, la hamburguesa de carne de res y la mantequilla de maní deben eliminarse porque forman parte de una frase sustantiva más grande: mantequilla de maní y hamburguesa de carne de res .
4.Elimine las frases nominales que ninguna de las palabras están en un léxico de alimentos.
obtendrá frases de nombre como el autobús escolar . si ninguno de la escuela y el autobús está en un léxico de alimentos que puede compilar de Wikipedia o WordNet, entonces se elimina la frase nominal. En este caso, retire la taza y el desayuno porque, con suerte, no están en el léxico de su comida.
El código actual devuelve
[''peanut butter and beef burger'', ''peanut butter'', ''beef burger'', ''cup'', ''coffee'', ''breakfast'']
para la entrada
print(sent_parse(''I ate peanut butter and beef burger and a cup of coffee for breakfast.''))
Puede buscar n-gramas en su texto donde varía el valor de n. Por ejemplo, si n = 5 entonces extraería "sándwich de mantequilla de maní y jalea" y "taza de café para el desayuno", según el lugar en el que comience su búsqueda en el texto para grupos de cinco palabras. No necesitarás un corpus de texto o una base de datos para que el algoritmo funcione.
Puede intentarlo sin utilizar un conjunto entrenado que contenga un conjunto de alimentos, pero el enfoque también funcionará sin él.
En lugar de hacer un etiquetado POS simple, haga un análisis de dependencia combinado con el etiquetado POS. De esa manera sería posible encontrar relaciones entre múltiples tokens de la frase, y analizar el árbol de dependencias con condiciones restringidas, como las dependencias de nombre-nombre, podrá encontrar la parte relevante.
Puedes usar spacy para analizar . Aquí está la salida de displacy:
- Puede usar los datos disponibles gratuitamente aquí, o algo mejor: https://en.wikipedia.org/wiki/Lists_of_foods como un conjunto de capacitación para crear un conjunto básico de alimentos (los hipervínculos en el árbol arrastrado)
- En función del análisis de dependencia de sus nuevos datos, puede continuar enriqueciendo los datos base. Por ejemplo: si ''mantequilla'' existe en su cuerpo y ''mantequilla de maní'' es un par de fichas que se encuentran con frecuencia, entonces ''maní'' y ''mantequilla de maní'' también se agregan al cuerpo.
- El corpus se puede mantener en un archivo que se puede cargar en la memoria mientras se procesa, o en una base de datos como redis, aerospike, etc.
- Asegúrese de trabajar con mayúsculas normalizadas, es decir, con caracteres especiales limpiados, con palabras lemmatizadas / con vástago, tanto en el corpus como en los datos de procesamiento. Eso aumentaría su cobertura y precisión.
Un enfoque basado en reglas con un léxico de todos los alimentos funcionaría aquí.
Puedes usar GATE para el mismo y usar las reglas de JAPE con él.
En el ejemplo anterior, su regla de jape tendría una condición para encontrar todos (np cc np) && np en "FOOD LEIXCON"
Puede compartir un código jape detallado en un evento en el que planea ir por esta ruta.