PNL | Fragmentación basada en clasificador | Serie 1

El ClassifierBasedTagger classaprende de las funciones, a diferencia de la mayoría de los etiquetadores de parte del discurso. ClassifierChunker classse puede crear de manera que pueda aprender tanto de las palabras como de las etiquetas de parte del discurso, en lugar de solo de las etiquetas de parte del discurso como lo TagChunker classhace.

Las tuplas de 3 (palabra, pos, iob) se convierten en tuplas de 2 ((palabra, pos), iob) mediante chunk_trees2train_chunks()from tree2conlltags(), para seguir siendo compatibles con el formato de 2 tuplas (palabra, pos) necesario para entrenar un ClassiferBasedTagger class.
 
Código #1: Entendamos

# Loading Libraries
from nltk.chunk import ChunkParserI
from nltk.chunk.util import tree2conlltags, conlltags2tree
from nltk.tag import ClassifierBasedTagger
  
def chunk_trees2train_chunks(chunk_sents):
  
    # Using tree2conlltags
    tag_sents = [tree2conlltags(sent) for 
                 sent in chunk_sents]
  
    3-tuple is converted to 2-tuple
    return [[((w, t), c) for 
             (w, t, c) in sent] for sent in tag_sents]

Ahora, se necesita una función de detector de características para pasar a ClassifierBasedTagger. Cualquier función detectora de características utilizada con la clase ClassifierChunker (definida a continuación) debe reconocer que los tokens son una lista de tuplas (palabra, pos) y tienen la misma firma de función que prev_next_pos_iob(). Para dar al clasificador tanta información como sea posible, este conjunto de funciones contiene la palabra actual, anterior y siguiente y la etiqueta de parte del discurso, junto con la etiqueta IOB anterior.
 

Código #2: función detector

def prev_next_pos_iob(tokens, index, history):
      
    word, pos = tokens[index]
    if index == 0:
        prevword, prevpos, previob = ('<START>', )*3
    else:
        prevword, prevpos = tokens[index-1]
        previob = history[index-1]
          
    if index == len(tokens) - 1:
        nextword, nextpos = ('<END>', )*2
    else:
        nextword, nextpos = tokens[index + 1]
        feats = {'word': word,
                 'pos': pos,
                 'nextword': nextword,
                 'nextpos': nextpos,
                 'prevword': prevword,
                 'prevpos': prevpos,
                 'previob': previob
                 }
    return feats

Ahora, ClassifierChunker classes necesario que use un interno ClassifierBasedTagger con oraciones de entrenamiento chunk_trees2train_chunks()y características extraídas usando prev_next_pos_iob(). Como una subclase de ChunkerParserI, ClassifierChunker implementa el parse()método para convertir las tuplas ((w, t), c), producidas por el etiquetador interno en Trees usandoconlltags2tree()

Código #3:

class ClassifierChunker(ChunkParserI):
    def __init__(self, train_sents, 
                 feature_detector = prev_next_pos_iob, **kwargs):
          
        if not feature_detector:
            feature_detector = self.feature_detector
            train_chunks = chunk_trees2train_chunks(train_sents)
            self.tagger = ClassifierBasedTagger(train = train_chunks,
            feature_detector = feature_detector, **kwargs)
              
    def parse(self, tagged_sent):
          
        if not tagged_sent: return None
        chunks = self.tagger.tag(tagged_sent)
          
        return conlltags2tree(
                [(w, t, c) for ((w, t), c) in chunks])

Publicación traducida automáticamente

Artículo escrito por Mohit Gupta_OMG 🙂 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *