NLTK: Как определить «labeled_featuresets» при создании ClassifierBasedTagger с помощью nltk? - PullRequest
2 голосов
/ 19 марта 2019

Я сейчас играю с nltk. Я пытаюсь создать различные классификаторы с помощью nltk, выполняя распознавание именованных объектов, чтобы сравнить их результаты. Создать n-граммовые тегеры было легко, однако я столкнулся с некоторыми проблемами при создании ClassifierBasedTagger для наивного Байеса или классификатора дерева решений.

Мои данные в формате conll iob. После прочтения я преобразую его в кортеж, который выглядит следующим образом: (слово, POS-тег), сущность)

Я создал следующий класс, который создает классификаторы:

class ClassifierChunker(ChunkParserI):

def __init__(self, trainSents, tagger,  **kwargs):
    if type(tagger) is not nltk.tag.sequential.UnigramTagger and  type(tagger) is not nltk.tag.sequential.BigramTagger and type(tagger) is not nltk.tag.sequential.TrigramTagger:
        self.featureDetector = tagger.feature_detector
    self.tagger = tagger

def parse(self, sentence):
    chunks = self.tagger.tag(sentence)
    iobTriblets = [(word, pos, entity) for ((word, pos), entity) in chunks]
    return conlltags2tree(iobTriblets)

def evaluate2(self, testSents):
    return self.evaluate([conlltags2tree([(word, pos, entity) for (word, pos), entity in iobs]) for iobs in testSents])

Вот как я это называю:

 #naiveBayers
naiveBayers =  NaiveBayesClassifier.train
naiveBayersTagger = ClassifierBasedTagger(train=completeTaggedSentencesTrain, feature_detector=features, classifier_builder=naiveBayers)
nerChunkerNaiveBayers = ClassifierChunker(completeTaggedSentencesTrain, naiveBayersTagger)
evalNaiveBayers = nerChunkerNaiveBayers.evaluate2(completeTaggedSentencesTest)
print(evalNaiveBayers)

У меня проблема с первой строкой кода (naiveBayers = NaiveBayesClassifier.train). Я знаю, что должен передать функции поезда помеченный набор функций. Однако я не совсем уверен, что это значит. В документации говорится следующее:

: param labeled_featuresets: список классифицированных наборов функций, то есть список кортежей (featureset, label).

Будет ли набор функций словом и меткой сущности?

После обнаружения этой проблемы я провел некоторое исследование и нашел nltk-trainer . Там classifier_builder создается внутри файла args.py , точнее во внутреннем классе "trainf" функции "make_classifier_builder". Однако я понятия не имею, откуда берется переменная train_feats. Возможно, это как-то связано с моим ограниченным пониманием внутренних функций. Я не могу найти, чтобы это нигде не вызывали.

Мне бы очень хотелось, чтобы кто-то указывал мне правильное направление.

редактирование: Я только что прочитал в NLTK 3 Cookbook , что функция feature_detector возвращает набор функций (с.143). Так я должен использовать эту функцию каким-то образом?

Моя текущая функция Детектор выглядит следующим образом и извлечена из этой книги:

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
...