Здравствуйте, одна из тем форума помогла мне решиться и создать эту тему.
Предлагаю всем вместе, написать Искусственного Собеседника. Я знаю, что такой программы пока нет, поэтому предлагаю сначала написать программу, которая будет разговаривать на уровне 3-4 летнего ребенка. Написать эту программу – мечта всей моей жизни, поэтому я надеюсь, что эту идею кто-то поддержит.
Большое спасибо, что прочитали это сообщение.
на сайте была гдето ссылка на ресурс где такую рогу использовали...
Добавлено через 1 мин.
http://aquest.antichat.net/
Но идеальных нет, и хочется это пощупать, потрогать, прочувствовать алгоритмы и прочее
Удачи. Тема страшно богатая
Допустим это твоя мечта жизни?И что?Тебе надо написать программу,помочь?Ты не знаешь алгоритмы или что? Ты не можешь ее писать?
Добавлено через 55 сек.
И тем более раз так хочешь, развивай тему, предлагай, показывай!
А чем собственно Дельфи не катит?Можно и там!
Ни о каком наезде и речи не было! Наоборот хотел больше знать и присоединиться в случае чего!Не знаю,что я в своем посте сказал..Мечта жизни-это хорошо!И может попросить переехать в Дельфи?
Вот http://netnotes.narod.ru/notes/t6.html статейка по теме. На примитивном уровне, но для начала может быть полезным...
Идея сама по себе интересная (хотя, конечно, далеко не оригинальная). Я тоже готов участвовать в обсуждении, если получится.
Тема не совсем соответствует тому, что тут понимается под задачами, а скорее ближе по духу к играм (по крайней мере пока у нее не появится серьезного применения), поэтому переношу ее в раздел Игры.
Согласен с автором, что основным инструментом имеет смысл сделать Паскаль, а именно Opject Pascal (процедурный стиль тут явно проигрывает объектному).
Осталось - начать.. Автор может предложить основу?
Наряду с семантикой (смысловой строной), а может даже впереди нее, мне видится, как проблема, простая орфография. Кстати, проглядывается некая связь с темой Чужака'а http://forum.pascal.net.ru/index.php?showtopic=16296 . Может, объединить усилия?
Но мне кажется,что для такой штуки подойдет 32 битный компилятор?Например Free Pascal?
Артемий2 , согласен, FPC отлично нам подойдет.
Вот моя идея:
Надо каким-то образом заставить компьютер рассуждать. Я попытался проанализировать ход моих мыслей при ответе на некоторые простые вопросы. И как мне показалось, я, когда мне говорят фразу, я воссоздаю картинку, которую мне описывают и дальше сравниваю её с тем, что у меня записано в памяти.
Поэтому я предлагаю сделать граф существительных, и к каждому существительному будет идти ребро, весом которого является набор характеристик. (Заяц - длинные, белые, смешные...->уши)
Далее идет лингвистический анализ предложения (как его делать идей нет, но почитаю кинутые статейки, может быть, идейки появятся).
Дальше мы получаем запрос, что мы делаем мы берем главное существительное и смотрим какие слова к нему относятся на втором уровне, и выделяем подграф, в котором верно: Любое ребро этого графа удовлетворяет следующему утверждению: либо один из параметров ребра содержится в предложении, либо хотя бы одна из вершин этого ребра содержится в предложении. Дальше мы анализируем этот граф на "хорошесть". Например, если граф не связный, то он точно плохой, и если в характеристиках его ребер присутствует "Не бывает" или что-то синонимичное, то граф тоже плохой, а если нет, то граф хороший.
Далее мы рассматриваем два случая, хорош ли граф или нет, если хорош, тогда мы составляем ответное предложение (как его составлять у меня пока идеи только смутные)
А если нет, то мы на том ребре, на котором написано, не бывает, мы смотрим на эмоцию и выражаем её, правда можно добавить смещение, то есть ввести просто общую эмоцию нашего аппарата и дальше если, например аппарат доволен, а эмоция стоит "бред", то он ответить "Да вы что, я раньше о таком не слушал" или что-то в этом духе, а если аппарат зол, тогда он ответит что-то вроде "не вешайте мне лапшу на уши". Причем обработку эмоций придется делать и на хорошем графе и сумма эмоций всех ребер графа будет влиять общую эмоцию нашего аппарата. Дальше, когда ответ подготовлен должен произойти обратный лингвистический анализ, который из "предпосылок" предложения сконструирует предложение и выдаст его пользователю. Так же нам надо выбирать тему разговора и заносить в память для того, чтобы аппарат понимал, о чем идет речь, если в середине разговора с ним сказать "И конечно развитие этого дела требует больших усилий". Потому что по модели, которую я описал до этого аппарат примет это предложение за бессмысленное.
Ну, вот вкратце идея моего алгоритма.
Тему поддерживаю.
Похоже, мы мыслим сходно.
Хорошо, а где будет храниться эта информация? Файл, константы, объекты?
А может сделать слова, а потом подставлять нужные окончания? Но это естественно не однозначный способ!
Имхо, все сведется к построению системы классификации всех возможных понятий.
Вот например, надо описать стол... Что о нем можно сказать? Материальный, неодушевленный, созданный человеком... это еще далеко не все. А надо придумать систему, с помощью которой программа, задавая вопросы сможет классифицировать все понятия. И составить базу данных. Атас_держите_меня_всемером. Думаю это черезчур сложно.
Да но не забывай что 3-4 летний ребенок не знает столько слов!
Я приношу свои извинения...
Артемий2, Archon Ваши 2 поста
идут сразу после моего.
То, что там написано, относится только к St@senk@,
или также, отчасти, и ко мне?
Отчасти Чужаковская программа нам поможет, для классификации, как предлагает Archon.
Добавлено через 1 мин.
Archon , да это сложно, но помоему это эффективно.
За склонение, извини
Чужак?Честно скажу, что не совсем твоего сообщения, пока я вроде описываю алгоритм, а язык программирования, вроде не обсуждается. А тему я смотрел, и твое сообщение не проигнорировал.
Хранение этой БД действительно проблеммма, также проблемммой является её заполнение.
Моя идея:
Сделать 1 БД где будет стоять Id номер, слово (в его начальной форме), и сделать вторую БД, где будут стоять последовательности номеров, где каждая последовательность это первый элемент - первая вершина ребра, последняя - вторая вершина ребра, а все остальное - параметры ребра.
и третья база - синонимы.
Все равно сливаться Не будем.
Вижу расхождение (Мое-и Ваше) в основополагающих
принципах и методах.
Все эти рассуждения о ребрах, графах...
Решение Своей вижу задачи через логику человека, а не компьютера. Все это многообразие понятий-оно ведь для человека не проблема-он ими просто пользуется.
Моя задача - не ИС, у меня человек взаимодействует с программой по своей, человеческой логике.
Обратили внимание, что моя программа простая, НО на вроде бы простой вопрос: "Объект большой или маленький?" НЕ два (большой/маленький), а ШЕСТЬ вариантов ответа. Логика построения такая-1,2- Выбор большой или маленький? 3-Включение-и большой, и маленький, 4-Исключение-не большой, не маленький,
5,6-Предпочтение-Скорее большой, Скорее маленький-
и Выбирает пользователь. И это логика-не компьютера и не языка программирования.
Word = record
id: Byte;
Skl: array [1..100] of string;
Notions: array [1..100] of string;
{Последнее заполним почле разъяснения Аrchona :-)}
end;
Ребята, не забываем, что на уровне 3-4 года договорились писать и обдумывать! Кто примерно знает, сколько слов знает малышь в эти года?
Хорошо,давайте точно обговорим кто учавствует! Распределим обязанности. Я допустим готов взять с кем-то БД а другой копит слова и т.д? Переодически будем писаться (ударение на а! ) здесь..
Было бы странно, если бы я не учавствовал
Согласен, что надо разделиться. Но пока учавствует не очень много народа, поэтому возможно будем делать все одной групой, ступенчато.
Не совсем, но близко к тому... Здесь введены уже предложения, как я понял, а я хочу чтобы, по словам и карте их зависимости лингвистический анализатор сам конструировал предложение, которое будет служить ответом на данный запрос.
Ладно,попробую начать конструировать БД. Ст@сенк@ предоставь полный план того,как должна быть устроена БД по пунктикам. Какие детали в ней будут..Надеюсь Archon тоже присоединится!
Если бы я еще знал как ее сконгструировать...
Как я понял идей как представить это в коде нет не только у меня, но и у Archon, либо он скрывает, что знает как это реализовать.
Что у нас есть:
Существетильное
Описательное (Глаголы, Наречия ...)
Вершины графа - существительные, а веса ребер - массивы Описательных наверное
Archon не присоединится. Я пол года потратил на обдумывание полностью аналогичной идеи, и до реализации дело так и не дошло.
Но по поводу некоторых общих вопросов могу высказать свои идеи. Для начала... что должно быть:
1 "База Знаний" (здесь и далее названия в кавычках - условные термины). Это та самая БД что мы обсуждали. В ней хранятся "понятия" (определяются существительными), "действия" (определяются глаголами), и тд. Таким образом это совокупность нескольких БД. В какой форме хранить все эти "понятия", "действия" и прочее - один из основных вопросов написания этой программы. Некоторые мысли по поводу хранения "понятий" я писал выше.
2 "Память". В ней хранится информация об известных программе "событиях".
3 "Блок обработки текстовых сообщений". Обеспечивает семантический анализ предложений и осуществляет связанные с этим действия. Например, если предложение повествовательное - строит модель "события", записывает ее в "память" и, по возможности, пополняет "БЗ", если вопросительное - ищет ответ и тд.
Пример разбора предложения:
'Мама мыла раму'
Предложение повествовательное, значит нужно строить модель. Два существительных, значит в модели создаем два "объекта": один "объект" на базе понятия "мама" (описание понятия хранится в "Базе знаний"), и один на базе понятия "рама". В предложении есть глагол ("действие"). Исходя из грамматики делаем вывод что объект "мама" совершал в прошлом над объектом "рама" действие "мыть". Вот и готова модель "события". Ее можно сохранить в "памяти" в примерно таком виде: во время <время_и_дата> была получена информация о том, что в прошлом (относительно времени получения информации) совершалось действие определенное моделью <id модели>. Кроме того из этого предложения программа получит информацию, что объект "мама" в принципе может совершать над объектом "рама" действие "мыть", и таким образом пополнит "Базу Знаний" (посредством создания новых "связей" между этими "понятиями").
4 "Набор определяющих поведение динамик". Если реализовать только пункты 1 - 3, программа сможет понимать то что пользователь ей набирает, и таким образом накапливать знания. Но это как собака, которая все понимает, но сказать не может, скучно... Чтобы программа смогла не только отвечать на вопросы, но и самостоятельно произносить фразы и поддерживать разговор, нужно задать смысл этим ее действиям. Для этого ей нужно сделать потребности. Так как на окружающий мир программа влиять не может и никаких физических потребностей у нее тоже нет, потребности должны быть интеллектуальные. Например - сбор информации. Но просто бессистемный сбор информации - это тоже не интересно, поэтому стремления программы можно поделить на "управляющие динамики". Например у программы может быть динамика, заставляющая ее интересоваться всем, что связано с биологией. Или можно вложить в программу стремление найти ответ на какой-либо вопрос...
5 "Характер" Те же динамики, но их цель - сделать поведение программы более человечным, изобразить чувства, что ли..
6 "Настроение" Тоже самое, что и 5, но меняющееся в зависимости от обстоятельств.
Все что я выше написал, получилось весьма общим и, местами, невнятным. ;) Так что задавайте вопросы (если, конечно, мои мысли показались вам интересными), я дам разъяснения.
PS Интересно, найдется кто-нибудь, кто все это прочитает? ;)
Наверно я отсоединяюсь.Вы должны меня понять,народу мало,у самого времени на все это нет..Дело даже не в сложности..Успехов!(если будет много народу на проект,то я вернусь,а пока...)
Archon , идея классная, в совокупности с моей идей, наверное, можно сделать что-то, способное имитировать нормального человека. Жалко, что пока я остаюсь один, но трудности меня не страшат. Начну пытаться реализовывать. Пока не буду браться за лингвистический анализ, пока сделаю просто обработчик запросов. Буду отписываться тут, но надеюсь, что кто-то присоединится к реализации этой программы.
Благородное дело. Молодец! Думаю начать следует вот с чего... Сделай сперва программу, реализующую разбор предложений типа "Мама мыла раму". В ней должны быть реализованы "База знаний" и "Память" на минимальном необходимом для работы программы уровне. Эта задача не очень сложная. А потом развивай эту программу так: придумываешь пример предложения, которое твоя программа еще не может корректно обработать и дополняешь ее, чтоб могла. И так, шаг за шагом, глядишь что нибудь и выйдет.