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

Объявление

Открыт сайт tom2-game.ru.


Последнюю версию платформы можно скачать здесь.

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

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



Генератор словоформ от Alexandr-а

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

1

Вчера случайно наткнулся на словарик окончаний русского языка, не удержался и сделал программу генерации словоформ. Она работает по другому принципу и оформлена в виде последовательного мастера. Старался сделать так, чтобы полностью управлялась с клавиатуры и за минимальное кол-во действий генерировала лексемы старого формата ТОМа.
Т.к. словарь (или база..  :dontknow: ) окончаний, которую я нашёл, была разработана явно для других целей, пришлось подгонять программу под словарь (а не словарь под программу), поэтому возникли некоторые трудности, которые пришлось решать введением дополнительных функций и процедур, что сильно усложнило программный код  :'( . По этой и ещё ряду причин программа ведёт себя не всегда адекватно и может вылетать на некоторых словах. В общем, это ещё очень сырая версия. Но несмотря на это она довольно быстро (за около 2-5 вопросов) определяет "шаблон" и достраивает остальные словоформы. Можно было-бы и быстрее, но словарик окончаний содержит достаточно много лишнего и неправильного.
Вот собственно и сама программа.
Буду рад, если кому-нибудь пригодится.

P.S. Странная у этого форума система прикрепления файлов к сообщению. :huh:  Зачем-то заливает на ifolder. :dontknow:

2

К сожалению не распаковывается, вероятно у меня устаревший RAR...
Какой версией заархивировано?

3

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

Какой версией заархивировано?

Версией 3.51.

Вот перепаковал в zip, но тем же WinRar-ом. Должно открыться.

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

Отредактировано Alexandr (2010-07-20 07:59:38)

4

Скачал, посмотрел, помоему очень ценный инструмент получился! :glasses:

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

Только сейчас ввёл слово "огонь"

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

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

5

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

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

Ну мне эти ужасы не страшны, я (моя программа) ведь генерирую лексему не логическими условиями а просто выбирая шаблон словоизменеия из базы окончаний.  :blush: Кстати, если открыть файлик "sik.rus" в блокнотике, то можно увидеть эту самую базу.

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

Сгенеренную лексему нужно копировать в основное окно, чтобы не терялась.

Сгенерированная лексема и так копируется в буфер обмена. А главное окно я "зарезервировал" для более интересных вещей. Я хотел там сделать генератор предложений примерно в таком виде: вводишь предложение на подобии "большой деревянный меч старого гоблина", и в режиме мастера задаёшь словоизменение каждого слова. В результате должно сгенерироваться что-то вроде:

Код:
 наименование = "больш% деревянн% меч% старого гоблина; МрЕчНдСи; Ип; Ип=ой,ый,; Рп=ого,ого,а; Дп=ому,ому,у; Вп=ой,ый,; Тп=им,ым,ом; Пп=ом,ом,е"
 this.большой = "больш%; Пи; ИпНд; ИпЕчМр=ой; РпЕчМр=ого; ДпЕчМр=ому; ВпЕчОдМр=ого; ВпЕчНдМр=ой; ТпЕчМр=им; ПпЕчМр=ом;
     ИпЕчЖр=ая; РпЕчЖр=ой; ДпЕчЖр=ой; ВпЕчЖр=ую; ТпЕчЖр=ой; ПпЕчЖр=ой;
     ИпЕчСр=ое; РпЕчСр=ого; ДпЕчСр=ому; ВпЕчСр=ое; ТпЕчСр=им; ПпЕчСр=ом;
     ИпМч=ие; РпМч=их; ДпМч=им; ВпМчОд=их; ВпМчНд=ие; ТпМч=ими; ПпМч=их"
 this.деревянный = "деревянн%; Пи; ИпНд; ИпЕчМр=ый; РпЕчМр=ого; ДпЕчМр=ому; ВпЕчОдМр=ого; ВпЕчНдМр=ый; ТпЕчМр=ым; ПпЕчМр=ом;
     ИпЕчЖр=ая; РпЕчЖр=ой; ДпЕчЖр=ой; ВпЕчЖр=ую; ТпЕчЖр=ой; ПпЕчЖр=ой;
     ИпЕчСр=ое; РпЕчСр=ого; ДпЕчСр=ому; ВпЕчСр=ое; ТпЕчСр=ым; ПпЕчСр=ом;
     ИпМч=ые; РпМч=ых; ДпМч=ым; ВпМчОд=ых; ВпМчНд=ые; ТпМч=ыми; ПпМч=ых"
 this.меч = "меч%; НдСи; Ип; ИпЕч=; РпЕч=а; ДпЕч=у; ВпЕч=; ТпЕч=ом; ПпЕч=е;
     ИпМч=и; РпМч=ей; ДпМч=ам; ВпМч=и; ТпМч=ами; ПпМч=ах"

