НЛП | Чанкинг на основе классификатора | Комплект 1
Класс 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. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.