Он понимает ваши голосовые команды, ищет новости и источники знаний, а также обобщает и зачитывает вам контент.
Посмотрите демонстрационное видео.
Журнал Chatbots Magazine включил мою статью о Delbot в список 100 лучших статей журнала Chatbots Magazine.
python app.py
в командной строке, чтобы запустить веб-сервис.Боты остаются горячей темой. О них все говорят.
Как насчет того, чтобы построить его с нуля? Простой вариант, который мы создадим сегодня, будет понимать и отвечать на такие вопросы, как:
Наша цель — написать код бота с нуля и использовать при этом обработку естественного языка (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/ знает http://example.name#JohnDoe34.
(источник: https://en.wikipedia.org/wiki/Semantic_triple)
Мы определяем простое правило для категоризации входных данных: если запрос содержит слова news или late , это запрос новостей . В противном случае это запрос знаний .
Функция predict
класса QueryAnalyzer
— это основная точка входа для нашего бота. Он выполняет вышеуказанную категоризацию. Он вызывает другие функции для
Наконец, он возвращает выходные данные и флаг, указывающий, произошла ли какая-либо ошибка.
Мы предполагаем, что входные данные имеют одну из следующих форм.
Каковы последние новости о «Звездных войнах» в «Нью-Йорк Таймс»?
Прочтите мне последние новости о Брексите.
Дайте мне новости о фильмах кинематографической вселенной Marvel в 2017 году от Guardian.
Токен | Давать | мне | тот | последний | новости | на | Дональд | Трамп | от | тот | Новый | Йорк | Время | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
POS-терминал | ГЛАГОЛ | ПРОН | ДЭТ | ADJ | СУЩЕСТВИТЕЛЬНОЕ | АДП | ПРОПН | ПРОПН | АДП | ДЭТ | ПРОПН | ПРОПН | ПРОПН | ПУНКТ |
ЯРЛЫК | ВБ | ПРП | ДТ | ДЖЖС | НН | В | ННП | ННП | В | ДТ | ННП | ННП | ННП | . |
В предложениях, построенных, как указано выше, есть закономерность. И предлоги играют ключевую роль.
Тема поиска находится между первым и последним предлогами. Запрошенный источник находится в конце после последнего предлога. Последний фрагмент существительного является источником.
В случае, если источник не указан, как во втором примере, темой поиска считается все, что находится после первого предлога.
Проще говоря, присоединения – это предлоги и послелоги.
В языке с заглавной буквой, таком как английский, прилагательные обычно предшествуют именной группе. Например, персонажи из кинематографической вселенной Marvel. В языке с заключительным словом, например, в гуджарати, предлоги следуют за существительной фразой. Это послелоги. Например, માર્વેલ ચલચિત્ર જગત_ના_ પાત્રો, что дословно переводится как: Кинематографическая вселенная персонажей Marvel.
Мы вызываем get_news_tokens
из класса QueryExtractor
, который извлекает источник и запрос из входных данных. Внутри он вызывает _split_text
для извлечения фрагментов существительных, частей речи и полностью проанализированного текста из входных данных. Лемматизируем термины в запросе.
Далее мы вызываем функцию get_news
, используя запрос к одному из классов Aggregator
в media_aggregator.py на основе источника . Возвращает список новостных статей, которые были отправлены в качестве ответа API новостей. В настоящее время мы поддерживаем The Guardian API и The New York Times API.
Наконец, мы выбираем первый элемент (по умолчанию) из списка ответов и суммируем его с помощью функции shorten_news
.
Мы предполагаем, что входные данные имеют одну из следующих форм.
Джон Дир
Жанна д'Арк
Кто такой Дональд Трамп?
Кем был Дж. Р. Р. Толкин?
Что такое субъект-предикат-объект?
Расскажите мне о физике элементарных частиц.
Токен | Что | является | а | РДФ | тройной | ? |
---|---|---|---|---|---|---|
POS-терминал | СУЩЕСТВИТЕЛЬНОЕ | ГЛАГОЛ | ДЭТ | ПРОПН | СУЩЕСТВИТЕЛЬНОЕ | ПУНКТ |
ЯРЛЫК | WP | ВБЗ | ДТ | ННП | НН | . |
Токен | Рассказывать | мне | о | он | - | мужчина | и | тот | мастера | из | тот | вселенная | . |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
POS-терминал | ГЛАГОЛ | ПРОН | АДП | ПРОН | ПУНКТ | СУЩЕСТВИТЕЛЬНОЕ | КОНЖ | ДЭТ | СУЩЕСТВИТЕЛЬНОЕ | АДП | ДЭТ | СУЩЕСТВИТЕЛЬНОЕ | ПУНКТ |
ЯРЛЫК | ВБ | ПРП | В | ПРП | ГИФ | НН | СС | ДТ | ННС | В | ДТ | НН | . |
Если мы находим вспомогательный глагол, мы рассматриваем все, что происходит после его первого появления, как запрос. Таким образом, в примере 1 запрос представляет собой RDF-тройку .
В противном случае мы рассматриваем все фрагменты существительных после первого как запрос. Таким образом, в примере 2 запрос звучит так: «Он-человек, хозяин вселенной» .
Мы вызываем get_knowledge_tokens
из класса QueryExtractor
, который извлекает запрос .
Мы передаем это в функцию get_gkg
, которая запрашивает API Wikipedia через пакет Wikipedia Python и возвращает сводку из 5 предложений о главном результате.
Я использовал класс FrequencySummarizer
из суммирования текста с помощью NLTK. Альтернативно, вы можете использовать sumy.
Помимо пакетов re , bs4 , Requests , operator , collections , heapq , string и nltk , мы будем использовать следующие.
spaCy : настройте его, как указано в документации по установке spaCy. SpaCy поможет нам быстро заняться НЛП. Мы могли бы использовать NLTK, но SpaCy поможет вам работать быстрее. В этом проекте мы используем SpaCy.
Википедия : это помогает запрашивать API Википедии. Вы можете прочитать документацию пакета Python в Википедии здесь.
Подведение итогов : Тот, который я использовал, был позаимствован из блога The Glowing Python, написанного JustGlowing. Он суммирует длинный контент. Альтернативно, вы можете использовать sumy.
Flask-RESTful, Flask (необязательно) : они предназначены для создания веб-приложения и запуска нашего бота через веб-сервис RESTful.
Мы добавляем классную веб-страницу, с которой вы можете отправлять голосовые запросы и запрашивать в браузере содержимое ответа. Для этого мы используем API Web Speech.
Мы запускаем и запускаем наш веб-сервис REST на основе Flask, используя менее 20 строк кода. Класс QueryService
обрабатывает запросы.
На данный момент нам нужен только один сервисный вызов, чтобы отправить данные из нашего веб-приложения нашему боту. Это делается с помощью функции post
класса QueryService
. post
, в свою очередь, вызывает функцию predict
, которая, как упоминалось выше, является основной точкой входа.
Я создал базовую веб-страницу для демонстрации бота. Он использует API веб-речи для приема голосового ввода и считывания контента. Вы можете найти файл index.html в папке шаблонов. Прежде чем открывать веб-сайт, убедитесь, что вы установили все необходимые пакеты и библиотеки, а также что веб-служба запущена и работает.
Наш простой бот понимает ограниченный круг запросов. Он не может понимать другие виды запросов, например следующие.
Запросы знаний с другой структурой
Объясните мне, что такое бутстрап-агрегация.
Расскажи мне что-нибудь о вычислительной нейробиологии.
Новостные запросы с другой структурой
Что говорит New York Times о последнем матче Роджера Федерера?
Что происходит в мире тенниса?
Запросы на знания других типов
Как делают сыр?
Где родилась Джоан Роулинг?
Можем ли мы построить небесный город на Венере?
Когда произошла Французская революция?
Почему у Юпитера есть Большое Красное Пятно?
Дополнительные вопросы и контекст
Объясните мне, что такое бутстрап-агрегация.
а затем: Как это связано со случайными лесами?
Понимание того, о чем идет речь в последующем вопросе, подпадает под так называемое разрешение анафоры. Все это часть понимания контекста. Разные слова означают разные вещи в разных контекстах. Хотя у людей есть тонкое понимание этих нюансов, научить этому же машины значительно сложнее.
Мы достигли своей цели и создали бота на основе определенных нами правил. Мы также использовали некоторые методы НЛП. Наконец, мы развернули нашего бота в веб-приложении. Однако наш бот ограничен в типах запросов, которые он может понять и на которые он может ответить. Почему сфера его понимания настолько узка?
В общем, заставить компьютеры действительно понимать язык — сложная задача для ИИ. В НЛП этому посвящена область, известная как NLU (понимание естественного языка).
Мы могли бы реализовать решение на основе машинного обучения, чтобы наш бот потенциально мог понимать гораздо более широкий спектр запросов.
Обязательно прочтите условия использования используемых здесь API.