Пример сегментации предложений на nltk.org с помощью наивного байесовского классификатора: как .sent отдельные предложения и как алгоритм ML улучшает его? - PullRequest
0 голосов
/ 16 декабря 2018

В nltk.org книга (глава 6) приведен пример, где они используют алгоритм Найве-Байеса, чтобы классифицировать символ пунктуации как завершение предложения или не завершение одного ...

Вот что они делают: сначала они берут корпус и используют метод .sent, чтобы получить предложения и построить из них указатель того, где находятся знаки препинания, которые их разделяют (boundaries).

Затем они «токенизируют» текст (преобразуют его в список слов и символов пунктуации) и применяют следующий алгоритм / функцию к каждому токену, чтобы получить список функций , которыевозвращается в словаре:

def punct_features(tokens, i):
    return {'nextWordCapitalized': tokens[i+1][0].isupper(),
        'prevWord': tokens[i-1].lower(),
        'punct': tokens[i],
        'prevWordis1Char': len(tokens[i-1]) == 1}

Эти функции будут использоваться алгоритмом ML для классификации символа пунктуации как заканчивающего предложение или нет (т.е. как маркер границы).

С этимfn и индекс 'Границы', они выбирают все маркеры пунктуации, каждый со своими особенностями, и помечают их как True border или False one, создавая таким образом список помеченных наборов объектов :

featuresets1 = [(punct_features(tokens, i), (i in boundaries)) for i in range(1, len(tokens)-1)
               if tokens[i] in '.?!;']
print(featuresets1[:4])

Это пример того эффекта, который мы можем получить при печати первых четырех комплектов:

[({'nextWordCapitalized': False, 'prevWord': 'nov', 'punct': '.', 'prevWordis1Char': False}, False), 
({'nextWordCapitalized': True, 'prevWord': '29', 'punct': '.', 'prevWordis1Char': False}, True), 
({'nextWordCapitalized': True, 'prevWord': 'mr', 'punct': '.', 'prevWordis1Char': False}, False), 
({'nextWordCapitalized': True, 'prevWord': 'n', 'punct': '.', 'prevWordis1Char': True}, False)]

При этом они обучают и оценивают классификатор пунктуации:

size = int(len(featuresets) * 0.1)
train_set, test_set = featuresets[size:], featuresets[:size]
classifier = nltk.NaiveBayesClassifier.train(train_set)

nltk.classify.accuracy(classifier, test_set)

Теперь, (1) как и что мог бы улучшить такой алгоритм ML?Я не могу понять, как он мог бы улучшить первый простой алгоритм, который просто проверяет, является ли следующий токен из символа пунктуации заглавными, а предыдущий - строчными.Действительно, этот алгоритм используется для проверки того, что символ является границей ...!И если это не улучшит его, для чего это может быть полезно?

И связано с этим: (2) является ли какой-либо из этих двух алгоритмов тем, как nlpk действительно разделяет предложения?Я имею в виду, особенно, если лучшим является первый простой, понимает ли nltk, что предложения - это просто текст между двумя символами пунктуации, за которыми следует слово с первой диаграммой в верхнем регистре и предыдущее слово в нижнем регистре?Это то, что делает метод .sent?Обратите внимание, что это далеко от того, как лингвистика или, точнее говоря, Оксфордский словарь определяет предложение:

"Набор слов, который сам по себе полон, обычно содержит тему и предикат, передающий утверждение, вопрос, восклицательный знак или команда, и состоит из основного предложения, а иногда и одного или нескольких подчиненных предложений. "

Или (3) уже являются необработанными корпусными текстами, такими как treebank или brownделится на предложения вручную?- В таком случае, по какому критерию их выбирают?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Одна вещь, которую (иначе отличный) принятый ответ не учитывает, - это объяснение того, что делает алгоритм NaiveBayes помимо применения описанного вами правила.

Любому классификатору этого типа присваивается несколько признаков, и он должен решить, насколько они важны в качестве ключей для классификации. Заглавная буква следующей буквы = очень важно, строчная буква предыдущей буквы = важно, но менее важно, пробел после этой пунктуации = важно и т. Д. В алгоритмах машинного обучения используется некоторый подход к назначению весов (= важности) для каждого признака, так что результаты настолько хороши, насколько может обеспечить алгоритм.Некоторые могут сделать это за один шаг, другие делают это за несколько шагов, где каждая итерация немного улучшает предыдущий результат («восхождение на гору»).

Детали различны для каждого алгоритма машинного обучения, а также особенностиНаивный байесовский здесь не важен.Но для полноты: это статистический расчет, основанный на предположении (обычно противоречащем действительности, но это удобно), что каждый признак статистически независим от всех остальных.

0 голосов
/ 16 декабря 2018

Вопрос (1) : NLTK, возможно, не прояснил, но сегментация предложений - трудная проблема.Как вы сказали, мы можем начать с предположения, что маркер пунктуации заканчивает предложение, т. Е. Предыдущий символ - нижний регистр, текущий символ - пунктуация, следующий символ - верхний регистр (кстати, между ними есть пробелы! Не забывайте!).Однако рассмотрим следующее предложение:

«Мистер Питер работает в компании ABC Inc. в Торонто. Его чистая зарплата в месяц составляет $ 2344,21. 22 года назад он приехал в Торонто в качестве иммигранта».- Теперь, следуя нашему правилу выше, как это будет разделено?

Страница Википедии о неоднозначности границ предложений иллюстрирует еще несколько этих проблем.В учебнике НЛП «Обработка речи и языка» Юрафски и Мартина также есть глава по нормализации текста , в которой приведено еще несколько примеров того, почему сегментация слов / предложений может быть сложной - это может быть полезно дляВы, чтобы понять это.Я предполагаю, что мы обсуждаем сегментацию английского языка, но ясно, что есть другие проблемы с другими языками (например, нет заглавных букв в некоторых языках).

Q 2: любой из этих двух алгоритмов, как на самом деле nlpk* разделяет предложения? NLTK использует метод сегментации предложений без присмотра, называемый PunktSentenceTokenizer

Q3: являются ли необработанные тексты корпусов, такие как древовидный или коричневый, уже разделенными на предложения вручную? - Да, они были вручную разделены на предложения.Это некоторые распространенные корпусы, используемые в NLP для разработки языковых инструментов, таких как POS-тегеры, парсеры и т. Д. Одной из причин их выбора может быть то, что они уже доступны в NLTK, и нам не нужно искать другой аннотированный корпус человека, чтобы сделатьконтролируемое обучение обнаружению границ предложений.

...