Pull to refresh

Comments 6

выдаёт $Failed

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

Андрей Кротких научился начинать проект и бросать. Он должен был научиться начать проект и полностью его завершить, пусть даже, это программа, считающая 2х2, но полностью функциональна.
Добрый день. Под алгоритмом я подразумевал «полный анализ» выражения и нахождение всех возможных путей его исправления. В рамках школы, во время обсуждения и выбора проектов со Стивеном и командой инструкторов, мне посоветовали реализовать только нахождение пропущенного символа и нахождение путей исправления входного выражения. Конкретно в этом и заключался проект. Именно это и было реализовано.
Во время постерной сессии директора школы и Стивен предложили дальше заниматься этим проектом.
Почему вы решили, что я забросил проект, я не знаю.

Всё, конечно, хорошо и здорово, сам присматривался одно время к этой школе. Но описание проекта невразумительное от слова совсем. А на хабре смотрится просто ужасно: что за коды? что за отдельно меню? кому это и зачем?
Вот если бы автор смог сделать небольшой обзор проектов со школы, это было бы интересно.

Добрый день.
По поводу описания проекта, я согласен, нам предоставили информацию о том, как их оформить и где, за 4-5 часов до церемонии выпуска. Поэтому действительно очень сумбурно получилось.
По поводу небольшого обзора проектов, проблема в том, что я не считаю себя специалистом во всех областях, которые были представлены, поэтому я могу просто быть некомпетентным в обзоре. В основном работы были посвящены машинному обучению и созданию нейронных сетей. Были работы посвящённые обработке и анализу музыки, была работа связанная с нахождением минимума Гамильтониана, восстановление структуры графов по их изображению и т.д. Но если вам интересно, вы можете найти все проекты здесь: ссылка на WCommunity
UFO just landed and posted this here
Добрый день. Спасибо за обоснованную критику.

Подробно не получилось, признаю, если бы была возможность редактировать исходный пост, я бы добавил всю информацию, которая необходима. Писал в первый раз, поэтому заранее не знал, что точно нужно подчеркнуть и добавить. Но вкратце расскажу:
Первичная идея проекта заключалась в создании чего-то вроде парсера, который по конструкции входного текста его корректирует. Этот вариант я прорабатывал около недели. Основная проблема заключалась в том, что каждый раз я мог придумать новые входные данные, которые этот парсер не мог обработать. Поэтому я отказался от этой идеи и начал прорабатывать второй вариант: разработать более общий алгоритм, который не привязан к самому входному тексту, а анализирует результат его интерпретации. Что имеется ввиду:
В Wolfram Language (WL) есть функция ToExpression[...], которая переводит текст в выражение на WL и вычисляет его. Например: ToExpression[«2+2»] выдаст нам 4. Сначала проводится анализ на элементарные ошибки: отсутствие открывающих и закрывающих видов скобок и отсутствие кавычек. Если же ошибка заключается в том, что отсутствующий символ отличен от скобки или кавычки, то мы пытаемся найти ему место и посмотреть результат вычисления. В WL неудачные вычисления или выражения, которые не были вычислены выдают нам либо $Failed, либо само выражение. Если мы попытаемся вычислить Net[f,x,4] мы получим Net[f,x,4], если вычислим Nest[f,x,4], то получим следующее: f[f[f[f[x]]]]. На сравнении исправленного и результата исправленного мы осуществляем выбор «корректных» результатов. Это было реализовано с помощью нескольких «фильтров». Например, результат при вычислении скорректированного выражения не должен содержать Null, не знаю как точно выразиться, дальность изменения строки входных данных должна быть больше 1 в сравнении с результатом вычисления (В WL функция EditDistance), результат не должен вызывать $Failed при вычислении. Было еще несколько фильтров, но они связаны со спецификой обработки текста. В результате такой фильтрации мы получаем некоторый набор возможных корректировок. По сравнению с первым вариантом, это обеспечивает более надёжную работу и быстродействие. Вообще, когда я «почти» реализовал систему парсера на основе строковых паттернов, мне сказали, что она получилась бы абсолютно неприменимой к реалиям. Почему, потому что чем сложнее структура паттерна, тем больше по времени занимает поиск этого паттерна в этой строке. Если обработка текста паттерном заняла бы около минуты, то второй вариант обрабатывает за доли секунд.
Был ещё третий вариант. Придумали структуру нейросети и создали тренировочный сет для неё с помощью встроенных в WL инструментов. Было введено в Wolfram Mathematica V11. Столкнулись с проблемой, что сеть училась не шаблону структур кода, а, по сути, просто запоминала правильные ответы, поэтому решили перестроить тренировочный сет. Для тренировки использовались встроенные примеры из документации. Но на это буквально не хватило времени, поэтому я предоставил только прототип этой сети.

Итог: остановились на втором варианте реализации. Он был опробован на достаточно объемном коде, как пример брали код случайного приложения из CDF Demonstrations. Удаляли случайный символ, который обращал вычисление кода в ошибку или вообще не работал. И прогоняли алгоритм на нём. Работает очень быстро. Проблема возникла в другом, чем больше код, тем больше возможных путей исправления этого кода, только если исправление не однозначное, как например квадратная скобка или фигурная скобка. Алгоритм правильно обрабатывает операторные формы записи функций в WL, чему я был лично удивлён.

Минусы: алгоритм не может отследить отсутствие закрывающего символа чистой функции & и пропавшую запятую в списках аргументов. Это связано с тем, что мы заранее не знаем, что хотел ввести пользователь программы. На вышеприведённом примере с Nest. Если мы введём следующую строку: «Nest[fx,4]» мы получим ошибку и уведомление о том, что какой-то символ пропущен, но вариантов коррекции предложено не будет. Как это реализовать, я знаю, но инструктор посоветовал на этом пока что не заострять внимание.

Для постерной сессии я сделал этот алгоритм в виде интерактивного ввода кода, чтобы он автоматически отслеживал ошибки и предлагал пользователю варианты исправления. Предложили подобную систему реализовать как возможный инструмент для пользователей, которые мало знакомы с языком и не всегда могут найти отсутствующую скобку или недостающий символ.
Sign up to leave a comment.