From: Тармо Пикаро ( tpikaro@turkuamk.fi ) Date: 22:56:12 10/10/99
Я пересылаю одно интересное письмо с нового news-сервера. (194.87.75.146)
P.S. Есть идея слинкивать news сервер с данной конференцией , но
ничего не обещаю - пока ни времени ,ни нужных мне знаний нету.
-------------------------------------------------------- Subject: Разговоры... Date: Wed, 6 Oct 1999 16:56:31 +0400 From: Daniil Smolyakov <Dan@jesby.tstu.ru> Newsgroups: research.ai.consciousness Вот тут это... Учимся говорить... Вообще-то расчитывалось для RPG, но это смысла не меняет. === File obraz.txt [begin] === Начнем долгое (а может и не очень) повествование про образы. То, что написано ниже вобщем-то будет использовано в компьютерной RPG, но идею, я думаю можно применить и во многих других местах. Под словом "образ" я подразумеваю группу слов, которые обозначают по сути одно и тоже. Например, образ "перемещаться" содержит в себе "бежать", "идти", "ползти", "лететь". Когда я упомянул слово "лететь" сразу понятно, что этого для нормального разговора мало, поэтому введем некоторую иерархию образов, т.е. образ "перемещаться" влючает в себя образ "лететь" и образ "идти", а уже они включают в себя слова "идти быстро", "идти медленно" или "лететь быстро", "лететь медленно". Все это дело естесственно нужно как-то хранить, я пока надумал вот такую схему: +--------------------------------+ N | Именительный: Арбуз | Если слово существительное, то | Родительный: Арбуз | во всех падежах, если глагол, то | Дательный: Арбузу | во всех лицах, числах и родах. | Винительный: Арбуз | Ну и соответсвенно с местоимениями. | Творительный: Арбузом | | Предложный: Арбузе | +--------------------------------| | Тип слова: глагол, местоимение,| | существительное и т.д. | +--------------------------------| | Вежливость слова | Нужно следить за речью... |--------------------------------| |+------------------------------+| || Количество образов к которым || || относится слово || |+------------------------------+| | +--------------------------+ | | N | Номер образа, к которому | | | | относится слово | | | +--------------------------| | | N | И т.д. | | | +--------------------------+ | +--------------------------------| |+------------------------------+| || Количество синонимов || |+------------------------------+| | +--------------------------+ | | N |+------------------------+| | | || Номер словаря || | | |+------------------------|| | | ||Номер синонима в списке || | | |+------------------------+| | | +--------------------------| | | N | И т.д. | | | +--------------------------+ | +--------------------------------| +--------------------------------| |+------------------------------+| || Количество антонимов || |+------------------------------+| | +--------------------------+ | | N |+------------------------+| | | || Номер словаря || | | |+------------------------|| | | ||Номер антонима в списке || | | |+------------------------|| | | +--------------------------| | | N | И т.д. | | | +--------------------------+ | +--------------------------------+ +--------------------------------+ N | Описание слова | +--------------------------------+ И т.д. Так выглядет структура словаря. Добавление новых слов делать всегда в конец и ни в коем случае не сортировать, иначе нужно будет менять индексы у каждого слова и образа, что, помоему, несколько медленно. А для быстрого доступа к какому-то слову делаем так: заводим список, который выглядет примерно так: +------------------+-----------------------+ | Порядковый номер | Номер слова в словаре | +------------------+-----------------------+ | Порядковый номер | Номер слова в словаре | +------------------+-----------------------+ | Порядковый номер | Номер слова в словаре | +------------------+-----------------------+ и т.д. И далее будем сортировать только этот список. Ну и нужно, я думаю, хранить индексы начальных букв, т.е. номера первых в списке слов, начинающихся на какую-либо букву, например: 1 Арбуз 2 Арка 3 Апельсин 4 Баран 5 Барабан 6 Баня 7 Бант 8 Яблоня 9 Яма Тут мы должны сделать таблицу типа: "A" : 1 "Б" : 4 "Я" : 8 С этим вроде бы разобрались. Ан нет, не разобрались еще. Можно конечно все слова разбить на корни, слоги, приставки, суффиксы и окончания, а потом просто определять к какому типу слова этот корень относится и уже потом склонять, наклонять и разгибать... Незнаю, может потом я к этому и приду, но сейчас мне более удобной кажется идея с заранее указанными вариантами написания того или иного слова. Едем дальше... ... видим мост, на мосту ворона сохнет, мы ее за хвост и под мост - пусть она помокнет. Со словами разобрались, теперь об образах. Делаем снова список образов, который выглядет примерно так: +---------------------------------+ N | Название образа | +---------------------------------+ |+-------------------------------+| || Количество слов принадлежащих || || этому образу || |+-------------------------------|| || Номер словаря, номер слова || |+-------------------------------|| || Номер словаря, номер слова || |+-------------------------------|| || И так далее || |+-------------------------------+| +---------------------------------| | Номер образа, к которому отно- | | сится данный образ. 0 - если | | такового нет. | +---------------------------------| | Дальше можно указать список тех | | образов, для которых данный | | является родителем, но примене- | | ния я этому пока не знаю. | +---------------------------------+ В итогде все образы опираются на те, которые "вшиты" непосредственно в саму программу. Но я делаю по другому: у меня остались те самые основные образы, но и они далеко не главные. Так как я использую это дело в RPG, то у меня в основном все разговоры связаны с каким-либо действием, типа: "Дай меч", "Иди за мной", "Подожди тут" и т.д. Естественно за исключением тех моментов, когда в разговоре говорящие получают просто дополнительную информацию, т.е. заносят что-то новенькое в свой блок памяти (но и это, в общем-то тоже действия). Вобщем я сделал так: каждый образ описывается командами и в итоге получается, что образы можно еще и дополнять. Команды примерно такого типа: идти куда-то, взять что-то, отдать что-то и т.д. Можно конечно еще сильнее упростить, но мне это не позволительно, так как описание образов будет, вобщем-то, доступно, нельзя допускать чтобы смухлевать можно было просто, по типу: образ "продать" (если это команды более низкого уровня) будет: "дать предмет, дать деньги, которые стоит это предмет", вместо: "дать предмет, взять (спросить) деньги". Всем изветсно, что любой обрабатывающей процедуре нужно передать какой-то параметр и получить у нее результат, в данном случае параметрами (и командами) будут: "объект" (тут может быть несколько объектов) - это то, с чем мы будем делать какие-либо действия; "действие" (или список действий) - и так понятно, что это. Во-о-от. Ниже рассмотрим примеры. Едем дальше, видим мост, под мостом ворона мокнет, мы ее за хвост и на мост - пусть она посохнет. Тут будет сплошное мое личное мнение, поэтому и отнестить к этому прошу соответственно, т.е. не ругать сразу, а указать на ошибки и прочее. Итак, когда мы разговариваем, для себя мы выделяем несколько целей, такие как объект разговора, например фраза "Где мой ключ?" указывает объект разговора "ключ" и его теперь можно не упоминать до тех пор, пока этот объект не заменят другим или просто слишком долго не будут упоминать. Продолжение примерно такое: "У Рамиреса." Тут мы уже не говорим "Ключ у Рамиреса." Тут видно, что "целью", а точнее, теперь уже "объектом" в основном являются существительные. Значит все существительные мы вносим в список объектов. Но чтобы избежать путаницы лучше срузу после объекта вставить еще и те действия, которые мы хотим с ним совершить. Как мы не старались, некотого перечисления нам все-равно не избежать, т.е. все-таки нужно описать для каждого действия шаблоны параметров. Например, в фразе "Где мой ключ?" стоит вопросительный знак, что означает желание получить ответ. Смотрим дальше, ЧТО мы хотим узнать? "Где" - образ "местоположение", "мой" - "принадлежность", "ключ" - объект. Следовательно нужно для каждого объекта хранить параметры "принадлежность", "местоположение". Так как этих параметров может быть великое множество, то используем динамические переменные, т.е. те переменные, которые могут быть, а могут и не быть. Например вместо того, чтобы хранить все данные о чем-то, мы задаем то, что по умолчанию, например "местоположение" будет равно "неизвестно", а "принадлежание" мы опишем так: [принадлежание=Владимир], а если нам нужно будет утановить местоположение, т.е. изменить значение по умолчанию на значение нужное нам, то просто добавляем еще и "местоположение", в итоге получается: [принадлежание=Владимир; местоположение=Рамирес] Это дело должно храниться в блоке данных самого предмета. Какже мы будем добывать результат? Примерно так: в конце стоит занак "?" (вопрос), значит, если у нас есть к этому предрасположение, хотим ли мы отвечать (но это только для игрушки), отвечаем: смотрим, а знаем ли мы вообще про какой-то ключ? Если знаем несколько ключей, то смотрим первый попавшийся (дальше по очереди). Если мы не знаем его принадлежность - можно спросить: он это или нет (опять таки зависит от доверчивости). Описание можно сделать по разным критериям, например по цвету, запаху, весу и т.д., естественно, все это должно быть в параметрах предмета. Вот вроде. По идее еще нужно описать другие варианты, но что-то голова припухла и сама ничего не вспоминает. Будет лучше если Вы напишете мне, а я отвечу на ваши вопросы. Так мне проще. Или ждите пока я дополню и подправлю, разобью на пункты этот самый текст. Думаю это тема будет интересна многим. ==== File obraz.txt [end] ====