Вот такие у меня мечты  :rolleyes:

Кстати, со словом "огонь" я уже разобрался. Во-первых, в словаре была ошибка. Там форма "огнём" была задана "огнем", хотя остальные слова были заданы с "ё". Ошибка? Возможно. Во-вторых, нашёл один глюк с неизменяемыми словами, исправил. Так-же добавил функцию чистки промежуточных переменных, так-что возможно исправилась проблема с вылетом программы при многократном её использовании без перезапуска.
Вот она. Более стабильная версия.

6

Затыкается на слове "вселенная"  :dontcare:
Долго спрашивает про формы, потом генерит как несклоняемое слово.

+ нет парадигм для притяжательных прилагательных: "папин", "лисий", "бабий". Хотя это уже изыски...

7

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

Затыкается на слове "вселенная"
Долго спрашивает про формы, потом генерит как несклоняемое слово.

Да. Скорей всего не хватает шаблона (ну или парадигмы, по Вашему) для такого типа слов. Если добавить в файл sik.rus строчку
"94    ая    ой   ой   ую   ую   ой   ой    /    ые   ых   ым   ые   ые   ыми  ых   ;    вселенная"
то программа всё-равно долго спрашивает формы, но всё-таки выдаёт правильный результат.
А я ведь исправлял глюки с этим неизменяемым шаблоном "безе", чтобы не лез куда не надо.  :mad:  Видимо не до конца исправилось. Буду искать проблему.

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

+ нет парадигм для притяжательных прилагательных: "папин", "лисий", "бабий". Хотя это уже изыски...

Как ни странно, но у меня, если ввести "папин", выбрать "Прилагательное" (по умолчанию программа ошибается и ставит сущ.), и ответить на пару вопросов "папиной", "папиного", то она почти правильно генерирует лексему (проблема тока в "Вижу папин человека."). То же и с остальными словами. Что я делаю не так?  o.O

Большое спасибо за тестирование.

В идеале, такие программы тестируются программно по словарю готовых лемм. Берётся, например база с АОТ-а и программно прогоняется в этом генераторе. Ошибки логируются, исправляются. Я, наверное, потом так и сделаю.

Стоит ли доделывать программу до генерации словосочетаний? А то я наткнулся на сообщение о закрытии разработки ТОМа 0.9.3.2 и подумал, что может быть в новой версии генератор будет уже не нужен.

8

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

Как ни странно, но у меня, если ввести "папин", выбрать "Прилагательное" (по умолчанию программа ошибается и ставит сущ.), и ответить на пару вопросов "папиной", "папиного", то она почти правильно генерирует лексему (проблема тока в "Вижу папин человека."). То же и с остальными словами. Что я делаю не так?

Не знаю... у меня просто отказывалось генерить слово. Попробую еще раз.

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

Стоит ли доделывать программу до генерации словосочетаний? А то я наткнулся на сообщение о закрытии разработки ТОМа 0.9.3.2 и подумал, что может быть в новой версии генератор будет уже не нужен.

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

Что касается словосочетаний: возможность отдельно сгенерить лексемы для каждого слова - это уже 95% работы автоматизировано.
Если еще будет генериться строка для самого словосочетания - будет здорово :)

9

