С руководством по извлечению типов вопросов с помощью spaCy

Оглавление

  1. Размышления лингвиста
  2. Решение: извлечение синтаксических признаков на основе правил
  3. Пример: извлечение типа вопроса с помощью spaCy

🌳 Размышления лингвиста

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

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

Обе эти задачи требуют заранее созданных лексиконов для извлечения функций, и существует множество таких лексиконов для публичного использования, например SocialSent и эти, созданные автором Medium. (Также ознакомьтесь с этой исследовательской статьей, в которой обсуждаются различные методы построения лексиконов настроений). Хотя лексические функции сыграли важную роль в разработке многих приложений НЛП, было проведено относительно мало работы, связанной с использованием синтаксических функций (одним большим исключением, возможно, является область обнаружения грамматических ошибок).

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

Язык, представленный НЛП, временами заставлял меня думать о фрагментированном мистере Картофельной голове - двухмерные части тела, разбросанные на странице книжки-раскраски, слова, не связанные друг с другом.

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

Тем не менее, как лингвист (в частности, морфосинтаксис), я, честно говоря, все еще немного зациклен на том факте, что синтаксические особенности не привлекали столько внимания, как лексические особенности в НЛП / МО, и я склонен приписывать эту асимметрию следующему причины:

1. Многократное воздействие на конвейер предварительной обработки и его нормализация, при которой структура не выделяется.

Как изучающие НЛП, мы неоднократно знакомимся с конвейером НЛП, который включает в себя такие методы предварительной обработки, как удаление стоп-слов, лемматизация / выделение корней и представление пакета слов. Эти методы ценны во многих случаях, но по своей сути являются субтрактивными: они удаляют фрагменты синтаксической (и / или морфологической) информации, которые присутствуют в исходном тексте. Удаление стоп-слов устраняет функциональные слова, которые кодируют информацию об отношениях между составляющими / фразами, например, в, от, до,, и и т. Д. Лемматизация и выделение корней удаляет важные флективные особенности, такие как время и согласие, а также производные аффиксы, которые могут иметь решающее значение для определения точного значения слова (например, - er в учитель, - мент в - растрата). И, конечно же, в представлении «мешок слов» не учитывается порядок слов, что является значительной потерей для такого языка, как английский, в котором не используется морфологический падеж для обозначения порядка слов. Когда эти шаги становятся обычными и повторяющимися частями нашего повседневного конвейера НЛП, это может скрыть или свести к минимуму ту роль, которую синтаксическая структура на самом деле действительно играет в обработке естественного языка, что, следовательно, затрудняет или препятствует любым усилиям по систематическому измерить его влияние на модели НЛП.

2. Практические задачи написания сложных языковых правил

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

3. Упрощенный характер человеческой речи в человеко-машинном взаимодействии

Я также пришел к выводу, что некоторые из наших самых популярных и коммерциализированных продуктов НЛП не требуют очень сложных синтаксических представлений входного текста или речи, что делает синтаксические функции менее чем незаменимыми при разработке моделей, которые их используют. Я думаю, что причины в том, что (1) человеческая речь во взаимодействии между машиной и человеком имеет тенденцию быть слишком упрощенной с самого начала («Привет, Google, погода в Сан-Франциско» против «Эй, Джон, не могли бы вы сказать мне, какая сегодня погода в Сан-Франциско?» ”) И (2) простой синтаксический анализ более подходит для менее затратных с точки зрения вычислений систем, чем сложный синтаксический анализ, поэтому мы вынуждены работать с этими ограничениями.

👮 Решение: извлечение синтаксических признаков на основе правил

Чтобы было ясно, три вещи, которые я выделил выше, являются проблемами / препятствиями для использования синтаксических функций, а не оправданиями для их исключения при разработке функций. Хотя я не уверен, насколько синтаксические функции могут повлиять на производительность модели по сравнению с другими функциями, я верю, что, поскольку мы стремимся создавать машины, которые могут взаимодействовать с людьми гораздо более тонко, естественные и сложные способы синтаксического ввода и представления будут играть все более заметную роль в будущем НЛП. Я думаю, что мы очень выиграем, если сделаем в ответ эти три вещи:

  1. Больше экспериментируйте с синтаксическими функциями в наших повседневных усилиях по машинному обучению и инвестируйте в оптимизацию этого процесса, чтобы он стал повторяющейся частью конвейера.
  2. Создайте больше кода с открытым исходным кодом для извлечения лингвистических функций.
  3. Нанимайте больше лингвистов - и помогите им развить технические навыки, если это необходимо. Инвестируйте в них, чтобы получить уникальную прибыль.

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

