Ejercicio Master Big Data - Mineria de Texto
Enviado por manoplakos • 3 de Septiembre de 2022 • Práctica o problema • 2.118 Palabras (9 Páginas) • 945 Visitas
Para este ejercicio se va a imaginar que se trabaja para una empresa de envíos de comida, presente en todo el territorio nacional, con miles de pedidos cada día. Dicha empresa tiene un fichero histórico con todas las peticiones de comida que los clientes han realizado mediante el chat de su web en los últimos meses. Necesitan analizar en tiempo real qué comidas están pidiendo los usuarios y qué ingredientes tenían, ya que en la cadena de stock de alimentos es necesario realizar una previsión para no quedarse sin platos cocinados.
El objetivo es programar una función que reciba como input un texto de usuario y devuelva los fragmentos de texto (chunks) que hagan referencia a las comidas y cantidades que ha solicitado.
La salida de la función será un array con diccionarios de 2 elementos (comida y cantidad). Cuando una cantidad no sea detectada, se pondrá su valor a '1' como valor por defecto.
Sin embargo, el alumno deberá usar un NaiveBayesClassifier, en lugar del MaxEntClassifier, para localizar los elementos descritos anteriormente (comida y cantidad). Si el alumno no es capaz de construir un NaiveBayesClassifier —necesario para obtener un 10 en la práctica—, puede realizarlo mediante unigram o bigram tagger —para obtener un 9— o si no mediante RegexParser —un 7—.
Para llevar a cabo la práctica, deberá construirse una cadena NLP con NLTK, con los siguientes elementos:
- segmentación de frases,
- tokenización,
- POS tagger (analizador mofológico para el español).
A continuación, los POS tags obtenidos serán usados por el RegexParser, el UnigramParser, el BigramParser y el NaiveBayesClassifier.
Para el RegexTagger no hay que elaborar un corpus, ya que no requiere entrenamiento, sino solo definir una expresión regular adecuada. Pero para el unigram o bigram tagger, o para el NaiveBayesClassifier, lo primero que hay que hacer es construir un corpus de entrenamiento en el formato IOB, en un fichero de texto que contenga todas las frases de entrenamiento.
Este sería un ejemplo de un fragmento del fichero de entrenamiento para unigram o bigram tagger:
yo PRP O
quería VBD O
una DT I-Cantidad
hamburguesa NN I-Comida
Resultado
import nltk
from nltk.chunk.util import conlltags2tree, tree2conlltags
from nltk import ChunkParserI
import nltk.chunk, nltk.tag
from nltk.corpus import cess_esp
from nltk.tokenize import word_tokenize
from nltk import UnigramTagger, BigramTagger, TrigramTagger, DefaultTagger
class UnigramChunker(nltk.ChunkParserI):
def __init__(self, train_sents):
train_data = [[(t,c) for w,t,c in nltk.chunk.tree2conlltags(sent)]
for sent in train_sents]
self.tagger = nltk.UnigramTagger(train_data)
def parse(self, sentence):
pos_tags = [pos for (word,pos) in sentence]
tagged_pos_tags = self.tagger.tag(pos_tags)
chunktags = [chunktag for (pos, chunktag) in tagged_pos_tags]
conlltags = [(word, pos, chunktag) for ((word,pos),chunktag)
in zip(sentence, chunktags)]
return nltk.chunk.conlltags2tree(conlltags)
class BigramChunker(nltk.ChunkParserI):
def __init__(self, train_sents):
train_data = [[(t,c) for w,t,c in nltk.chunk.tree2conlltags(sent)] for sent in train_sents]
self.tagger = nltk.BigramTagger(train_data)
def parse(self, sentence):
pos_tags = [pos for (words, pos) in sentence]
tagged_pos_tags = self.tagger.tag(pos_tags)
chunktags = [chunktag for (pos, chunktag) in tagged_pos_tags]
conlltags = [(word, pos, chunktag) for ((word,pos),chunktag)
in zip(sentence, chunktags)]
return nltk.chunk.conlltags2tree(conlltags)
class TrigramChunker(nltk.ChunkParserI):
def __init__(self, train_sents):
train_data = [[(t,c) for w,t,c in nltk.chunk.tree2conlltags(sent)]
for sent in train_sents]
self.tagger = nltk.TrigramTagger(train_data)
def parse(self, sentence):
pos_tags = [pos for (word,pos) in sentence]
tagged_pos_tags = self.tagger.tag(pos_tags)
chunktags = [chunktag for (pos, chunktag) in tagged_pos_tags]
conlltags = [(word, pos, chunktag) for ((word,pos),chunktag)
in zip(sentence, chunktags)]
return nltk.chunk.conlltags2tree(conlltags)
#Función que carga el corpus en Español
def corpus_esp():
sents = cess_esp.tagged_sents()
return (sents)
# Funcion de segmentacion de frases
def Segmentacion(menu):
sentences = nltk.tokenize.sent_tokenize(menu)
return (sentences)
# Función de tokenizacion
def Tokenizacion(sentences):
tokens=nltk.word_tokenize(sentences,"spanish")
return(tokens)
# Función de Analisis Morfologico POS Tagger
def Pos_Tag(tokens):
tagged = nltk.pos_tag(tokens)
return(tagged)
# Funcion RegexpParser
def RegPar(menu):
grammar = r'''
Comida: {<CD>*<NN>+} # numero (opcional) + uno o mas nombres (1 bocadillo)
{<JJ>*<NN>+}
{<CD>*<NN><IN>*<NN>+} # numero (opcional) + nombre + preposicion + nombre (1 hamburguesa de soja)
...