Мдя. На форуме тихо как на кладбище. Аж мурашки по коже.  :insane:
Что-бы не теряться, решил отписать о текущих наработках.
Уже почти доделал генератор словоформ, но в ходе последних исследований и опытов над прилагательными базы АОТ выяснилось, что генерировать формы прилагательных в полностью автоматическом режиме не так уж и сложно! :idea: Сделал программу, строящую по базе дерево зависимости изменения окончаний от начальной формы прилагательного и нашлось колоссальное кол-во закономерностей! Я, полный воодушевления и находящийся на 7-ом небе от счастья :jumping: , бросил все силы на дальнейшее изучение и начал составлять программу, которая бы генерировала формы в автоматическом режиме но... :O (как всегда это противное НО)... нашлась проблема, которая не может решаться компьютером автоматически: мягкий знак, зависящий от вопроса, поставленного к прилагательному (незнаю как это называется, плохо учил русский язык в школе, от чего сейчас страдаю  :'( ), например:
акулий (чей?) -> акулЬего
бывший (какой?) -> бывшего
вроде-бы оба слова - прилагательные, а мягкий знак зависит именно от вопроса... а как научить компьютер определять вопрос? Никак. Для этого нужен разум.
Но я не сдавался!  :writing: И после нескольких дней работы и четырёх переписываний функции с нуля родилось оно! Я даже не стал делать функцию в виде дерева, а просто загнал всё в таблицу (на столько уже это надоело). Если бы не этот мягкий знак, о котором говорилось выше, то таблица содержала бы не больше 10-ти записей, а так она выросла до 80-ти записей. Все эти записи были вылизаны ручками и подправлены для максимально эффективной работы.

Итоги: на данный момент функция правильно генерирует 42184 прилагательных из 42227, а неправильно только 43, причём больше половины из этих ошибок - это ошибки в базе АОТ. Т.е. процент правильного угадывания словоформы составляет 99,9%! И это без словаря и с возможностью составления словоформ, отсутствующих в словаре АОТ!  %-)
Под прилагательными я подразумеваю такие слова:
- прилагательные (большой, красивый)
- притяжательные прилагательные (мамин, акулий, Адамов)
- числительные (первый, двадцатый, двухсотый)

Показать пока нечего, т.к. сделан только модуль синтеза прилагательного и тестовая программа, на которой он прогонялся по словарю АОТ.
Сейчас осталось допилить табличку, чтобы максимально снизить кол-во ошибок (сейчас 43 штуки) и оформить это всё в программку для демонстрации. Потом хочу попробовать таким-же образом обработать существительные, но думаю, что там не так всё просто :insane: .
В дальнейшем можно будет оформить эти функции в DLL и прикрутить к новому ТОМ-у. Проблема в том, что я не писал DLL-ки и придётся этому учиться. А можно ли вызывать из одной DLL другую DLL?

Прошу прощения за раздутое сообщение, просто накипело, захотелось выговориться. :tomato:

10

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

Мдя. На форуме тихо как на кладбище. Аж мурашки по коже.

Богатая у вас фантазия :)
Мой принцип таков: если хочется писать - нужно писать код,  :writing:  а иначе весь запал на форуме можно потратить :surprise:

11

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

Итоги: на данный момент функция правильно генерирует 42184 прилагательных из 42227, а неправильно только 43, причём больше половины из этих ошибок - это ошибки в базе АОТ. Т.е. процент правильного угадывания словоформы составляет 99,9%! И это без словаря и с возможностью составления словоформ, отсутствующих в словаре АОТ!

Очень хороший результат! Не ожидал что такое впринципе возможно...
Очень хотелось бы посмотреть демку  :rolleyes:

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

В дальнейшем можно будет оформить эти функции в DLL и прикрутить к новому ТОМ-у. Проблема в том, что я не писал DLL-ки и придётся этому учиться. А можно ли вызывать из одной DLL другую DLL?

Да, можно конечно прикрутить, хотя исходник программы более желателен, с ним проще работать при возникновении различных нестыковок.

12

Генератор лексем обзавёлся новенькой цифрой 0.8.1.133. И не просто так! Со времени последней версии было сделано много мелких наворотов, прикручен синтезатор прилагательных и исправлены мелкие баги.
Возможности новой beta-версии:

