Этот проект изначально предназначался для курса искусственного интеллекта в Софийском университете. Во время ее выполнения я был ограничен во времени и не смог реализовать все идеи, которые у меня были, но я планирую продолжать работу над ней... и я подобрал тему для своей магистерской диссертации, используя Трансформеры Т5 для генерации вопросов- Отвечайте парами вместе с отвлекающими факторами . Проверьте это в репозитории «Вопрос-Генерация-Трансформеры».
Подход к определению ключевых слов, используемых в качестве целевых ответов, был принят на конференции RANLP2021 «Генерация кандидатов на ответы для викторин и генераторов вопросов с учетом ответов».
Идея состоит в том, чтобы сгенерировать ответы с несколькими вариантами ответов из текста, разделив эту сложную задачу на более простые шаги:
Чтобы избежать конфликтов с пакетами Python из других проектов, рекомендуется создать виртуальную среду, в которой будут установлены пакеты. Если вы не хотите этого, вы можете пропустить следующие команды и напрямую установить файл require.txt.
Создайте виртуальную среду:
python -m venv venv
Войдите в виртуальную среду:
Окна:
. .venvScriptsactivate
Линукс или МакОС
source .venvScriptsactivate
Установите ipython внутри venv:
ipython kernel install --user --name=.venv
Установите Jupyter Lab внутри venv:
pip install jupyterlab
pip install -r .requirements.txt
jupyter lab
Прежде чем я смог что-либо сделать, я хотел больше понять, как составляются вопросы и какие слова представляют собой ответы.
Я использовал набор данных SQuAD 1.0, который содержит около 100 000 вопросов, созданных на основе статей Википедии.
Вы можете прочитать о выводах, которые я нашел в блокноте Jupyter Data Exploration .
Я предполагал, что слова из текста станут отличными ответами на вопросы . Все, что мне нужно было сделать, это решить, какие слова или короткие фразы достаточно хороши, чтобы стать ответами.
Я решил провести бинарную классификацию каждого слова в тексте. SpaCy действительно помог мне с маркировкой слов.
Мне практически нужно было создать весь набор данных для бинарной классификации. Я извлек каждое непрерывное слово из абзацев каждого вопроса в наборе данных SQuAD и добавил к нему некоторые функции, например:
И метка isAnswer - совпадает ли слово, извлеченное из абзаца, и находится ли оно в том же месте, что и ответ на вопрос SQuAD.
Некоторые другие функции, такие как оценка TF-IDF и косинусное сходство с названием, были бы замечательными, но у меня не было времени их добавлять.
Помимо этого, наше воображение может создавать новые функции - возможно, в начале, середине или конце предложения, информацию о словах, окружающих его, и многое другое... Хотя, прежде чем добавлять дополнительные функции, было бы неплохо иметь показатель, позволяющий оценить, будет ли функция полезна или нет.
Я обнаружил, что проблема аналогична фильтрации спама , где общий подход заключается в том, чтобы пометить каждое слово электронного письма как пришедшее из спама или не как спам.
Я использовал алгоритм Гаусса Наивного Байеса scikit-learn, чтобы классифицировать каждое слово, является ли оно ответом.
Результаты оказались на удивление хорошими — при беглом взгляде алгоритм классифицировал большинство слов как ответы. Те, которых не было, на самом деле были непригодны.
Самое классное в Наивном Байесе то, что вы получаете вероятность для каждого слова. В демо-версии я использовал это, чтобы упорядочить слова от наиболее вероятного ответа к наименее вероятному.
Еще одно мое предположение заключалось в том, что предложение ответа можно легко превратить в вопрос . Просто поставив пробел в месте ответа в тексте, я получаю «замыкающий» вопрос (предложение с пробелом для пропущенного слова)
Ответ: Кислород
Вопрос: _____ — химический элемент с символом О и атомным номером 8.
Я решил, что не стоит превращать закрытый вопрос в более вопросительное предложение, но я думаю, что это можно сделать с помощью нейронной сети seq2seq , аналогично тому, как текст переводится с одного языка на другой.
Роль получилась действительно хорошей.
Для каждого ответа я генерирую наиболее похожие слова, используя встраивание слов и косинусное сходство .
Большинство слов вполне подходят, и их легко можно принять за правильный ответ. Но есть и те, которые явно не подходят.
Поскольку у меня не было набора данных с неправильными ответами, я прибег к более классическому подходу.
Я удалил слова, которые не были той же частью речи или объектом с тем же именем, что и ответ, и добавил к вопросу еще немного контекста.
Я хотел бы найти набор данных с ответами с несколькими вариантами ответов и посмотреть, смогу ли я создать модель ML для генерации более качественных неправильных ответов.
После добавления демонстрационного проекта сгенерированные вопросы не подходят для мгновенного распространения в классе, но они тоже неплохие.
Самое классное — это простота и модульность подхода, при котором вы можете найти, где дела идут плохо ( скажем, это классификация глаголов ), и внести в них исправления.
Наличие сложной нейронной сети ( как и во всех статьях по этой теме ), вероятно, принесет больше пользы, особенно в эпоху, в которой мы живем. Но самое замечательное, что я узнал об этом подходе, это то, что для инженера-программиста с его мышлением в области разработки программного обеспечения он является своего рода воротами , позволяющими попасть в область ИИ и увидеть значимые результаты.
Я считаю эту тему весьма интересной и имеющей большой потенциал. Наверное, я бы продолжил работать в этой сфере.
Я даже поступил на магистратуру по интеллектуальному анализу данных и, вероятно, буду заниматься некоторыми подобными проектами. Я буду ссылаться на все полезное здесь.
Я уже потратил еще немного времени на завершение проекта, но мне бы хотелось превратить его больше в руководство по освоению области ИИ, имея при этом возможность легко расширять его новыми пользовательскими функциями.
Обновление — 29.12.19: Репозиторий стал довольно популярным, поэтому я добавил новый блокнот ( Demo.ipynb ), который объединяет все модули и генерирует вопросы по любому тексту. Я переупорядочил остальные блокноты и задокументировал код (немного лучше).
Обновление - 09.03.21: добавлен файл require.txt с инструкциями по запуску виртуальной среды и исправлена ошибка a с ValueError: операнды не могли передаваться вместе с фигурами (230, 121) (83, ).
Я также начал работать над магистерской диссертацией по аналогичной теме «Генерация вопросов».
Обновление - 27.10.21: Я загрузил код магистерской диссертации в репозиторий «Вопрос-генерация-трансформеры». Я настоятельно рекомендую вам это проверить.
Кроме того, подход с использованием классификатора для выбора кандидатов на ответ был принят в качестве студенческой работы на конференции RANLP2021. Бумага здесь.