В 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
делится на предложения вручную?- В таком случае, по какому критерию их выбирают?