НЛП | Чанкинг на основе классификатора | Комплект 1

Опубликовано: 24 Июля, 2021

Класс ClassifierBasedTagger class учится на функциях, в отличие от большинства тегеров части речи. ClassifierChunker class может быть создан таким образом, чтобы он мог обучаться как по словам, так и по тегам части речи, а не только по тегам части речи, как это TagChunker class .

3-кортежи (word, pos, iob) преобразуются в 2-кортежи ((word, pos), iob) с помощью chunk_trees2train_chunks() из tree2conlltags() , чтобы оставаться совместимыми с форматом 2-кортежей (word, pos) требуется для обучения ClassiferBasedTagger class .

Код # 1: давайте разберемся




# 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]

Теперь необходимо передать функцию детектора признаков в ClassifierBasedTagger. Любая функция обнаружения признаков, используемая с классом ClassifierChunker (определенным далее), должна распознавать, что токены представляют собой список кортежей (word, pos) и имеют ту же сигнатуру функции, что и prev_next_pos_iob (). Чтобы дать классификатору как можно больше информации, этот набор функций содержит текущее, предыдущее и следующее слово и тег части речи вместе с предыдущим тегом IOB.

Код # 2: функция детектора




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

Теперь ClassifierChunker class который использует внутренний ClassifierBasedTagger с обучающими предложениями из chunk_trees2train_chunks() и функциями, извлеченными с помощью prev_next_pos_iob() . Как подкласс ChunkerParserI , ClassifierChunker реализует метод parse() для преобразования кортежей ((w, t), c), созданных внутренним теггером, в деревья с помощью conlltags2tree()

Код № 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) , chunks]) in chunks])

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.