Прежде чем задать мой вопрос, вот ситуация:
У меня есть некоторые базовые знания об искусственном интеллекте, я знаю о Inference Engine, кодировании на LISP или Prolog, немного о нейронной сети, но немного. Это то, что я изучал.
У меня есть проект, приложение, которое должно исправить некоторые пользовательские предложения.
Эти предложения являются обычными строками, которые могут содержать много разных символов. К счастью, благодаря Flex (lexer) я определил токены, которые теперь легче анализировать. Пример строки:
AZERTY AWESOME 333.222 AZERTY MAGIC P
Который дает токены (пример):
VERB NOUN NUMBER VERB ADJECTIVE SPEC
Я также использую Bison, чтобы разрешить некоторые комбинации, и отклонить другие:
VERB NOUN NUMBER VERB ADJECTIVE SPEC is ok
VERB VERB NOUN NUMBER ADJECTIVE SPEC is not ok
etc...
Эти предложения могут иметь некоторые ошибки при входе в мое приложение. Эти ошибки могут быть из разных источников, давайте приведем несколько примеров:
AZERTY AWESOM E 333.222 AZERTY MAGIC POINT
Дополнительное пространство в слове awesome заставляет синтаксический анализатор распознавать VERB и SPEC вместо NOUN (как выше). Таким образом, исправление было бы удалить дополнительное пространство.
Другими ошибками могут быть пропущенный пробел (из-за чего вставляются два слова), неизвестные токены, неизвестный комбо (для бизонов), вообще без пробелов и т.д …
Поэтому я начал создавать свое приложение на C ++, в первую очередь с детерминистским подходом: я создал своего рода словарь, который содержит все обнаруженные ранее шаблоны ошибок, и создал для них исправления. Это работает довольно хорошо, я могу исправить многие из них, потому что я нашел очень общий шаблон. Но я хотел бы улучшить эту производительность, добавив функцию машинного обучения, чтобы исправить другие.
С моей «фиксированной коррекцией», скажем, 70% коррекции хорошо, и я бы хотел, чтобы этот процент вырос с помощью машинного обучения. Было бы учиться на неправильном&исправил предложения, а затем смог бы сам исправить предложения, которые я не смог исправить (последние 30%).
Вот мой вопрос, я новичок в машинном обучении, даже если я уже немного изучал ИИ и не знаю, с чего начать.
Мой первый вопрос: я знаю о нейронной сети, но она используется, чтобы угадать, верно? Например, я бы дал ему предложение, и он мог бы сказать мне, правильно это или нет. Но это не то, что я хочу, я хочу, чтобы приложение исправило это, а не просто сообщало, правильно ли это. Дело в том, что я не вижу, как приложение может «удалить / изменить» само по себе.
В каком направлении вы бы предложили мне пойти? Какие принципы / инструменты / технологии машинного обучения вы бы предложили для такого применения?
Надеюсь, вы хорошо поняли мою проблему и сможете мне помочь.
Ну, так как другие ответы не были опубликованы, а Бенджи Кесслер не суммировал свою ссылку, я решил опубликовать свой собственный ответ, если он кому-нибудь поможет.
Я решил использовать стратегию N-граммов, которая, я думаю, является хорошим способом решения моей проблемы. Это просто теория, и я начал ее кодировать, но она может не сработать. Но мне нравится идея, и я думаю, что стоит попробовать.
N-граммы — это UNIGRAM (слово), или BIGRAM (пара слов) или TRIGRAM (три слова) и т. Д. И т. Д.
Основная идея состоит в том, чтобы предоставить моему приложению много обучающих данных со строками хорошего формата. Для каждого из них я собираюсь посчитать n-грамм (от универа до три).
Я получу что-то вроде этого (после того, как приложу тысячи данных):
таблица униграмм (фигуры поддельные и случайные)
word | occurrence | prob
________________________________________
I | 500 | 0.2
want | 645 | 0.2
a | 2434 | 0.5
cat | 20 | 0.1
биграмный стол
first word | second word | occurrence | prob
___________________________________________________________
| I | want | 600 | 0.5
| want | a | 500 | 0.4
| a | cat | 100 | 0.1
то же самое для таблицы триграмм.
Поэтому, когда у меня есть эти данные, их легче проанализировать, давайте рассмотрим пример:
I WANTA CAT
При анализе приложение сначала увидит, что WANTA не существует в таблице, поэтому оно будет разбивать это слово до тех пор, пока не получит «предложение» с хорошей вероятностью произойти.
Так что при разделении на «ХОЧУ» & «А», приложение увидит, что «ХОЧУ» имеет хорошую вероятность, то же самое для «А», затем он проверит совместимость биграмм, что тоже хорошо. Даже триграммы с «I» и «CAT» для большей точности.
Я думаю, что это хорошее решение, которое не требует много времени и которое, я надеюсь, будет довольно эффективным.
Надеюсь, я прояснил ситуацию и помог людям, которые задавали те же вопросы.