Delbot понимает ваши голосовые команды, ищет новости и источники знаний, обобщает и зачитывает вам контент.

TL; DR: если вы хотите сразу погрузиться в код, перейдите в Delbot, мой репозиторий GitHub для этого проекта.

Посмотрите демо видео!

Вступление

Боты остаются горячей темой. Все о них говорят.

Как насчет того, чтобы создать его с нуля? Простой, который мы построим сегодня, будет понимать и отвечать на такие вопросы, как:

  • Какие последние новости о «Звездных войнах» в «Нью-Йорк Таймс»?
  • Кто такой Дональд Трамп?
  • Прочтите мне последние новости о Брексите.
  • Что такое тройки RDF?
  • Кем была Жанна д'Арк?
  • Сообщите мне новости о правительстве Великобритании от Guardian.

Наша цель - написать код бота с нуля и при этом использовать обработку естественного языка (NLP).

Кроме того, наш бот будет с голосовым управлением и веб-интерфейсом, если вы также заполните раздел веб-приложения. Самое приятное, что нам не нужно делать ничего особенного для распознавания и синтеза речи: мы будем использовать встроенные возможности современных веб-браузеров.

На высоком уровне мы хотим понимать два основных типа запросов. Ниже приводится блок-схема.

Новости

Мы можем запросить новости. Например.:

Какие новости о фантастических тварях в Guardian?

Бот запросит API запрошенного источника новостей (New York Times, если он не указан) и суммирует результаты:

[…] Сравнение первого фильма о Гарри Поттере («Гарри Поттер и философский камень» 2001 года) с последним («Гарри Поттер и Дары смерти, часть вторая» 2011 года) в некоторой степени сродни сравнению Бэмби с «Бешеными собаками». Мы впервые встречаемся с ним в 1920-х годах в Нью-Йорке - почти за 60 лет до рождения Гарри - где он находится […]

