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

Объявление

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

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

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



Плагин - Генератор лексем

Сообщений 31 страница 60 из 70

31

ААА!!! это бомба!
2 мегабайта за такое не жалко  :cool:

32

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

это бомба!

Не думал, что это вызовет такие бурные эмоции. :)

Дак что-там на счёт ударений? Это действительно в ТОМе проблема? Можно ли как-то восстановить?
Вылетает у тебя ошибка при выходе?

33

add_lex(Obj, Title, L1,L2,L3,L4,L5,L6,L7,L8,L9,L10)
{ if(!Obj) return
  if(title) Obj.title = agl(Title)

- тут ошибка

34

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

что-там на счёт ударений? Это действительно в ТОМе проблема?

Насчёт ударений пока не смотрел, если в это в ТОМе - поправлю.

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

Вылетает у тебя ошибка при выходе?

Советую удалить все плагины кроме своего.
Ошибка действительно иногда вылетает при выходе, если подключено 2 или более плагина - разбираюсь с этим...

35

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

- тут ошибка

Действительно, ошибка. :glasses:

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

Ошибка действительно иногда вылетает при выходе, если подключено 2 или более плагина

Фух. Прямо гора с плеч. Так не хотелось перелопачивать весь код.

36

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

Встреченные проблемы:
* Ударения влияют на парсинг

Да, это действительно так, исправлю в следующей версии ТОМа.

37

Делал ускоритель поиска в морфологе (это я так морфологический модуль обзываю). Даже назвал эту функцию "по-умному" FindAccelerator. И вот готово, но вместе с ускорением поиска увеличивается потребление оперативной памяти и очень длительный запуск. :surprise:
Вот параметры акселератора:
Время запуска: около 20 секунд
Потребление ОЗУ: около 42 Мб
Скорость генерации лексем: без акселератора 25-30 лексем в секунду, с ним 1500-2000 лексем в секунду.
(все измерения относительно моего слабенького компьютера)

В общем, скорость то хорошая, но использовать его в этом плагине не представляется возможным. Только 2 дня потратил зря :angry: . Ну может в других моих проектах пригодится.

Что-же такое придумать-то? Есть ещё одна задумка, буду пробовать. :writing:

38

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

Только 2 дня потратил зря

Ну отрицательный результат - это тоже результат ;)
Зато плюс к опыту  :flag:

39

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

Супер! щас потееестим

agl("санки") - словоформа не содержит род

40

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

agl("санки") - словоформа не содержит род

Да. "Санки" не может употребляться в единственном числе, а значит не содержит рода. В словаре и объявлено только множественное. А плагин из-за всех сил пытается сгенерировать единственное число.
Спасибо за замечание. Поправил. Будет в следующей версии.

Отредактировано Alexandr (2010-12-17 21:32:39)

41

С именами тоже беда  :'(

agl("Петя")
agl("Катя")
agl("Вова")
agl("Петр")
agl("Катерина")
agl("Владимир")

самые разнообразные ошибки...

42

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

самые разнообразные ошибки...

Т.к. версия 0.9 запаздывает, придётся выпустить промежуточную версию, что-бы хоть как-то уменьшить кол-во замеченных багов.
Версия 8.1

Исправленные баги:
* "санки" - не могли сгенерироваться из-за отсутствия единственного числа. Теперь для всех лемм без единственного числа генерируются лексемы, содержащие только множественное число.
* "место аварии" - словосочетание содержит более одного существительного в именительном падеже. Действительно, слово "аварии" можно представить в виде ИпМч. А т.к. плагин не вдаётся в глубокие размышления о смысле данного предложения, то он видит в нём два существительных, и какое из них главное, определить не может. Ошибка здесь кроется в смысле, а это значит, что без корректора здесь не обойтись. Было решено добавить ещё один корректор для словосочетаний: символ %, подставленный непосредственно перед словом, исключает это слово из генерации. В данном примере для устранения неоднозначности словосочетание нужно записать так: "место %аварии".
* Ошибки генерации некоторых имён: Петя, Катя, Вова, Петр, Катерина, Владимир
Плагин не находил нужную словоформу, т.к. все имена в словаре помечены меткой "имя". Генератор существительных работает по старому, очень привередливому выбору словоформ, вот он и забраковал все словоформы, т.к. в них содержится недопустимая для него метка "имя" (такой вот пугливый он :) ). Проблема была решена дописыванием ещё трёх меток-исключений: "имя", "фам", "отч". Это решило проблему почти со всеми именами, но имена "Петр" и "Владимир" пока не обрабатываются по другим причинам:
"Петр" почему-то может быть мужского и женского рода. Почему так, понять не могу. Корректор "Мр" не помогает, т.к. вычисление рода существительного происходит уже после фильтра по начальным свойствам.
"Владимир" сначала ругается на неоднозначность ("Владимир-имя" и "Владимир-город"), а после добавления корректора "Од" получаем ту же болезнь, что и у Петра. :hobo:

