Метка части речи назначает метки словам во входном тексте. Например, популярный набор тегов Penn Treebank имеет около 40 меток, таких как «множественное число существительное», «сравнительное прилагательное», «глагол прошедшего времени» и т. Д. Теггер также разрешает некоторую неоднозначность. Например, многие английские словоформы могут быть существительными или глаголами, но в контексте других слов их часть речи однозначна.
Итак, аннотировав свой текст с помощью POS-тегов, вы можете ответить на такие вопросы, как: сколько у меня существительных? Сколько предложений не содержит глагола? И т. Д.
Для чат-бота вам, очевидно, нужно гораздо больше. Вы должны выяснить предметы и объекты в тексте, и к какому глаголу (предикату) они присоединяются; вам нужно разрешить анафорам (на кого указывает он или она указывает), какова область отрицания и квантификаторы (например, каждые , более 3 ) и т. д.
В идеале вам необходимо отобразить введенный текст в какое-то логическое представление (например, логику первого порядка), которое позволит вам привести аргументацию, чтобы определить, эквивалентны ли два предложения по смыслу, или в зависимости от соответствия, и т. Д.
Пока POS-тегер сопоставляет предложение
Mary likes no man who owns a cat.
к такой структуре
Mary/NNP likes/VBZ no/DT man/NN who/WP owns/VBZ a/DT cat/NN ./.
Вы бы предпочли что-то вроде этого:
SubClassOf(
ObjectIntersectionOf(
Class(:man)
ObjectSomeValuesFrom(
ObjectProperty(:own)
Class(:cat)
)
)
ObjectComplementOf(
ObjectSomeValuesFrom(
ObjectInverseOf(ObjectProperty(:like))
ObjectOneOf(
NamedIndividual(:Mary)
)
)
)
)
Конечно, хотя POS-тегеры получают точность и возвращают значения, близкие к 100%, более сложная автоматическая обработка будет работать намного хуже.
Хорошей библиотекой Java для NLP является LingPipe . Однако это не выходит за рамки POS-тегов, разбиения на фрагменты и распознавания именованных сущностей.