Склонение слов (место события, неодушевленное) (морфология)

В базу из соответствующего поля заносится какое-то место проведения работ, например: склад, подвальное помещение, ресторан, кафе, чердак, поликлиника и т.д.

В документе это место выводится как «... по своевременному проведению работ в склад по адресу:...».

А нужно «... по своевременному проведению работ в складе по адресу:...», «... по своевременному проведению работ в подвальном помещении по адресу:...», «... по своевременному проведению работ в ресторане по адресу:...».

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

function d_typeplace_morf($d_typeplace)
{
    $d_typeplace = mb_strtolower($d_typeplace);
    if ($d_typeplace === 'ресторан') :  echo 'ресторане';
    elseif ($d_typeplace === 'кафе') : echo 'кафе';
    elseif ($d_typeplace === 'столовая') : echo 'столовой';
    elseif ($d_typeplace === 'склад') : echo 'складе';
    else : echo $d_typeplace;
    endif;
}

Буду благодарен любой помощи в этом вопросе.


Ответы (1 шт):

Автор решения: Jigius

Предложу прототип офлайн решения, которое основывается на пакете pymorphy2 для python.

Решение упрощенное, но которое можно развить в рабочее и надежное.

  1. Установить пакет ​pip install pymorphy2
  2. Создать скрипт morph.py и сделать его исполняемым chmod a+x morph.py. Содержимое скрипта:
#!/usr/bin/env python

import pymorphy2
import sys

morph = pymorphy2.MorphAnalyzer()
p = morph.parse(sys.argv[1])[0]
print(p.inflect({'sing', 'loct'})[0])

  1. Создать php-скрипт foo.php и сохранить его в папку с питоновским скриптом. Содержимое скрипта:
<?php
$morph = "python " . __DIR__ . "/morph.py";
$ww = [
    "склад",
    "подвальное помещение",
    "ресторан",
    "кафе",
    "чердак",
    "поликлиника"
];
foreach ($ww as $w) {
    $tt = explode(" ", $w);
    $r = [];
    foreach ($tt as $t) {
        $r[] = rtrim(`$morph $t`);
    }
    echo implode(" ", $r) . "\n";
}
  1. Запустить скрипт: php /path/to/folder/with/foo.php
→ Ссылка