Дорогой математик, я не ваш терапевт, решайте свои проблемы сами.

Или на самом деле я построю нейронную сеть, которая решит эти проблемы за вас.

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

Что ж, не надо больше воображать. Этот сайт, Simplisico, существует. И для того, чтобы вы могли взаимодействовать с ним на своем естественном языке, необходимо, чтобы Simplisico сама понимала, какое уравнение вы на самом деле пытаетесь решить. Вот где я и пришел. В этом посте я расскажу, как я создал POC для задачи чтения текстовой математической задачи и извлечения основного уравнения.

Составим план!

Прежде чем вдаваться в подробности, давайте подумаем, как мы подойдем к этой задаче в целом.

Шаг (1) - столкнувшись с текстовой математической задачей, убедитесь, что задача написана на понятном нам языке. Я имею в виду, что если вопрос на баскском языке, а я не говорю по-баскски, мне пришлось бы перевести вопрос на язык, который я понимаю, прежде чем я смогу даже попытаться решить математическую задачу.

Тогда один из способов решить саму математическую задачу:
(2) «скрыть» числа в вопросе с параметрами,
(3)
понять структуру уравнения,
(4) вставьте числа в правильные места.

В следующих разделах мы увидим, как мы выполняем шаги (1) - (2), используя существующие инструменты, и как мы создаем нейронную сеть , который выполняет шаги (3) - (4).

Предварительная обработка - обучение нашей машине чтению

Давайте посмотрим, как мы переведем вопрос на язык, понятный машине, в два этапа, используя два существующих инструмента:

Сначала я сделал что-то под названием Токенизация, где я заменил числа в вопросе именами переменных, разделил вопросы на слова и удалил знаки препинания. И все это я сделал легко с помощью пакета НЛТК.

Затем я сделал что-то под названием Встраивание, что означает, что я преобразовал слова в векторы в многомерном пространстве таким образом, чтобы сохранить их семантические и синтаксические отношения. Это тоже был довольно простой шаг благодаря алгоритму Word2Vec в пакете Gensim.

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

Итак, теперь мы вроде как научили нашу машину читать.

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

Разработка, управляемая модными словами

Если вы немного знаете о нейронных сетях (если нет, вы можете прочитать это краткое введение, которое я написал), то я могу сразу сказать вам, что нейронная сеть, которую я построил для этой задачи, - это последовательность перестановки рекуррентных нейронных сетей. Сеть с кратковременной памятью и вниманием.

Черт возьми, это полный рот.

Давайте рассмотрим это по крупицам.

Во-первых, ввод - это текстовая математическая задача, следовательно, это последовательность слов. И почему на выходе должна быть перестановка? Потому что мы ожидаем, что каждое число, которое машина увидела во входном вопросе, появится в выходном уравнении. Затем, если мы знаем, какова структура уравнения, мы можем свести нашу задачу к поиску правильной перестановки чисел во входном вопросе.

Теперь Рекуррентная нейронная сеть (RNN) относится к общей архитектуре, в которой сеть содержит своего рода петлю обратной связи. В нашем случае сеть будет читать каждое слово за раз, это часть Кратковременная память, но она также будет читать слово в контексте, в котором оно было прочитано. Это часть Долговременная память. Кроме того, допустим, в начале вопроса я добавил предложение Я хочу написать сообщение в блоге на Medium. Очевидно, это не добавляет никакой информации к уравнению, которое я хочу решить, поэтому я хочу, чтобы сеть знала, что не следует уделять слишком много внимания таким предложениям.

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

Все эти аспекты архитектуры сети можно получить, используя несколько базовых возможностей пакета Keras.

Это все, ребята

Если вы выполнили эти шаги до сих пор, вуаля - вы получили алгоритм, который может читать текстовую математическую задачу и извлекать основное уравнение!

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

Теперь вы можете подумать - какую лингвистическую загадку ВЫ хотите разгадать? как вы можете использовать то, что узнали здесь, для решения этой загадки? .

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

[Посмотрите это, чтобы узнать больше о моих приключениях во время работы над этим проектом.]