Правила использования

Еще одно преимущество правил и систем, основанных на правилах, заключается в том, что их можно гибко использовать различными способами и, следовательно, привносить ценность и строгость почти на каждый этап конвейера машинного обучения. Помимо использования их для извлечения функций на этапе разработки функций, их также можно использовать для:

  1. Предварительно маркируйте большие наборы данных для создания шумных обучающих данных во время подготовки данных (функция маркировки).
  2. Исключить определенные аннотации во время предварительной обработки данных (предварительный фильтр)
  3. Отфильтровывать ложные срабатывания из выходных данных классификатора до / во время оценки модели (постфильтр)

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

⛹️‍♂️ Извлечение типа вопроса с помощью spaCy

В этом заключительном разделе я предоставлю практическое руководство по написанию некоторых синтаксических правил для извлечения функций. Для этого я буду использовать spaCy, сосредоточившись на извлечении типа вопроса. Я выбрал тип вопроса, потому что эта категория может особенно хорошо проиллюстрировать невероятную ценность лингвистических знаний в построении частично управляемой правилами модели НЛП. Более того, вероятно, существует множество вариантов использования для извлечения типа вопроса (и, соответственно, типа предложения), поэтому, надеюсь, кому-то пригодится приведенный ниже код. Некоторые приложения, о которых я могу думать, включают: детальную классификацию вопросов (является ли предложение белым вопросом, вопрос с да или нет или вопрос-тег?), Обнаружение речевого акта (является ли комментарий вопросом, запросом или спрос?), сравнительный анализ речи (какой человек или группа использует в своей речи больше стратегий вежливости?) и т. д.

В этом заключительном разделе я в конечном итоге надеюсь продемонстрировать как актуальность лингвистических знаний для разработчиков НЛП, так и актуальность правил или систем, основанных на правилах, в задачах НЛП / машинного обучения .

Написание лингвистических правил: итеративный процесс

При написании лингвистических правил я обычно выполняю следующие шесть шагов:

  1. Определите категории интересов (например, «какой-то вопрос», «полярный вопрос», «не вопрос»).
  2. Придумайте одно или два больших лингвистических обобщения по каждой категории.
  3. Придумайте несколько контрпримеров к обобщениям и при необходимости исправьте / дополните их.
  4. Напишите правила, фиксирующие новые обобщения.
  5. Проверьте правила на множестве примеров.
  6. Настройте правила, устраняя ложные срабатывания и тестируя новые примеры.

Часто эти шаги не могут быть идеально последовательными. Например, определение категорий, на которые вы хотите настроить таргетинг (шаг 1), в основном сводится к формулированию некоторых обобщений о них (шаг 2), поэтому вы можете выполнять эти шаги одновременно. Прежде чем я проиллюстрирую, как этот поток может направлять наше написание правил, давайте немного углубимся в spaCy.

Начало работы с spaCy

SpaCy - это высокопроизводительная библиотека Python, которая может похвастаться многочисленными функциями и возможностями, которые помогут вам создать ваше любимое приложение NLP, включая токенизацию, распознавание именованных сущностей, тегирование части речи, синтаксический анализ зависимостей, предварительно обученные векторы слов и подобие. , и встроенные визуализаторы. Ознакомьтесь с полным набором его функций здесь, но здесь мы рассмотрим только два из его компонентов обработки, tbat позволит нам представить синтаксическую структуру любого предложения, а именно tagger и parser. Базовый процесс использования spaCy выглядит следующим образом: сначала загрузите модель на ваш выбор (например, "en_core_web_sm"). Затем вы можете изучить компоненты конвейера, вызвав pipeline или pipeline_name на nlp.

Затем вызовите nlp, передав строку и преобразовав ее в spaCy Doc, последовательность токенов (строка 2 ниже). Синтаксическая структура Doc может быть построена путем доступа к следующим атрибутам его составляющих токенов:

  • pos_: тег грубой части речи.
  • tag_: детализированный тег части речи.
  • dep_: тег синтаксической зависимости, то есть отношение между токенами.
  • head: синтаксический регулятор или непосредственно доминирующий токен

