Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Функция склонения слова (http://www.flasher.ru/forum/showthread.php?t=152862)

krabanek 24.03.2011 04:25

Функция склонения слова
 
Необходима функция (ну или класс), которая склоняет слово по необходимому падежу. Долгое мучанье поисковиков дало только это. На паскале и только 1-ого склонения меня решительно не устроило. Делал её своими же кривыми руками, из чего опять же ничего не вышло. Все дело в том, что я пишу класс случайных событий для ролевого чата и для интерактивных событий (вставка случайного имени игрока), необходима эта программа, ибо текст вроде "Серый заяц выскочил из-за кустов, промчался мимо Вася ... " портят антуражность.
Подскажите хотя бы как организовать подобную функцию, а дальше как-нибудь сам справлюсь..

Шаблонный текст: Заранее благодарен.

i.o. 24.03.2011 04:48

предлагаю хранить для имени персонажа варианты этого имени во всех падежах.
Например так:
Код AS3:

var vasyaName:CasedWord = new CasedWord();
vasyaName.nominative = "Вася";            // именительный
vasyaName.genitive = "Васи";              // родительный
vasyaName.dative = "Васе";                // дательный
vasyaName.accusative = "Васю";            // винительный
vasyaName.instrumentative = "Васей";      // творительный
vasyaName.preposition = "Васе";          // предложный

А в строке изначально прописывать темплат. Например так:
Цитата:

"Серый заяц выскочил из-за кустов, промчался мимо ${CasedWord=genitive}... "
Потом пишется регулярка для нахождения и замены темплата.

В общем виде будет выглядеть так (вставить в кадр):
Код AS3:

var templateText:String = "Серый заяц и ${CasedWord=nominative} выскочили из-за кустов и напугали ${CasedWord=accusative}... ";
var casedName:Object = new Object();
casedName.nominative = "Клавдия Петровна";            // именительный
casedName.genitive = "Клавдии Петровны";              // родительный
casedName.dative = "Клавдии Петровне";                // дательный
casedName.accusative = "Клавдию Петровну";            // винительный
casedName.instrumentative = "Клавдией Петровной";    // творительный
casedName.preposition = "Клавдии Петровне";          // предложный
 
 
trace( fillTemplateText( templateText, casedName ) );
 
 
function fillTemplateText( temp:String, caseWord:Object ):String
{
        var outText = temp;
        var reCasedWord:RegExp = /\$\{CasedWord\=(\w+)\}/g;
        var m:Object;
        while( true )
        {
                m = reCasedWord.exec( outText );
 
                if( !m )
                        break;
                else if( !(m[1] in caseWord) )
                        continue;
 
                outText = outText.substring(0, m.index) + caseWord[m[1]] + outText.substring(m.index + m[0].length);
                reCasedWord.lastIndex = 0;
        }
        return outText;
}

трейс:
Цитата:

Серый заяц и Клавдия Петровна выскочили из-за кустов и напугали Клавдию Петровну...

krabanek 24.03.2011 05:33

Такое не поможет ни разу. Вася выступает как пример. У нас ежедневно играет до 40 игроков (соглашусь, этого мало, но у них твинков по горло). Мы же не знаем что вернет функция getRandomUser(), ибо она возвращает случайное имя пользователя, который сейчас в локации. Нужно чтоб на учете исходного имени (которое при этом может быть и английскими буквами записано), программа сама генерировала нужное склонение.

i.o. 24.03.2011 05:42

Цитата:

программа сама генерировала нужное склонение
Это из области фантастики... Или из области баз данных.
В первом случае нужен лингвистический анализ, да еще и для разных языков.
Во втором случае вы ручками забиваете базу на всевозможные имена и их падежи...

Bgg 24.03.2011 05:44

Цитата:

Сообщение от krabanek (Сообщение 983344)
Такое не поможет ни разу. Вася выступает как пример. У нас ежедневно играет до 40 игроков (соглашусь, этого мало, но у них твинков по горло). Мы же не знаем что вернет функция getRandomUser(), ибо она возвращает случайное имя пользователя, который сейчас в локации. Нужно чтоб на учете исходного имени (которое при этом может быть и английскими буквами записано), программа сама генерировала нужное склонение.

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

i.o. 24.03.2011 05:46

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

krabanek 24.03.2011 05:53

Цитата:

Это из области фантастики... Или из области баз данных.
Я в свое время составлял плохонькую программу, которая как раз на основе выданного слова генерировала склонение (но она давно утеряна по причинам форматирования винта). Работала не идеально, иногда ошибалась. Работала она только с учетом последней буквы в слове.
Цитата:

а вы хотите чтобы компьютер "как нибудь" склонял любое имя правильно
Не "как-нибудь", а вполне логичным образом. В принципе почти всегда от последних двух букв и зависит склонение. Т.е. учитывая две буквы можно сделать адекватную программу. Да и не требовал я чтобы оно было правильным, главное чтоб хоть как-то склоняло.
Цитата:

Возможно такие таблицы уже кем то составлены.
Искал в поисковиках - ноль эффекта. Разве что вот это, но оно во первых платное, во вторых на Flash не катит.

goodguy 24.03.2011 07:51

Цитата:

Сообщение от i.o. (Сообщение 983348)
если точность не требуется, то обычно если последняя буква гласная - имя женское.
хотя вряд ли это поможет )

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

Wolsh 24.03.2011 10:41

Ну если играют только Клавдия Петровна с Авдотьей Некитишной, то да.. А Вовка и Серёга? Ваня и Петя? А если wtf666 и x0tT@6bl4?

Tails 24.03.2011 10:51

При регистраций/созданий персонажа указывать пол. 100% качество ;)


Часовой пояс GMT +4, время: 02:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.