Форум 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% качество ;)

wvxvw 24.03.2011 11:29

Нет, это не из области фантастики, есть определенный набор правил по которым возможно предполжить варианты склонения. Другое дело, что есть исключения (например, кочерга :)) Но за один вечер такое не написать.
Я бы пытался определить к какому склонению (их всего 3 помножить на множественное + единственное число), потом определить, должно ли происходить чередование, или добаление / редукция корневых гласных - они тоже не происходят случайно, а только в определенных падежах, при определенном стечении обстоятельств, например если сонорная следует за глухой согласной, то между ними появится "о" в винительном падеже (придумано), и собственно все :) Ошибки, естесственно будут т.как иногда не возможно понять является ли суффикс или окончание таковыми, или это часть корня. Кроме того есть исторически сложившиеся исключения из правил, типа "кофе", который алгоритм распознал бы как второе склонение среднего рода с окончанием "е", в то время как это анахронизм и редуцированое окончание "ий" (кофий или кофей), соответственно, мужской род, но изза того, что анахронизм, и историческая фрома склонения больше не используется, слово теперь никак не склоняется. Но, для игры, я думаю, было бы даже веселее, если бы все слова склонялись "правильно", в том смысле, что у любого слова можно было бы образовать любое число и любой падеж :)

Т.е. "правильно" склоняемый кофе был бы таким:
И. кофе, мн. ч. кофи
Р. кофе, мн. ч. кофи
Д. кофю, мн. ч. кофям
В. кофю, мн. ч. кофи
Т. кофем, мн. ч. кофями
П. для кофя, мн. ч. для кофев

i.o. 24.03.2011 11:33

Цитата:

А Вовка и Серёга? Ваня и Петя?
ну это существительные первого склонения.
Посмотрев раздел "Грамматика" - http://ru.wikipedia.org/wiki/%D0%98%...BD%D0%BE%D0%B5
создается ощущение, что в принципе можно написать очень общую реализацию по анализу окончаний.
Если в имени цифры и всякая ересь - то такое лучше оставлять без изменений )

Добавлено через 7 минут
Другое дело, что имена могут быть не только существительными. Например "Весёлая" и "Анастасия" можно посчитать за существительное первого склонения, если анализировать только окончания.
Тогда в данном случае у прилагательного будет менятся только последняя буква, вместо 2х...

Добавлено через 11 минут
я бы так "кофе" сопоставил с "море"-м. Тогда склонялось бы по-другому :)

wvxvw 24.03.2011 11:58

При регистрации считать, что имя указано в именительном падеже единственном числе, а то слова типа "неудача" иначе вообще никак не распознать (например "Неудача сегондя не было в школе, неудач идет за пивом").
Кстати, на счет кофе... да, тут же еще от ударения зависит... хм. Но море / горе кажется более подходящим примером :)

DaFive 24.03.2011 12:38

Заюзать API Яндекса для склонения, раз на сервере все происходит и не париться.

i.o. 24.03.2011 12:41

Цитата:

Кстати, на счет кофе... да, тут же еще от ударения зависит... хм
Ничего личного, но у предложного ключевые вопросы "О ком? О чем?" ;)

krabanek 24.03.2011 12:59

Цитата:

При регистраций/созданий персонажа указывать пол. 100% качество
Это будет введено после приведения *****-кода (который писал не я) в нормальный вид. Сейчас этого сделать нереально.
Цитата:

Большой пост wvxvw
Ну всякий кофиев склонять не заставят, ибо склонять надо будет только имена игроков, причем большинство русские (извращенцев с литспиком и др. просто банят). К тому же я не встретил до сих пор ни одного имени, которое можно было бы отнести к исключениям.
Цитата:

Если в имени цифры и всякая ересь - то такое лучше оставлять без изменений )
Так я там эту ересь и игнорировал бы, вкупе с английскими именами.
Цитата:

Заюзать API Яндекса для склонения, раз на сервере все происходит и не париться.
Вся проблема в том, что как раз не на сервере все происходит.

Добавлено через 7 минут
Цитата:

При регистраций/созданий персонажа указывать пол. 100% качество
Это будет введено после приведения *****-кода (который писал не я) в нормальный вид. Сейчас этого сделать нереально.
Цитата:

Большой пост wvxvw
Ну всякий кофиев склонять не заставят, ибо склонять надо будет только имена игроков, причем большинство русские (извращенцев с литспиком и др. просто банят). К тому же я не встретил до сих пор ни одного имени, которое можно было бы отнести к исключениям.
Цитата:

Если в имени цифры и всякая ересь - то такое лучше оставлять без изменений )
Так я там эту ересь и игнорировал бы, вкупе с английскими именами.
Цитата:

Заюзать API Яндекса для склонения, раз на сервере все происходит и не париться.
Вся проблема в том, что как раз не на сервере все происходит.

Wolsh 24.03.2011 15:19

Цитата:

К тому же я не встретил до сих пор ни одного имени, которое можно было бы отнести к исключениям.
Не задумываясь - женские: Чулпан, Лилит, Марго, Любовь, Ингрид, Кармен.
Мужские: Исайя (вообще куча библейских - Илья, Мойша и т.п.), Микула, Вакула, Вано.
Их сотни. Русскоязычные пользователи - не значит с русскими именами.

wvxvw 24.03.2011 17:33

Цитата:

Сообщение от i.o. (Сообщение 983417)
Ничего личного, но у предложного ключевые вопросы "О ком? О чем?" ;)

Оу... какой кошмар :)

krabanek 25.03.2011 02:02

Цитата:

Их сотни.
Таких не экзотичных (да-да, такие не экзотичными считаются) имен честно не встречал. У нас там похлеще есть, но почему-то укладывающиеся в правила.

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

i.o. 25.03.2011 02:10

Цитата:

У нас там похлеще есть, но почему-то укладывающиеся в правила.
Эм, люди, а собсна мы тут вроде как обсуждаем не исключения, а программу...
Вы напишите хоть что-нибудь, и мы пообсуждаем результат :)

Wolsh 25.03.2011 02:37

Цитата:

Таких не экзотичных (да-да, такие не экзотичными считаются) имен честно не встречал.
1. Интересная логика предложения. Не встречал, но они не экзотичны.
2. Кто говорил про экзотичность? Экзотичные по определению можно оставлять за бортом.
3. Не встречали Любовь, Илья, Никита? Я бы еще понял Адель, Сесег, Гоги.
Речь была о
Цитата:

имени, которое можно было бы отнести к исключениям.
Если вы можете отличить Илья от Наталья по трем последним буквам, то есть не забивая "Илья" целиком... Это и называется "исключение". Лично я знаком с пятью обладателями этого имени. И Ленин одного знал)))

i.o. 25.03.2011 02:56

Цитата:

Сообщение от Wolsh (Сообщение 983636)
Если вы можете отличить Илья от Наталья по трем последним буквам, то есть не забивая "Илья" целиком... Это и называется "исключение"

Wolsh, не горячись. На самом деле, эти имена одинаково просклоняются по падежам:

Код:

Ип:  Илья  Наталья  Катя  Дядя  Ляля
Рп:  Ильи  Натальи  Кати  Дяди  Ляли
Дп:  Илье  Наталье  Кате  Дяде  Ляле
Вп:  Илью  Наталью  Катю  Дядю  Лялю
Тп:  Ильей Натальей Катей Дядей Лялей
Пп:  Илье  Наталье  Кате  Дяде  Ляле


semenyakinVS 25.03.2011 03:10

Делал похожую штуку на шарпах. Задача была, правда, немного другая - сделать функцию, которая творила бы отчество по имени - но область одна и та же.

Решил задачу после долгих поисков по интернету - искал статьи по лингвистике. В результате нашёл правило, и задача свелась к анализу строки. Автоматом покрывало 95 процентов случаев. Остальные 5 процентов выходили ошибочными, но можно было пожаловаться на ошибку, и система добавляла предложенный пользователем результат в файл исключений (как в ворде: "добавить в словарь").

Вроде, такой вариант должен работать. А по поводу склонений... В школьном курсе по русскому что-то было про окончание слов при склонениях.

scarbo 25.03.2011 03:37

Сразу скажу, что статью не читал, но может быть и подойдет, название многообещающее:
http://www.web-junior.net/sklonyaem-familiyu-na-php/

krabanek 25.03.2011 04:06

semenyakinVS, в принципе мне вот именно такое и нужно, но без добавлений исключений (ну все-таки не коммерческий продукт)
scarbo, php не владею и то, что там пишут, для меня выходит чем-то нипанятным. :)


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

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