Я считаю полезным распечатать значения этих атрибутов вместе с именами токенов и индексами в кортежах, например:

Если вы хотите визуализировать синтаксический анализ, введите свое предложение во встроенный визуализатор spaCy displaCy:

Стрелки указывают на зависящие от головы отношения между токенами, и каждый токен помечен тегом POS грубого уровня (точный уровень (tag_) здесь не показан).

Шаги 1–2: Определите категории, о которых вы хотите написать правила, и придумайте лингвистическое обобщение или два для каждой категории.

Эти два шага часто идут рука об руку. Придумывая правила для извлечения типов вопросов, мы должны признать, что в любом языке есть два типа вопросов: белые-вопросы и полярные вопросы. Внимательно прочтите эти обобщения:

Generalizations about question types:
(1) Wh-questions (aka content questions): start with an interrogative word (a “wh-phrase”) like who, what, where, and how, and call for specific information.
(2) Polar questions (aka yes or no questions): can be answered in the affirmative or the negative (with a yes or a no response), and begin with an auxiliary (did, do) or modal (will, can) verb.

Возможно, вам будет полезно визуализировать эти типы вопросов с помощью отображения. Последний снимок экрана содержит синтаксический анализ «белого» вопроса, а вот один - полярного:

В дополнение к визуальному синтаксическому анализу мне нравится видеть тройку pos-tag-dep для каждого токена, например:

Используя свои знания соглашений об аннотациях Penn Treebank (потому что это то, что использует spaCy), вы можете попробовать написать функции v1, которые отражали бы обобщения, приведенные выше. Я обычно предпочитаю писать отдельные функции для разных категорий, а не одну функцию, содержащую сложную логику «если / то». Вот краткая первая версия, пытающаяся уловить обобщения в (1) - (2).

Шаг 3. Придумайте контрпримеры и пересмотрите свои обобщения

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

Два приведенных выше обобщения воспроизводятся здесь, чтобы избавить вас от прокрутки:

(1) Wh-questions (aka content questions): start with an interrogative word (a “wh-phrase”) like who, what, where, and how, and call for specific information.
(2) Polar questions (aka yes or no questions): can be answered in the affirmative or the negative (with a yes or a no response), and begin with an auxiliary (did, do) or modal (will, can) verb.

Вот первая пара контрпримеров к обобщению из (1):

(3) What you say is unbelievable.
(4) Who you're going to kill is not my problem.

Мы видим, что (1) не подтверждается этими предложениями, потому что, несмотря на то, что они начинаются с белого слова, они не являются белыми вопросами! Это то, что лингвисты называют белыми расщелинами или псевдоклефами. Псевдоклефты часто описываются как акцентирующие внимание или «фокус» на части предложения и имеют форму в (5):

(5) free relative + "be" + focused constituent

Свободный родственник - это придаточное предложение wh-relative, в котором (по-видимому) отсутствует заглавное существительное (так что «что вы говорите» вместо «то, что вы говорите»). Эта часть псевдослева вводит тему (о чем идет речь в предложении) и связана со сфокусированной составляющей, которая вводит новую информацию («невероятно») посредством глагола «быть».

Вот несколько дополнительных контрпримеров к (1):

(5) In which article did they talk about spaCy?
(6) To whom did you read the article?

Эти предложения не соответствуют (1) по другой причине: хотя они не начинаются с WH-фразы, как говорится в обобщении, они все же WH-вопросы. в том, что на них можно ответить конкретной информацией (например, ответ на (6) может быть Я прочитал статью своей сестре). Эти предложения представляют собой так называемые пестровые конструкции и характеризуются тем, что слово WH появляется вместе с предлогом, как если бы оно перетащило другое в начало предложения. (6), в частности, можно противопоставить другому предложению, которое связывает предлог »: Кому вы читали статью для? .

Наконец, вот два контрпримера к обобщению полярных вопросов, сформулированному в (2):

(7) Is it going to rain tonight?
(8) Were you sad about her leaving?

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