Намеченные на 0.9
* Ошибка-подсказка при неоднозначности (в разработке)
Начата разработка ошибки-подсказки. Пока сделана только подсказка при ошибке в словосочетании с несколькими существительными (можно проверить на "место аварии". Увидите всю дружественность плагина :))
* Более привередливый поиск нужной словоформы (неоднозначные морфкоды) (не начато)
* Быстрый поиск и генерация (в разработке)
Первая попытка не удалась (получилось не совсем то, что нужно было). Другие попытки не предпринимались.
* Попытаюсь разобраться с "Топором-разбойником" (не начато)
* Препарсер приставок (не начато)
Оказалось, что приставки потерялись при переводе словаря из формата АОТ в новый сжатый формат. :unsure: Придётся корректировать формат словаря.
* Файл настроек (сделано)
Теперь рядом с плагином можно положить файл настроек GenLexConfig.ini, в котором можно настраивать плагин. Файл не обязателен. Если файла нет, то используются настройки по умолчанию.
Пока есть только 2 настройки:
ChUdar - символ ударения (по умолчанию `)
GenChUdar - подставлять ударение в лексемы? (по умолчанию 1 (да))
* Почистить словарик от ненужных частей речи и слов (сделать словарь Lite) (не начато)

ASBer, и всё-таки ты мне объясни, почему ТОМ не хочет принимать прилагательное "полосатый", сгенерированное этим плагином? Запусти Sample.tom и набери "осм кошку".

43

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

Т.к. версия 0.9 запаздывает, придётся выпустить промежуточную версию, что-бы хоть как-то уменьшить кол-во замеченных багов.
Версия 8.1

Грац!  :flag:
(ушёл разбирать полосатую кошку...)

44

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

Версия 8.1

o.O   Назад в будущее...

Тем временем продолжаем ждать 0.9 :-)

45

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

Назад в будущее...

Ну почему-же назад. Вперёд, вот только очень-очень медленно. Запал пропал и сейчас всё больше отвлекаюсь на другие дела. Так оно всегда и бывает.

А вообще, я не думал, что за плагином следит ещё кто-то кроме ASBer-а. Может спутал с платформой? Она у нас 0.9 держится и всё никак в 1.0 не перейдёт. Вот уже версия 0.10 пошла... ваабще нонсенс какой-то. Неужели нельзя было наконец дать ей 2.0. Ой, ну это я что-то разговорился. :offtop: Ничего личного, это моё ИМХО. :tomato:

46

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

ASBer, и всё-таки ты мне объясни, почему ТОМ не хочет принимать прилагательное "полосатый", сгенерированное этим плагином? Запусти Sample.tom и набери "осм кошку".

Ошибка здесь:

Код:
{полосатый*this}

Нельзя напрямую согласовывать Пи с Си  :dontknow:
Они не совпадают по частям речи...

вот так {полосатый*this~рчп} должно работать.

47

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

А вообще, я не думал, что за плагином следит ещё кто-то кроме ASBer-а.

Думаю, что за плагином много кто еще следит.
Народ, который проявлял интерес и пытался что-либо писать под ТОМ, все как один обламывались на ручной набивке лексем.
Если с шаблонами еще туда-сюда, можно обойтись и теми что есть в ст.библиотеке, то без лексем уже никак...

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

Неужели нельзя было наконец дать ей 2.0.

Да можно дать хоть 100. :)
Но на мой требовательный вкус парсер и на 1.0 не тянет пока...

48

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

Может спутал с платформой? Она у нас 0.9 держится и всё никак в 1.0 не перейдёт.

Да, прошу прощения :-)

Хотел только присоединиться к словам ASBer'а касательно важности этой работы. Уверен, что для вдохновения и запала будет ещё масса поводов ;-)

49

agl("крашенный") - функция генерации лексемы для части речи не реализована

Для наших целей вполне правильно генерировать причастия как прилагательные.

50

В словаре есть прилагательное "крашеный" (с одной "н"). Может надо именно его?

Попробовал тупо перенаправить все причастия на генератор прилагательных, не получилось. :no: При раскопках выяснилось, что кроме обычных рода, одушевлённости, числа и падежа в причастиях напиханы всякие метки вроде "несовершенный", "прошедшее" o.O , и даже такие страшные, как "переходный" и "страдательный"! %-)
В общем надо копать... и копать глубоко. :suspicious: Лучше на выспавшуюся голову.

P.S. Вот наткнулся на примерчик предложения с причастиями для тех, кто не знает что это такое (включая меня):
"Дятел, долбящий дерево, растущее в лесу, засыпанном снегом, падающим с ветвей, сильно замёрз."

51

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

В словаре есть прилагательное "крашеный" (с одной "н"). Может надо именно его?

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

52

"Дятел, долбящий дерево, растущее в лесу, засыпанном снегом, падающим с ветвей, сильно замёрз." (с)
За такие фразы расстреливать надо.

И таки да - следят :)

53

Позвольте небольшой оффтопик. Людям со слабыми нервами рекомендую не читать. :)
Сегодня после сбоя компьютера (очередного) я открываю проект, собираюсь программировать дальше и замечаю, что Delphi ведёт себя как-то странно: вместо того, чтобы открыть модуль Генератора лексем (в нём все функции генерации) она открывает в отдельной программе какой-то файл, полностью заполненный пустыми символами. Ну, думаю, слетела. Тем временем в душе какое-то нехорошее подозрение зарождается... После нескольких попыток открыть этот файл я решаю проверить его ВинХексом (Hex-редактор). Открываю, и вижу... НУЛИ!!! Все 31,5 Кб основного модуля генерации лексем бережно заполнены нулями!
...пауза...
После минутного оцепенения я вспоминаю, что недавно перелез на новую версию Delphi, которая как-бы где-то должна хранить историю правок. И действительно, после недолгих поисков я нашёл довольно много резервных копий этого модуля. В общем, всё обошлось небольшими царапинами: потерялось только несколько строчек. Но перепугался я сильно!

Да, моему винту уже давно пора на покой, довольно часто слетают сектора... хорошо, что NTFS такая стабильная (тьфу-тьфу). Но с проектами - это в первый раз. :|

54

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

Но перепугался я сильно!

После того как у меня сдохла флешка со всем что было, я ежедневно делаю копии. Все сводится к запуску простого батника.
А так копии версий различной давности лежат на 3х разных компах и на флешке. А теперь еще и на ifiction.ru на всякий случай ;)

55

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

метки вроде "несовершенный", "прошедшее"  , и даже такие страшные, как "переходный" и "страдательный"!

Видимо нужно смотреть эти метки у указанной словоформы и по ним отобрать остальные слововормы в лексеме.

Примеры:
"копающий" несовершённое, настоящее (копающий яму землекоп).
"копавший" несовершённое, прошедшее (копавший яму землекоп).
"выкопавший" совершённое, прошедшее (выкопавший яму землекоп).
"выкопаюший" совершённое, будущее (нужно найти землекопа, выкопаюшего яму).
"копаемый" несовершённое, настоящее, страдательное (копаемая землекопом яма).
"выкопанный" совершённое, прошедшее, страдательное (выкопанная землекопом яма).
"копающийся" несовершённое, настоящее, возвратное (копающийся в яме землекоп).
"копавшийся" несовершённое, прошедшее, возвратное (копавшийся в яме землекоп).
"выкопавшийся" совершённое, прошедшее, возвратное (выкопавшийся из ямы труп землекопа).

UPD: поправил примеры.

56

Спасибо за примеры. Удалось сделать генерацию причастий, но ценой добавления отдельной функции для причастий и расширения морфолога для обработки времени, совершённости, переходности и залога. Вот такая ерунда сейчас выходит из генератора:

кра`шенн%; ПиПвНсПгСз; ИпЕч; ИпМрЕч=ый; РпМрЕч=ого; ДпМрЕч=ому; ВпМрЕчНд=ый; ВпМрЕчОд=ого; ТпМрЕч=ым; ПпМрЕч=ом; ИпЖрЕч=ая; РпЖрЕч=ой; ДпЖрЕч=ой; ВпЖрЕч=ую; ТпЖрЕч=ой; ПпЖрЕч=ой; ИпСрЕч=ое; РпСрЕч=ого; ДпСрЕч=ому; ВпСрЕч=ое; ТпСрЕч=ым; ПпСрЕч=ом; ИпМч=ые; РпМч=ых; ДпМч=ым; ВпМчНд=ые; ВпМчОд=ых; ТпМч=ыми; ПпМч=ых

В постоянные свойства для причастий добавляется 4 перечисленных выше свойства. Они могут помешать ТОМу или их можно оставить?

Параллельно идёт доработка "системы корректировки" (при неоднозначности анализирует ситуацию и выводит подробную информацию о ней с объяснениями и примерами устранения). Уже есть неплохие результаты. :)

