Что-то давно я ничего не писал. В частности - про искусственный интеллект.
Я уже писал про эмоциональность искинов, разобрал, для чего это нужно... А вот как бы вообще создать чат-бот, который не только был бы эмоционально реагирующим, но и имел бы представление, о чем он говорит?
То, о чем я говорю - еще не искин, но уже несколько сложнее, чем боты, работающие на AIML... Кстати, если кто не знает, то принцип работы AIML довольно примитивен, зато хорошо работает для английского языка. Ведь что он делает? Манипулирует введенными пользователем словами. Но не извлекает из них смысла.
Кстати как думаете, можно ли реализовать AIML для русского языка, если пренебречь принципиальной примитивностью? Ведь английский менее сложен с точки зрения форм слов, поэтому нет проблемы с падежами. А в русском эта проблема
есть.
Однако сам принцип реализовать можно. Для этого программе достаточно распозновать не сами только слова, но и их форму. Она должна понимать, что вот это - существительное, это - глагол, должна узнавать, что именно это за существительное (род, число) или глагол (время). Но вся хитрость в том, что вот это уже и будет извлечением смысла!..
Все, должно быть, знакомы с фразой "Глокая куздра штеко будланула бокра и кудрячит бокрёнка?". Слова в ней не имеют смысла. Но они информативны, поскольку информацию несет форма слов. Мы уже получаем информацию, даже если не знаем, что означает тот или иной корень. Уже разобранная ботом фраза может иметь такой вид (да, старый добрый XML; и, как можно заметить, разобраны только два слова):
#name: глокая;
#stem: глок;
#ending: ая;
#form: adjective:based_on{ending|synchronised_with:itemid.2};
#case: nominative:based_on{ending|synchronised_with:itemid.2};
#gender: feminine:based_on{ending|synchronised_with:itemid.2};
#number: singular:based_on{ending|synchronised_with:itemid.2};
#name: куздра;
#stem: куздр;
#ending: а;
#form: noun:based_on{ending|synchronised_with:itemid.1};
#case: nominative:based_on{ending|synchronised_with:itemid.1};
#gender: feminine:based_on{ending|synchronised_with:itemid.1};
#number: singular:based_on{ending|synchronised_with:itemid.1};
#living: unknown;
#1:
{
name: кукуруза;
word_id: 68594;
common: #form|#gender|#number|#case;
similarity: 58%;
conflict: #none;
}
#2:
{
name: кудри;
word_id: 68133;
common: #form;
similarity: 42%;
conflict: #high{itemid.1;itemid.4;itemid.7};
}
...
Почему XML? Ну нравятся мне языки разметки!:) Они очень удобны. Тот же AIML - тоже подвид XML. И сейчас я постараюсь объяснить, что же мне в них нравится.
Во-первых, можно хранить какую угодно инфу. Во-вторых, ее очень просто извлекать и записывать. И полученная из XML-файла инфа неплохо структурирована. Не нужно ломать голову над тем, как определить, что есть что. Однажды определенное, оно записывается в корректной форме, и более не требует дополнительной обработки.
Например, бот может задать такие вопросы, основываясь на инфе, записанной им в форме, подобной той, что вверху:
"Куздра - это кукуруза?"
"Куздра - это ведь не кудри?"
Кстати, если ему солгать в ответ на последний вопрос, неплохо, если бы он мог спросить в ответ:
"Как же так? Тогда должно быть "Глокие кудри штеко будланули бокра и кудрячат бокренка"."
Инфа, необходимая для такого вопроса, содержится в файле с этой фразой и в файле, где есть информация о слове "кудри" (куда и ссылается параметр word_id). Кстати, если настаивать, то он запомнит "кудри" еще и как единственное женского рода, но не смешает с уже существующим словом, и у него будет другой id.
Кстати, сам способ беседовать не должен быть строго детерминирован. Достаточно, чтобы бот знал, на какие вопросы и как отвечать, и как задавать свои. Исходить он при этом должен из того, что ему "интересно". То, как и к чему проявляется интерес, задается программно. Способ - также. Но они не смешиваются, в этом вся суть.
По-моему, чат-бот такого типа должен быть мультиагентным. Это позволит эмулировать даже мышление - постоянное движение по ассоциативным цепочкам, которые уже зашиты в словарных файлах, добавление и удаление новых цепочек. Таким образом, в памяти постоянно будет несколько разных, и при этом как-то связанных объектов. Это придаст ответам бота разнооборазие.