Fw: разговоры
From: Тармо Пикаро ( tpikaro@turkuamk.fi ) Date: 1999-10-10 22:56
Я пересылаю одно интересное письмо с нового 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] ***