57

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

В постоянные свойства для причастий добавляется 4 перечисленных выше свойства. Они могут помешать ТОМу или их можно оставить?

Лучше убрать... пусть будут 1 в 1 как прилагательные.

58

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

при неоднозначности анализирует ситуацию и выводит подробную информацию о ней с объяснениями и примерами устранения

Для вывода сообщений на экран можно использовать функцию tom.dll RunText()

Код:
typedef const char* __stdcall (*strFn)(const char*,const char*,const char*);
strFn RunText;

...

//получаем функции движка
EngineDll=GetModuleHandle("tom.dll"); //движок уже загружен
RunText = (strFn)GetProcAddress(EngineDll,"RunTextANSI");

...

const char* __stdcall gl(const char*Login,const char*Arg,const char*Arg2)
{
...
  RunText(Login,"%<font color=red>описание ошибки</font>",0);
}

Тогда пропадёт необходимость в обёрточной функции agl()

59

Версия 8.2
Выпущена, т.к. все силы брошены на редактор и времени на доработку генератора совсем нет.

Изменения (которые помню):
* Генерация причастий как прилагательных.
* Доделана ошибка-подсказка при неоднозначности. Почти всегда при неоднозначности выходит сообщение с советами по решению проблемы.
* Параметр-корректор по номеру леммы (система корректировки подскажет, как его использовать, если оно встретится).

Всё это собрано на полпути и не тестировалось в полной мере. Могут возникнуть баги в местах, где раньше не было :(

60

Ок, спасибо!
В новом году основательно потестю.