(Источник: https://www.theguardian.com/books/2016/nov/25/jk-rowling-fantastic-beasts-screenplay)

Знания

Мы можем задать вопрос о знаниях. Например.:

Что такое тройки RDF?

И бот ответит:

Семантическая тройка или просто тройка - это атомарный объект данных в структуре описания ресурсов. \ NЭтот формат позволяет представлять знания в машиночитаемом виде. В частности, каждая часть тройки RDF адресуется индивидуально с помощью уникальных URI \ u2014, например, второй оператор выше может быть представлен в RDF как http: //example.name#BobSmith12 http://xmlns.com/foaf /0.1/knows «помещhttp://example.name#JohnDoe34

(Источник: https://en.wikipedia.org/wiki/Semantic_triple)

Как это работает

Мы определяем простое правило для категоризации входных данных: если запрос содержит одно из слов новости или последний, это запрос новостей. В противном случае это запрос знаний.

Функция предсказать класса QueryAnalyzer является основной точкой входа для нашего бота. Он выполняет указанную выше категоризацию. Он вызывает другие функции для

  1. Извлеките запрос и, если применимо, источник из входных данных.
  2. Сделайте необходимые вызовы API
  3. Обобщите длинное содержание

Наконец, он возвращает результат и флаг, указывающий, была ли ошибка.

Новостные запросы

Мы предполагаем, что входные данные могут быть одной из следующих форм.

  • Какие последние новости о "Звездных войнах" в газете New York Times?
  • Прочтите мне последний о Брексите.
  • Сообщите мне новости о фильмах о кинематографической вселенной Marvel в 2017 году от The Guardian.

Части речи и теги

Существительные Чанки

  1. последние новости
  2. Дональд Трамп
  3. Нью-Йорк Таймс

Приложений? Вы имели в виду предлоги?

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

Тема поиска находится между первым и последним предлогами. Запрошенный источник находится в конце после последнего предлога. Последний кусок существительного является источником.

Если источник не указан, как во втором примере, все после первого предлога считается темой поиска.

Adpositions, проще говоря, предлоги и послелоги.

В начальном языке, таком как английский, прилагательные обычно предшествуют именной фразе. Например. персонажи из кинематографической вселенной Marvel. В таком языке, как гуджарати, последующие прилагательные следуют за существительной. Это послелоги. Например. માર્વેલ ચલચિત્ર જગત ના પાત્રો, который дословно переводится как: Кинематографическая вселенная персонажей Marvel.

Реализация

Мы вызываем get_news_tokens из класса QueryExtractor, который извлекает источник и запрос из ввода. Внутри он вызывает _split_text для извлечения фрагментов существительных, частей речи и полностью проанализированного текста из входных данных. Лемматизируем термины в запросе.

Затем мы вызываем функцию get_news, используя query для одного из классов агрегатора в media_aggregator.py на основе источника. Это возвращает список новостных статей, которые были отправлены в качестве ответа API новостей. В настоящее время мы поддерживаем The Guardian API и The New York Times API.

Наконец, мы выбираем первый элемент (по умолчанию) из списка response и суммируем его с помощью функции short_news.

Запросы к знаниям

Мы предполагаем, что входные данные могут быть одной из следующих форм.

  • Джон Дир
  • Жанна д'Арк
  • Кто такой Дональд Трамп?
  • Кем был Дж. Р. Р. Толкин?
  • Что такое тройка RDF?
  • Расскажите мне о физике элементарных частиц.

Части речи и теги

Пример 1

Пример 2

Существительные Чанки

Пример 1

  1. Какие
  2. RDF-тройка

Пример 2

  1. me
  2. он мужчина
  3. мастера
  4. Вселенная

Вспомогательные глаголы (или их отсутствие)

Если мы находим вспомогательный глагол, мы обрабатываем все после его первого появления как запрос. Таким образом, в примере 1 запрос представляет собой тройной RDF.

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

Реализация

Мы вызываем get_knowledge_tokens из класса QueryExtractor, который извлекает запрос.

Мы передаем это функции get_gkg, которая запрашивает API Википедии через пакет Python wikipedia и возвращает 5-кратное резюме наилучшего результата.

Обобщение

Я использовал класс FrequencySummarizer из Резюмирования текста с помощью NLTK. Как вариант, можно было использовать сумы.

Библиотеки

Помимо пакетов re, bs4, requests, operator, collections, heapq, string и nltk, мы используем следующее.

  1. spaCy: настройте его, как указано в Документации по установке spaCy. spaCy поможет нам быстро провести НЛП. Мы могли бы использовать NLTK, но spaCy ускорит вашу работу. В этом проекте мы используем spaCy.
  2. Википедия: это помогает запрашивать API Википедии. Вы можете прочитать документацию пакета wikipedia Python здесь.
  3. Summarizer: тот, который я использовал, был заимствован из блога The Glowing Python, написанного JustGlowing. Он резюмирует длинное содержание. Как вариант, можно было использовать сумы.
  4. Flask-RESTful, Flask (необязательно): они предназначены для создания веб-приложения и запуска нашего бота через веб-службу RESTful.

Веб-приложение (необязательно)

Мы добавляем классную веб-страницу, с которой вы можете запускать голосовые запросы и позволять браузеру считывать содержимое ответа. Для этого мы используем Web Speech API.

Веб-сервис

Мы запускаем и запускаем нашу веб-службу REST на основе Flask менее чем за 20 строк кода. Класс QueryService обрабатывает запросы.

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

Веб-сайт

Я создал простую веб-страницу для демонстрации бота. Он использует Web Speech API для приема голосового ввода и считывания контента. Вы можете найти файл index.html в папке шаблонов проекта. Прежде чем открывать веб-сайт, убедитесь, что вы установили все необходимые пакеты и библиотеки, а также что веб-служба запущена.

Ограничения

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

Запросы на знания с другой структурой

  • Объясните мне, что такое агрегация начальной загрузки.
  • Расскажите мне что-нибудь о вычислительной нейробиологии.

Запросы новостей с другой структурой

  • Что New York Times пишет о последнем матче Роджера Федерера?
  • Что происходит в мире тенниса?

Запросы на знания других типов

  • Как делают сыр?
  • Где родилась Джоан Роулинг?
  • Можем ли мы построить небесный город на Венере?
  • Когда произошла Французская революция?
  • Почему у Юпитера есть Большое красное пятно?

Дополнительные вопросы и контекст

  • Объясните мне, что такое агрегация начальной загрузки.

а затем: Как это относится к случайным лесам?

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

Заключение и дальнейшая работа

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

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

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

Ссылки и ссылки

  1. СПАСИЙ
  2. Алфавитный список тегов части речи, используемых в проекте Penn Treebank
  3. Стэнфордское типизированное руководство по зависимостям
  4. Статьи Википедии

4.1 Параметр направленности головы

4.2 AI-hard

4.3 NLU (понимание естественного языка)

4.4 Разрешение анафоры

4.5 Предлоги и послелоги

4.6 Голова-инициал

5. Web Speech API

6. Резюмирование текста с помощью НЛТК

7. New York Times Developer API

8. Открытая платформа Хранителя

9. Тема Quora: что затрудняет обработку естественного языка?

Посмотрите демонстрационное видео на YouTube и код на GitHub.

Первоначально опубликовано в LinkedIn 18 февраля 2017 г.