(1') Wh-questions (aka content questions): contain an interrogative word (a “wh-phrase”) like who, what, where, and how, and call for more specific information.
(2') Polar questions (aka yes or no questions): can be answered in the affirmative or the negative (with a yes or a no response), and display subject-verb inversion where the verb must be either an auxiliary (did, do), a modal (will, can), or a form of the main verb be.

Я думаю, что этот шаг наглядно демонстрирует, что лингвистические знания необходимы для написания сложных правил извлечения признаков. Знание того, что в английском языке используются различные стратегии для обозначения вопросительных предложений, таких как инверсия подлежащего-глагола и wh-движение, а также распознавание (и присвоение имен) интересных языковых явлений, таких как pied-piping и clefting, может помочь вам сформулировать обобщения, которые могут Turn поможет вам написать исчерпывающие правила, которые не будут излишне конкретными.

Шаг 4. Напишите правила

Теперь мы можем изменить более ранние версии функций is_wh_question_v1 и is_polar_question_v1, чтобы они соответствовали новым обобщениям (1 ') и (2'). Эта часть потребует некоторого времени и практики, прежде чем мы сможем чувствовать себя уверенно и комфортно, так что наберитесь терпения! Ниже я выделю несколько основных моментов, которые характеризуют каждую из функций v2:

In is_wh_question_v2:

  • Ссылка на теги spaCy (например, "WDT", "WP" и т. Д.) Делает ваши правила более общими, чем ссылка на отдельные белые слова (строка 3).
  • Pied-piping может быть зафиксирован отношением зависимости между WH-словом и его заголовком (синтаксическим родителем или «регулятором» токена) (строка 8).
  • Псевдослева исключаются путем возврата False, если белое слово находится в csubj или advcl отношении к своему заголовку (строки 11–13).

В is_polar_question_v2 нам нужно учитывать две ситуации:

  1. Вопрос возникает в несвязной конструкции, в которой «есть» (или другая форма «быть», например, «был») функционирует как вспомогательный, например, «Имеет она пользуется spaCy? » (основной глагол здесь - «использовать».)
  2. Вопрос возникает в связной конструкции, в которой «is» функционирует как главный глагол: «Мышь мертва?»
  • Тип 1 отражен в строках 14–16, и обращение предмета по отношению к вспомогательному. (Те же строки кода могут также учитывать модальную инверсию, например «Вы можете прочитать статью?»).
  • Тип II зафиксирован в строках 20–22, и инверсия предмета относится к корню, то есть единственному токену, тег зависимости которого в документе равен "ROOT".
  • Взаимная исключительность полярных вопросов и белых вопросов отражена в строках 9–10.

Шаги 5–6: Протестируйте правила на нескольких примерах и повторите!

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

Когда я запускаю get_question_type(sentences), я получаю следующий результат:

In [352]: get_question_type(sentences)
Is that for real? -- polar
Can you stop? -- polar
Do you love John? -- polar
Are you sad? -- polar
Was she singing? -- polar
Won't you come over for dinner? -- polar
Would you help me? -- polar
Who do you love? -- wh
Whose child is that. -- wh
How do you know him? -- wh
To whom did she read the book? -- wh
I'm hungry. -- not a question
Spacy is so fun! -- not a question
Tell me what you mean. -- not a question
Would love to help you. -- not a question
Don't be sad. -- not a question
Whatever you want. -- wh  # false positive 
What you say is impossible. -- not a question
Where you go, I will go. -- not a question

Все правильно, кроме третьего и последнего предложения: «Как хочешь». С помощью функций v2 мы достигли точности 18/19 = 94,7%. Неплохо! Обратите внимание, что эти правила действительно чувствительны к основной синтаксической структуре каждого предложения, а не к некоторым поверхностным свойствам, таким как наличие вопросительного знака (как показано правильной классификацией примера «Чей это ребенок? . »).

И на всякий случай:

from sklearn.metrics import classification_report
cr = classification_report(true_values, rules_predictions)
print(cr)
                precision    recall  f1-score   support
not a question       1.00      0.88      0.93         8
         polar       1.00      1.00      1.00         7
            wh       0.80      1.00      0.89         4

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

Написание лингвистических правил для НЛП / машинного обучения - это насыщенный итеративный процесс, который требует глубокого понимания языка и способности кодифицировать эти знания в форме общей эвристики на языке программирования. Хотя правила, вероятно, не подходят для автономного использования в большинстве приложений НЛП, а хорошее написание правил почти всегда требует экспертных знаний, они имеют много преимуществ и являются отличным дополнением к алгоритмам машинного обучения. Если я убедил вас в их ценности, пожалуйста, попробуйте spaCy и не стесняйтесь предложить функцию v3 ниже или добавить запрос правил для других функций. :)