Я сейчас играю с 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