El ClassifierBasedTagger class
aprende de las funciones, a diferencia de la mayoría de los etiquetadores de parte del discurso. ClassifierChunker class
se 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 class
hace.
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 class
es 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