ТОМ2 - платформа для парсерных игр

Объявление

Платформа ТОМ предназначена для создания текстовых игр на русском языке и имеет развитый парсер, позволяющий взаимодействовать с играми с помощью команд на близком к естественному языке. В данный момент активно разрабатывается версия ТОМ 2.
Последнюю версию платформы можно скачать здесь.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » ТОМ2 - платформа для парсерных игр » Разработка плагинов, словарей, библиотек » Пример реализации словаря для 2го ТОМа


Пример реализации словаря для 2го ТОМа

Сообщений 1 страница 12 из 12

1

Информация устарела!

Словарь больше не является плагином, и работает как обязательная составная часть платформы.
В остальном всё более-менее соответствует текущему положению.

2

Словарь работает как обычный плагин, тут ничего не поменялось.
Парсер, встретив неизвестное слово, обращается к словарю. Если эта словоформа есть в словаре, словарь должен вернуть код, формирующий это слово.

3

Хмм... надо уточнить несколько моментов. В плагин могут посылаться слова не в начальной форме? Что будет, если несколько плагинов зарегистрируют функцию getword? Как быть с синонимами? Когда вызывается функция getword: в момент парсинга очередной команды или один раз при первом проходе по программе? Т.е. можно ли подстроить так, чтобы первый раз на слово выдавалась одна лексема, а в следующий раз на него-же уже другая? Спрашиваю потому что думаю о динамическом редактировании и отладке словаря без перезапуска ТОМа.

И ещё подумал, что при такой гибкости можно исправлять опечатки пользователя прямо в плагине. Например, на слово "сафлетка" возвращать нормальную лексему для салфетки. :)

4

Alexandr написал(а):

В плагин могут посылаться слова не в начальной форме?

Да, любое встреченное в команде слово.

Alexandr написал(а):

Что будет, если несколько плагинов зарегистрируют функцию getword?

Работать будет тот, который зарегистрировал свою функцию последним.

Alexandr написал(а):

Как быть с синонимами?

Пока никак. Можно считать что их нет.
Скоро появятся механизмы для указания синонимов, и 99% что они потребуют поддержку на уровне словаря.
Но пока этих механизмов нет, говорить об этом рано.

Alexandr написал(а):

Когда вызывается функция getword: в момент парсинга очередной команды, или...

В самом начале парсинга очередной команды. Каждое слово запрашивается только один раз, после чего хранится в памяти платформы.

Alexandr написал(а):

можно ли подстроить так, чтобы первый раз на слово выдавалась одна лексема, а в следующий раз на него-же уже другая?

Нет, так не получится. Если словоформа входит в несколько лексем (слово "пила") то словарь должен выдать все слова за один раз:

Код:
слово пила
  пила.ключ = ЖрНд
  пила.форма ИпЕч = пила
  пила.форма РпЕч = пилы
...

слово пить
  пить.ключ = Нг //несовершённый глагол
  пить.форма ПвМрЕч = пил
  пить.форма ПвЖрЕч = пила
  пить.форма ПвСрЕч = пило
  пить.форма ПвМч = пили
...
Alexandr написал(а):

можно исправлять опечатки пользователя прямо в плагине

Теоретически можно, только нужно продумать как словарь будет сообщать парсеру на что он исправил это слово.
В текущей реализации это приведёт к ошибке.

5

ASBer написал(а):

Работать будет тот, который зарегистрировал свою функцию последним.

Эх. Несколько плагинов-словарей разных производителей уже не подключить. :) Что-ж, придётся делать какой-то универсальный плагин, который будет работать с более-менее стандартизированными словарями. (Кстати, с SQL я не дружу).

ASBer написал(а):

Скоро появятся механизмы для указания синонимов, и 99% что они потребуют поддержку на уровне словаря.

Интригующе. Жду с нетерпением :)

ASBer написал(а):

Каждое слово запрашивается только один раз, после чего хранится в памяти платформы.

Надеюсь тут не будет проблем с такими случаями: платформа запрашивает слово "пилы" и получает одну лексему для существительного "пила". А затем, зная слово "пила" и не спрашивая словарь повторно ошибочно распознаёт глагол как существительное. Запоминаются только точные словоформы и слово в другой форме запрашивается повторно?

ASBer написал(а):

Теоретически можно, только нужно продумать как словарь будет сообщать парсеру на что он исправил это слово.

Например, в первой строке указывать опечатку:

Код:
  опечатка салфеткой

  слово салфетка
  салфетка.ключ = ЖрНд
  салфетка.форма ИпЕч = салфетка
  салфетка.форма РпЕч = салфетки
...

6

Alexandr написал(а):

платформа запрашивает слово "пилы" и получает одну лексему для существительного "пила". А затем, зная слово "пила" и не спрашивая словарь повторно ошибочно распознаёт глагол как существительное.

Кстати да, такие ошибки возможны. Надо подумать...  :blush:

Alexandr написал(а):

Например, в первой строке указывать опечатку:

Я тоже что-то подобное себе представлял. Надо подумать...  8-)

Alexandr написал(а):

Кстати, с SQL я не дружу

SQL не сложнее паскаля. Потом всяко пригодится.

7

Вынес словарь в плагин. При намеренной ошибке "заложь рюмку за воротник" парсер не спрашивает у плагина слово "заложь". Почему? Откуда он знает, что этого слова нет в словаре? Если набрать "заложи рюмку за воротник", то всё прекрасно запрашивается. Но как? Он что, телепат?

Отредактировано Alexandr (2011-06-10 11:51:42)

8

Alexandr написал(а):

Он что, телепат?

Прошу прощения. Это у меня в плагине глюки.
Нада-же, как он словарь мучает. Столько всего запрашивает: класс, свойство, описание, нет, да... кошмар! Вот зачем нужна скорость у словаря.

Отредактировано Alexandr (2011-06-10 12:03:18)

9

Alexandr написал(а):

Нада-же, как он словарь мучает. Столько всего запрашивает: класс, свойство, описание, нет, да... кошмар!

Да, сейчас парсер запрашивает даже то что заведомо не является словом, например xy32 или генерал_майор.
Такие литералы надо будет сразу отбрасывать.

10

Обновил код плагина.
Изменения небольшие:

typedef int __stdcall (*wcsRegFn)(const wchar_t*,wcsFn,int,int);

enum{ FnInput=1, FnOutput=2, FnOther=3, FnCommand=4 };

RegFunction(L"getword",GetWord,FnOther,1);

11

И зачем же нужна эта FnCommand и четвёртый параметр функции RegFunction ?

12

Alexandr написал(а):

И зачем же нужна эта FnCommand и четвёртый параметр функции RegFunction ?

Четвёртый параметр функции RegFunction передаёт количество аргументов регистрируемой функции. Может быть 0, 1 или 2.
FnCommand - это тип функций, доступных игроку из командной строки в игровом режиме. Все остальные недоступны. (В словаре этот тип не используется).


Вы здесь » ТОМ2 - платформа для парсерных игр » Разработка плагинов, словарей, библиотек » Пример реализации словаря для 2го ТОМа