- Генерация лексем для словосочетаний:

"Замшелая шляпа, забитая в угол стола" превращается в
"Замшел% шляп%, забит% в угол стола;НдЖр;Ип;
ИпЕч=ая,а,ая;РпЕч=ой,ы,ой;ДпЕч=ой,е,ой;ВпЕч=ую,у,ую;ТпЕч=ой,ой,ой;ПпЕч=ой,е,ой;
ИпМч=ые,ы,ые;РпМч=ых,,ых;ДпМч=ым,ам,ым;ВпМч=ые,ы,ые;ТпМч=ыми,ами,ыми;ПпМч=ых,ах,ых;"

- Регистр букв не имеет значения. Регистр слов по возможности сохраняется.
Если слово написано с заглавной буквы или полностью из больших букв, то оно таким и останется в сгенерированной лексеме:

"ОКНО, Заплетённое паутиной" превращается в
"ОК%, Заплетённ% паутиной;НдСр;Ип;
ИпЕч=НО,ое;РпЕч=НА,ого;ДпЕч=НУ,ому;ВпЕч=НО,ое;ТпЕч=НОМ,ым;ПпЕч=НЕ,ом;
ИпМч=НА,ые;РпМч=ОН,ых;ДпМч=НАМ,ым;ВпМч=НА,ые;ТпМч=НАМИ,ыми;ПпМч=НАХ,ых;"

- Знаки препинания и различные символы между слов не мешают генерации лексемы:

"Вау... Звонящий!!11!! ТЕЛЕФОН!!??!" превращается в
"Вау... Звонящ%!!11!! ТЕЛЕФОН%!!??!;НдМр;Ип;
ИпЕч=ий,;РпЕч=его,А;ДпЕч=ему,У;ВпЕч=ий,;ТпЕч=им,ОМ;ПпЕч=ем,Е;
ИпМч=ие,Ы;РпМч=их,ОВ;ДпМч=им,АМ;ВпМч=ие,Ы;ТпМч=ими,АМИ;ПпМч=их,АХ;"

- Прикрученый к программе модуль синтеза прилагательных позволяет без вопросов генерировать лексемы для них.

Генерируемые лексемы не тестировались на платформе ТОМ, поэтому вопрос о правильности формата лексем остаётся открытым.

А здесь лежит эта версия 0.8.1.133.

P.S. В ходе написания данного поста в программе была выявлена и устранена ещё одна нехорошая ошибка. Это говорит, что эта версия действительно beta.

А сейчас немного об автоматических синтезаторах:

