Essays.club - Ensayos gratis, notas de cursos, notas de libros, tareas, monografías y trabajos de investigación
Buscar

Ejercicio Master Big Data - Mineria de Texto

Enviado por   •  3 de Septiembre de 2022  •  Prácticas o problemas  •  2.118 Palabras (9 Páginas)  •  833 Visitas

Página 1 de 9

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)

...

Descargar como  txt (9.8 Kb)   pdf (100.1 Kb)   docx (151.3 Kb)  
Leer 8 páginas más »
Disponible sólo en Essays.club