Php склонение. Склонение слов на PHP
Частенько возникает необходимость склонять имена на PHP . Согласитесь, что фраза "Добавить в друзья Илья " звучит намного хуже, чем "Добавить в друзья Илью ". Поэтому склонение имён по падежам в PHP требуется достаточно часто, и в этой статье я расскажу, как это можно реализовать у себя на сайте.
Сразу скажу, что идеального варианта, увы, нет. Первый вариант весьма очевидный: найти базу имён, которые будут во всех падежах, и добавить к себе эту таблицу. Затем по имени в именительном падеже искать соответствующий падеж по базе. Минусы тут очевидны: огромная база, всех имён не охватите, лишняя нагрузка на сервер .
Второй вариант - написать свой класс склонений имён на PHP , либо воспользоваться уже готовым. Поскольку правила в русском языке достаточно сложные, плюс есть масса исключений, поэтому и библиотека потребуется очень большая, да и даже она далеко не 100% спасение. Наиболее популярная из всех библиотек, занимающихся склонением имён на PHP , является NameCaseLib .
Скачав эту библиотеку и поместив на свой сайт, её можно использовать вот так:
$case = new NCLNameCaseRu(); // Создаём объект класса NCLNameCaseRu
$array = $case->q("Русаков Михаил Юрьевич"); // Получаем массив из 6-ти элементов соответствующих 6-ти падежам, в которых окажется входная строка
print_r($array); // Выводим массив
?>
Как видите, использовать библиотеку очень просто. С другой стороны, мой главный совет будет следующий: по-возможности вообще избегайте необходимости склонять слова . Всё равно будут иногда вводить люди то, что склоняться никак не может, и попытки склонения будут выглядеть нелепо. Ведь необязательно писать "Добавить в друзья Илью ", можно же ведь написано просто "Добавить в друзья " на странице Ильи.
Модуль morpher.so предназначен для склонения по падежам слов и словосочетаний - фамилий, имен и отчеств, названий городов и товаров - на русском и украинском языках.
Функция склонения по падежам
Один миллион долларов достается из Набережные Челны " , " rod " ); ?> !
В результате получаем:
Один миллион долларов достается Пупкину Василию из Набережных Челнов!
Функция morpher_inflect склоняет словосочетание в именительном падеже (первый аргумент) в любой падеж (второй аргумент). Падеж может принимать следующие значения:
Все строки, передаваемые в библиотеку, должны быть в кодировке UTF-8. Результат также возвращается в UTF-8.
Соответствующая функция для украинского языка называется morpher_ukr_inflect . Она работает пока только с фамилиями, именами и отчествами и отличается от русской названиями падежей:
Перевод во множественное число в украинской версии пока не реализован.
Функция разбивки ФИО на составляющие
Функция morpher_split_fio разбивает входную строку на массив из фамилии, имя, отчества
Ф : Пупкин И : Василий О :
Функция перевода во множественное число
Если ко второму параметру добавить строку "mn", то результат будет во множественном числе:
На складе осталось 238 .
На складе осталось 238 кочерёг.
Если первый параметр уже во множественном числе, то будет выдано:
#ERROR: Parameter 1 "text" is plural.
Функция определения рода
" ый " , " f " => " ая " , " n " => " ое " , " p " => " ые " ); $name = " знатоки " ; $rod = morpher_get_gender ($name ); echo " Уважаем " . $endings [ $rod ] . " " . $name . " !\n " ; ?>
Для определения рода фамилий, имен и отчеств на украинском языке служит функция morpher_ukr_get_gender . Она возвращает только "m" (мужской) или "f" (женский).
Функция прописи чисел и денежных сумм
Функция morpher_spell формирует пропись числа и ставит данную единицу измерения в нужный падеж:
календарный день " ); // 28 (Двадцать восемь) календарных дней morpher_spell (" 1,2 " , " процент " ); // 1,2 (Одна целая две десятых) процента morpher_spell (2 , " сутки " ); // 2 (Двое) суток ?>
Если пропись нужно вставить в текст в определенном падеже, укажите падеж третьим параметром:
В течение календарный день " , " Р " ); ?> .
В результате получим "В течение 28 (Двадцати восьми) календарных дней."
Допустимые значения падежей: И, Р, Д, В, Т, П и их аналоги, записанные латиницей, см. . Формы с предлогами (predl-o и gde) в этой функции не поддерживаются.
Для названий некоторых денежных единиц функция morpher_spell выдает пропись такого вида:
Сто двадцать три рубля 45 копеек morpher_spell (123.45 , " доллар США " ); // Сто двадцать три доллара США 45 центов morpher_spell (123.45 , " евро " ); // Сто двадцать три евро 45 центов ?>
При желании можно использовать сокращенные наименования денежных единиц, с точкой или без:
Сто двадцать три руб. 45 коп. morpher_spell (123.45 , " долл. США " ); // Сто двадцать три долл. США 45 центов morpher_spell (123.45 , " грн. " ); // Сто двадцать три грн. 45 коп. ?>
Или трехбуквенные коды валют международного стандарта ISO 4217, таких как RUB, USD, EUR и др. При этом в название денежной единицы автоматически включается название страны:
Сто двадцать три российских рубля 45 копеек morpher_spell (123.45 , " UAH " ); // Сто двадцать три украинских гривны 45 копеек morpher_spell (123.45 , " KZT " ); // Сто двадцать три казахских тенге 45 тиынов ?>
Обработка ошибок
При возникновении ошибки все функции библиотеки возвращают строку, начинающуюся с "#ERROR: " .
#ERROR: Parameter 1 "text" should not be empty. |
#ERROR: Parameter 2 "case" should not be empty. |
#ERROR: Parameter 1 "text" is not Russian. |
#ERROR: Parameter 2 "case" is invalid. |
#ERROR: Parameter 1 "text" is plural. |
Если вы не хотите, чтобы пользователь увидел эти сообщения, проверяйте на наличие начальной подстроки "#ERROR: " .
Функция morpher_inflect ожидает 2 параметра, а morpher_get_gender - один. При вызове с неправильным количеством параметров интерпретатор PHP выдает предупреждение и продолжает выполнение программы.
Установка модуля на Linux
Для удобства и упрощения процедуры установки в дистрибутив включен набор скриптов, которые автоматизируют установку необходимых для компиляции пакетов, сборку модуля и регистрацию модуля в качестве расширения для PHP. Учитывая большое разнообразие дистрибутивов операционной системы, различные варианты конфигурации и особенности сборки расширений для php, нужно понимать, что в некоторых случаях при установке модуля может возникнуть необходимость в дополнительных действиях, не реализуемых сборочными скриптами.
Для запуска процедуры автоматической установки распакуйте дистрибутив в любой каталог, например, morpher:
# mkdir morpher # cd morpher # tar xf ../morpher.tar # cd phpЗапустите сборочный скрипт командой:
# bash build.shВ случае успеха файл модуля morpher.so будет скомпилирован и перенесен в каталог расширений php. Модуль будет зарегистрирован в конфигурации php, а работоспособность модуля будет проверена автоматически с помощью теста. Текстовый вывод сборочного скрипта должен содержать сообщение об успешном тестировании:
Running tests... ... done.
Ваш модуль готов к использованию. Каталог теперь можно удалить:
# rm -r morpherВ случае наличия проблем со сборкой необходимо убедиться, что в вашей системе установлены и настроены все необходимые пакеты. Для сборки и работы модуля необходимо установить:
Вы можете запустить только сборку модуля без дополнительных действий командой:
# bash compile.shГотовый файл будет в каталоге morpher/php/modules . Его необходимо поместить в каталог расширений PHP, например:
# php-config --extension-dir /usr/lib/php5/20121212 # mv modules/morpher.so /usr/lib/php5/20121212/В вашей системе каталог расширений может быть другой.
# bash setup.shили самостоятельно указать имя расширения в файле php.ini . Проверить работоспособность расширения можно с помощью ручного запуска тестового PHP-скрипта из командной строки:
# php -f test.php Running tests... ... done.Возможные ошибки при сборке и пути их устранения
Ошибка: /usr/bin/ld: cannot find -lm
Причина: у вас не установлен пакет glibc-static .
Ошибка: .../include/php/php_config.h:2526:30: error: call of overloaded ‘isnan(double&)’ is ambiguous. (номер строки может отличаться в вашей версии и конфигурации PHP)
У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта!
API склонения слов, получения рода(мужской, женский), падежа, склонения и других характеристик слова
API склонения слов
Параметры:inflect - слово или список слов через прообел. Следующие параметры доступны, только если передано одно слово.
partofspeech –
Дескриптор | Пример | Описание |
---|---|---|
C | мама | существительное |
П | красный | прилагательное |
КР_ПРИЛ | красива | краткое прилагательное |
ИНФИНИТИВ | идти | инфинитив |
Г | идет | глагол в личной форме |
ДЕЕПРИЧАСТИЕ | идя | деепричастие |
ПРИЧАСТИЕ | идущий | причастие |
КР_ПРИЧАСТИЕ | построена | краткое причастие |
ЧИСЛ | восемь | числительное (количественное) |
ЧИСЛ-П | восьмой | порядковое числительное |
МС | он | местоимение-существительное |
МС-ПРЕДК | нечего | местоимение-предикатив |
МС-П | всякий | местоименное прилагательное |
Н | круто | наречие |
ПРЕДК | интересно | предикатив |
ПРЕДЛ | под | предлог |
СОЮЗ | и | союз |
МЕЖД | ой | междометие |
ЧАСТ | же, бы | частица |
ВВОДН | конечно | вводное слово |
ФРАЗ | бухты-барахты, зги | фразеологизм |
Граммема | Описание | |
---|---|---|
Род | ||
мр | мужской род | |
жр | женский род | |
ср | средний род | |
мр-жр | общий род (сирота, пьяница) | |
Число | ||
ед | единственное число | |
мн | множественное число | |
Падеж | ||
им | именительный | |
рд | родительный | |
дт | дательный | |
вн | винительный | |
тв | творительный | |
пр | предложный | |
зв | звательный (отче, боже) | |
2 | второй родительный или второй предложный падежи | |
Время | ||
нст | настоящее время | |
буд | будущее время | |
прш | прошедшее время | |
Лицо | ||
1л | первое лицо | |
2л | второе лицо | |
3л | третье лицо | |
Одушевленность | ||
од | одушевленное | |
но | неодушевленное | |
Вид | ||
св | совершенный вид | |
нс | несовершенный вид | |
Переходность | ||
нп | переходный | |
пе | непереходный | |
Залог | ||
дст | действительный залог | |
стр | страдательный залог | |
Другое | ||
0 | неизменяемое | |
безл | безличный глагол | |
пвл | повелительное наклонение (императив) | |
притяж | притяжательное (не используется) | |
прев | превосходная степень (для прилагательных) | |
сравн | сравнительная степень (для прилагательных) | |
кач | качественное прилагательное | |
Семантические признаки | ||
имя | имя (Иван, Михаил) | |
фам | фамилия (Иванов, Сидоров) | |
отч | отчество (Иванович, Михайлович) | |
лок | топоним (Москва, Лена, Эверест) | |
аббр | аббревиатура (КПСС, РОНО) | |
орг | организация | |
вопр | вопросительное наречие | |
указат | указательное наречие | |
жарг | жаргонизм | |
разг | разговорный | |
арх | архаизм | |
опч | опечатка | |
поэт | поэтическое | |
проф | профессионализм |
Http://сайт/service/api.php?inflect=магадан&json
{"0":"МАГАДАН","1":"МАГАДАНА","2":"МАГАДАНУ","3":"МАГАДАНОМ","4":"МАГАДАНЕ","5":"МАГАДАНЫ", "6":"МАГАДАНОВ","7":"МАГАДАНАМ","8":"МАГАДАНАМИ","9":"МАГАДАНАХ","limit":38}
Http://сайт/service/api.php?inflect=магадан
Http://сайт/service/api.php?inflect=ростов-на-дону&xml
Чтобы получить от слова «свадебный» все неодушевленные прилагательные в множественном числе вызовите:
Https://сайт/service/api.php?inflect=свадебный&json&partofspeech=П&grammems=НО,МН&info
Получите:
{"0":{"word":"СВАДЕБНЫМ","partofspeech":"П","grammems":["ДТ","КАЧ","МН","НО","ОД"]},
"1":{"word":"СВАДЕБНЫЕ","partofspeech":"П","grammems":["ИМ","КАЧ","МН","НО","ОД"]},
"2":{"word":"СВАДЕБНЫЕ","partofspeech":"П","grammems":["ВН","КАЧ","МН","НО"]},
"3":{"word":"СВАДЕБНЫХ","partofspeech":"П","grammems":["КАЧ","МН","НО","ОД","РД"]},
"4":{"word":"СВАДЕБНЫХ","partofspeech":"П","grammems":["КАЧ","МН","НО","ОД","ПР"]},
"5":{"word":"СВАДЕБНЫМИ","partofspeech":"П","grammems":["КАЧ","МН","НО","ОД","ТВ"]}
,"limit":19}
Без параметра info:
http://сайт/service/api.php?inflect=свадебный&json&partofspeech=П&grammems=НО,МН
{"0":"СВАДЕБНЫМ","1":"СВАДЕБНЫЕ","2":"СВАДЕБНЫЕ","3":"СВАДЕБНЫХ",
"4":"СВАДЕБНЫХ","5":"СВАДЕБНЫМИ","limit":19}
API получения рода слова, имени: мужской, женский
API получения пола: мужской, женский по имени. С помощью данного API по имени пользователя Вы сможете получить его пол. Это исключит необходимость заполнения дополнительного поря при регистрации.
Песочница
мистер Олимпия 16 ноября 2013 в 15:01Склонение ФИО - NameCaseLib PHP Framework
- PHP
Здравствуй, Хабрахабр!
Сегодня я расскажу о небольшом, но очень полезном фреймворке - NameCaseLib.
Я думаю, многие сталкивались с ситуацией, когда было необходимо просклонять Фамилию, Имя и Отчество человека по падежам. Данный фреймворк поможет нам избавиться от многочисленных «велосипедов».
Установка
Для работы NameCaseLib нам понадобится PHP5 и библиотека php_mbstring, для работы с текстом в формате UTF-8.Отлично, теперь осталось подключить сам фреймворк, для этого скачаем необходимые файлы.
NameCaseLib поддерживает два языка: русский и украинский. Файл NCL.NameCase.ru.php содержит русские правила склонения, NCL.NameCase.ua.php, соответственно, украинские. В папке NCL расположено само «ядро» фреймворка, то есть, набор основных функций.
Итак, давайте создадим файл в формате.php, и проверим работоспособность данного фреймворка.
# Указываем кодировку. header("Content-type: text/html; charset=utf-8"); # Подключаем русские правила склонения. require "NCL.NameCase.ru.php"; # Объявляем объект класса. $case = new NCLNameCaseRu(); # Метод q - склоняет Фамилию, Имя и Отчество человека по правилам пола. $array = $case->q("Максимов Александр Васильевич"); # Выводим получившийся массив. (Примечание: возвращает простой индексируемый массив) var_dump($array); ?>
Соответственно, таким же образом, мы можем склонять и украинские ФИО, подключив украинские правила склонения.
Но, давайте все-таки разберем, какие параметры содержит в себе метод q , и как его еще можно использовать?
Данный метод имеет 3 параметра, 2 из них - можно не указывать. Первый параметр - ФИО человека, второй - падеж (Список констант приведу ниже; в случае, если не указан падеж (NULL), то метод возвращает все падежи), и третий - пол человека. (Константы, также, приведены ниже; если не указать пол (NULL), метод определит его сам)
Константы
Для указания пола используются константы:- NCL::$MAN – мужской пол
- NCL::$WOMAN – женский пол
Для указания падежей русского языка:
- NCL::$IMENITLN - именительный падеж
- NCL::$RODITLN - родительный падеж
- NCL::$DATELN - дательный падеж
- NCL::$VINITELN - винительный падеж
- NCL::$TVORITELN - творительный падеж
- NCL::$PREDLOGN - предложный падеж
Для указания падежей украинского языка:
- NCL::$UaNazyvnyi – називний відмінок
- NCL::$UaRodovyi – родовий відмінок
- NCL::$UaDavalnyi – давальний відмінок
- NCL::$UaZnahidnyi – знахідний відмінок
- NCL::$UaOrudnyi – орудний відмінок
- NCL::$UaMiszevyi – місцевий відмінок
- NCL::$UaKlychnyi – кличний відмінок
Примечания
- Порядок расположения ФИО не имеет значения.
- Не имеет значение, в каком регистре указаны ФИО, после склонения, метод возвращает сохраненный регистр букв.
Определение части ФИО
С помощью метода getFullNameFormat, мы можем определить часть, или какие части ФИО мы используем.
# Указываем кодировку. header("Content-type: text/html; charset=utf-8"); # Подключаем русские правила склонения. require "NCL.NameCase.ru.php"; # Объявляем объект класса. $case = new NCLNameCaseRu(); # Метод getFullNameFormat - разбивает строку и возвращает формат, в котором записано имя. $fullName = $case->getFullNameFormat("Максимов Александр Васильевич"); /* Мы получаем формат вида: S F N, где: - S - Фамилия - N - Имя - F - Отчество */ echo $fullName; ?>
Но, что же делать, если все-таки фреймворк не может правильно определить, как склонять выбранное вами ФИО?
Для этого в библиотеке предусмотрен метод qFullName, который позволяет указать Фамилию, Имя, Отчество и пол человека в определенной последовательности.
# Указываем кодировку. header("Content-type: text/html; charset=utf-8"); # Подключаем русские правила склонения. require "NCL.NameCase.ru.php"; # Объявляем объект класса. $case = new NCLNameCaseRu(); # Параметры метода: qFullName(Фамилия, Имя, Отчество, пол, падеж, формат); Все параметры являются необязательными, если, например, не указать пол - система сама определит его. echo $nc->qFullName("Максимов", "Александр", "Васильевич", NCL::$MAN, NCL::$TVORITELN, "S N F")."\n"; ?>
Итоги
NameCaseLib - действительно удобный фреймворк, который включает в себя много полезных функций. На сайте имеется полная документация на русском языке.Весьма популярной проблемой, с которой сталкиваются Web-программисты , это склонение слов на PHP . Например, нужно вывести, сколько минут назад была оставлено какое-нибудь сообщение. Можно написать просто число и слово "минут ". Но тогда будет написано весьма странно, например, "1 минут ", "2 минут " и так далее. Фактически, без склонения слов на PHP Вам не обойтись, если, конечно, Вы хотите писать по-русски.
Проблема новичкам покажется очень сложной, но, на самом деле, у склонения слов есть определённая закономерность. Посмотрите сами: "1 минута, 2 минуты, 5 минут, 11 минут, 19 минут, 21 минута, 22 минуты, 25 минут и так далее ". Видите закономерность? 1, 21, 31, 41 - всегда будет "минута ". Если младший разряд больше 1-го и меньше 5 , при этом само число при делении на 100 имеет остаток больше 20 (то есть, например, не число 12 и не 112 ), то будут "минуты ". В остальных случаях "минут ".
function getWord($number, $suffix) {
$keys = array(2, 0, 1, 1, 1, 2);
$mod = $number % 100;
$suffix_key = ($mod > 7 && $mod < 20) ? 2: $keys;
return $suffix[$suffix_key];
}
$array = array("минута", "минуты", "минут");
$n = 21;
echo "$n $word
";
$n = 11;
$word = getWord($n, $array);
echo "$n $word
";
$n = 4;
$word = getWord($n, $array);
echo "$n $word
";
?>
Запустив данный скрипт Вы увидите, что склонение слов на PHP происходит на ура. Могу лишь добавить, что помимо "минут " там может быть "день ", "час ", "человек ", "компьютер " и все другие существительные, которые склоняются в зависимости от числительного .