Использование паттернов последовательностей слов для классификации и генерации текста
Выбери формат для чтения
Загружаем конспект в формате docx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Поиск паттернов
Для категоризации текста, выделения из него определенных фраз или вычисления семантического подобия другому тексту приложению необходимо «понимать» высказывания пользователей и генерировать осмысленные ответы на них.
В этой лекции мы рассмотрим использование паттернов (закономерностей) последовательностей слов для классификации и генерации текста.
Паттерны последовательностей слов
Паттерн последовательности слов (word sequence pattern) состоит из признаков слов, накладывающих на каждое слово последовательности определенные требования. Например, фраза I can соответствует следующему паттерну последовательности слов: «местоимение + вспомогательный модальный глагол». Нахождение паттернов последовательностей слов позволяет распознавать последовательности слов со схожими языковыми признаками, а значит, и распределять входные данные по категориям и должным образом их обрабатывать Например, при получении вопроса, начинающегося с последовательности слов, которая соответствует паттерну «вспомогательный модальный глагол + имя собственное» (как фраза Can George), ясно, что он относится либо к способности, возможности или разрешению что-то сделать, либо к обязанности, налагаемой на кого-то или что-то, описываемое именем собственным.
В следующих разделах вы научитесь классифицировать предложения с помощью распознавания распространенных закономерностей лингвистических признаков.
Поиск паттернов лингвистических признаков
Поиск паттернов в текстах необходим по той причине, что в большинстве случаев в тексте не бывает двух совершенно одинаковых предложений: обычно текст состоит из разных предложений, содержащих разные слова. Писать отдельный код для обработки каждого предложения текста нерационально.
К счастью, некоторые выглядящие совершенно разными предложения имеют одинаковые паттерны последовательности слов. Возьмем, к примеру, такие два предложения: We can overtake them. You must specify it. У них нет ни одного общего слова. Но, если взглянуть на метки синтаксической зависимости слов этих предложений, станет ясна общая закономерность, как показано в следующем сценарии:
doc1 = nlp(u'We can overtake them.')
doc2 = nlp(u'You must specify it.')
for i in range(len(doc1)-1):
if doc1[i].dep_ == doc2[i].dep_:
print(doc1[i].text, doc2[i].text, doc1[i].dep_, spacy.explain(doc1[i].dep_))
Поскольку число слов в предложениях одинаково, можно пройти по словам обоих предложений в одном цикле. Если метка зависимости одинакова для слов с идентичными индексами, то выводим эти слова, присвоенную им метку и ее описание.
В результате должно быть выведено:
We You nsubj nominal subject
can must aux auxiliary
overtake specify ROOT None
them it dobj direct object
Как видите, список меток зависимости одинаков для обоих предложений. Это значит, что предложения строятся по одному паттерну последовательности слов, который описывается метками синтаксической зависимости таким образом: «подлежащее + вспомогательный глагол + глагол + прямое дополнение».
Обратите внимание, что списки тегов частей речи (общих и уточненных) для этих примеров предложений также совпадают. Если заменить все ссылки на атрибуты .dep_ на .pos_ в предыдущем сценарии, получим следующие результаты:
We
You
PRON
pronoun
can
must
VERB
verb
overtake
specify
VERB
verb
them
it
PRON
pronoun
Эти предложения соответствуют не только паттерну меток синтаксической зависимости, но и паттерну тегов частей речи.
Попробуйте сами
В предыдущем примере мы создали два объекта Doc — по одному для каждого примера предложения. На практике же текст обычно состоит из множества предложений, вследствие чего создавать объект Doc для каждого предложения нерационально. Перепишите сценарий таким образом, чтобы создавался один общий объект Doc. Затем воспользуйтесь свойством doc.sents, с которым вы познакомились ранее, для манипуляций с обоими предложениями.
Впрочем, учтите, что doc.sents — объект-генератор — не индексируется и, значит, к его элементам нельзя обращаться по индексам. Для решения этой проблемы преобразуйте doc.sents в список: sents = list(doc.sents)
И конечно, для получения sents в требуемом для нашего цикла порядке можно пройти по doc.sents в цикле for.