Модуль синтеза прилагательных был поправлен и доведён до финальной версии. Кол-во записей увеличилось до 97. Но при тестировании было замечено, что база АОТ содержит достаточно много ошибок разного типа. А т.к. модуль "обучался" именно на этой базе, то и выдавать он стал результаты с теми же ошибками. По этому нужно провести его тестирование на другом словаре прилагательных. Боюсь, что заявленная цифра в 99,9% резко упадёт. :(
В частности, модуль на слово "мамин" говорит "[нету] мамина [стола]". То же творится с "папин" и некоторыми другими прилагательными. В базе АОТ слово "мамин" в родительном падеже так и записано. А здравый смысл мне говорит, что надо писать "нету маминого стола". Кому верить?

Попробовал с лёту по аналогии с прилагательными обработать существительные: застрял. :hobo: Загнал существительные в программу, которой генерировал дерево закономерностей для прилагательных - так она повисла и вылетела с ошибкой "out of memory". :blush: Нормально генерирует дерево только до 3-ей вложенности узлов (прилагательные нормально генерировались до 6-ого). А при попытке составить по этому дереву список шаблонов она выводит неподъёмную кучу записей. И это только для одной формы из 12-ти. Всё это говорит, что существительные изменяются куда сложнее прилагательных. Но я всё-же попытаюсь ещё что-нибудь сделать. :flag:

Отредактировано Alexandr (2010-08-02 22:55:16)

13

Отличная работа!

14

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

Всё это говорит, что существительные изменяются куда сложнее прилагательных.

А это ведь ты еще до глаголов не добрался... :nope:

Мой выбор: словарь основ слов + генерация словоформ + корректировочный словарь исключений поверх генерации.
Вот только бы найти вагон времени, чтобы все это закодить :D

15

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

А это ведь ты еще до глаголов не добрался...

Да. Глаголы - это что-то! Хотя, если присмотреться, то может они не такие и сложные. Потом с ними буду разбираться.
Я смотрю, мы незаметно перешли на "ты"? Хорошо.

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

Мой выбор: словарь основ слов + генерация словоформ + корректировочный словарь исключений поверх генерации.

Учту. У меня есть модуль работы с базой АОТ. Он как раз и представляет из себя словарь основ + словоизменение. Можно будет на его основе что-нить сделать.

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

В частности, модуль на слово "мамин" говорит "[нету] мамина [стола]". То же творится с "папин" и некоторыми другими прилагательными. В базе АОТ слово "мамин" в родительном падеже так и записано.

Причина нестыковки выяснена: Непосредственно посмотрел в базу АОТ - так там слово "мамин" в РпМрЕч имеют разные варианты: "мамина"/"маминого". А моя программа-анализатор просто брала первый вариант и считала его единственно правильным. Из-за этого анализатор и начал выдавать такие сомнительные результаты. :disappointed:

Генератор лексем, по-моему, сейчас перенасыщен лишними шагами. Хочу снизить их количество или автоматизировать некоторые. Есть какие-нибудь предложения по улучшению? Или "нафиг он кому сдался, лучше что-нить другое сделай"?

16

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

Я смотрю, мы незаметно перешли на "ты"? Хорошо.

Ну если не против... так по-моему удобнее.

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

Генератор лексем, по-моему, сейчас перенасыщен лишними шагами. Хочу снизить их количество или автоматизировать некоторые.

Я не заметил что шагов слишком много, это все равно гораздо легче чем набивать всё руками.
Если развивать генератор дальше, то следующий шаг - это конструктор объектов. Но как это должно работать пока даже не представляю...

17

В связи с тем, что в Редакторе ТОМа будет встроен полностью автоматический генератор лексем, дальнейшую разработку этого генератора считаю ненужным.
Выкладываю последнюю на данный момент версию генератора: 0.8.2.158.
Изменения:
* исправлены некоторые орфографические ошибки
* восстановлен случайно утерянный шаг выбора числа для генерируемого словосочетания
* сделано окно настроек программы, в котором можно сократить кол-во шагов для генерации лексем
* добавлен вывод лексем отдельно для всех слов в словосочетании после самого словосочетания:

стар% шляп%;НдЖр;Ип;
ИпЕч=ая,а;РпЕч=ой,ы;ДпЕч=ой,е;ВпЕч=ую,у;ТпЕч=ой,ой;ПпЕч=ой,е;
ИпМч=ые,ы;РпМч=ых,;ДпМч=ым,ам;ВпМч=ые,ы;ТпМч=ыми,ами;ПпМч=ых,ах;

старая = стар%;ПиНдЖр;Ип;
ИпЕч=ая;РпЕч=ой;ДпЕч=ой;ВпЕч=ую;ТпЕч=ой;ПпЕч=ой;
ИпМч=ые;РпМч=ых;ДпМч=ым;ВпМч=ые;ТпМч=ыми;ПпМч=ых;

шляпа = шляп%;СиНдЖр;Ип;
ИпЕч=а;РпЕч=ы;ДпЕч=е;ВпЕч=у;ТпЕч=ой;ПпЕч=е;
ИпМч=ы;РпМч=;ДпМч=ам;ВпМч=ы;ТпМч=ами;ПпМч=ах;

* сделаны параметры запуска (которые нужны для интеграции со старой версией Редактора ТОМа, поэтому формат не указывается)
* мелкие доработки

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

18

Ок, здорово!  :cool:

Могу я эту версию выложить в википедию и сделать для неё раздел на страничке ТОМа?  :question:

19

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

Могу я эту версию выложить в википедию и сделать для неё раздел на страничке ТОМа?

Да, конечно :)

20

занимательно  :cool: