[Модуль] phpMorphy (morphy)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Библиотека phpMorphy

Сообщение sergejey » Ср июн 01, 2016 1:30 pm

Исправлено, теперь $original не содержит морфологических вариантов

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
m-malva
Сообщения: 291
Зарегистрирован: Чт фев 26, 2015 1:38 am
Откуда: Санкт-Петербург
Благодарил (а): 16 раз
Поблагодарили: 66 раз
Контактная информация:

Re: Библиотека phpMorphy

Сообщение m-malva » Ср ноя 02, 2016 5:25 pm

Первое, что хочу сказать, я не программист и не лингвист.
И так (где то я уже это предлагал) но хочу предложить снова.
Что неудобно в шаблонах поведения? Их статичность. При этом в большей степени мы всегда что-то хотим от Алисы прося ее выполнить то, что мы в нее заложили, и не редко натыкаемся на "неизвестная команда" или просто на тишину.
Более того Алисе хочется придать больше человечности и уйти от машинного формализма.

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

"действие объект свойство"

ДЕЙСТВИЕ
Глагол в действительном залоге
2 лицо
Повелительное наклонение

ОБЪЕКТ
Существительное
Винительный падеж
неодушевлённое

СВОЙСТВО
Существительное
Предложный падеж
или прилагательное

Это конечно не работает в рамках всех возможных фраз но приказы и задания будут проходить с меньшим количеством ошибок.
Снимок.PNG
Снимок.PNG (53.84 КБ) 7104 просмотра
здесь можно поиграть с разбором
СпойлерПоказать

Код: Выделить всё

$string= "прошу тебя выключи пожалуйста телевизор в спальне";
echo "<b>Разбор строки - ".$string."</b><br>";
$string = preg_replace('/[^\w\s]/u', ' ', $string);
$string = preg_replace('|[\s]+|s', ' ', $string);

echo "слова - ".$string."<br>";

// массив, в котором будут записаны слова
$array_words = array();

// разбиваем строку
// разделителем выступает пробел, табуляция
// и перенос строки
$tok = strtok($string, " \t\n");

// разбиваем строку, пока не кончится предложение
while($tok) {
$array_words[] = $tok;
$tok = strtok(" \t\n");
}
// вывод результата

$i=0; while ($i < count($array_words))
  {
    $Word=$array_words[$i];
    $i++;

require_once ("lib/phpmorphy/common.php");
 
// задаем настройки для использования модуля
$opts = array(
'storage' => PHPMORPHY_STORAGE_FILE,
'predict_by_suffix' => true,
'predict_by_db' => true,
'graminfo_as_text' => true,
);

// Путь к папке
$dir = 'C:/_majordomo/htdocs/lib/phpmorphy/dicts';
$lang = 'ru_RU';
 
// Создаем экземпляр phpMorphy
try{
$morphy = new phpMorphy($dir, $lang, $opts);
}
catch(phpMorphy_Exception $e){
die('Error occured while creating phpMorphy instance: ' . PHP_EOL . $e);
}

// получаем слово из шаблона
$Word = mb_strtoupper($Word, 'UTF-8');
$base = $morphy->getBaseForm($Word); // возвращает массив значений

if(false === ($paradigms = $morphy->findWord($Word))) {
    die('Can`t find word');
}

foreach($paradigms->getByPartOfSpeech('Г') as $paradigm) {
    $msg=  '<b>Глагол</b> - '. $paradigm->getBaseForm();
     echo $msg."<br>";
     $verb = $paradigm->getBaseForm();    
}
 
foreach($paradigms->getByPartOfSpeech('С') as $paradigm) {
    $msg=  '<b>Существительное</b> - '. $paradigm->getBaseForm();
     echo $msg."<br>";
     $noun = $paradigm->getBaseForm();
}
foreach($paradigms->getByPartOfSpeech('П') as $paradigm) {
    $msg=  '<b>Прилагательное</b> - '. $paradigm->getBaseForm();
     echo $msg."<br>";
     $adjective=$paradigm->getBaseForm();
}
foreach($paradigms->getByPartOfSpeech('МС') as $paradigm) {
    $msg=  '<b>Местоимение</b> - '. $paradigm->getBaseForm();
     echo $msg."<br>";
}
 foreach($paradigms->getByPartOfSpeech('МЕЖД') as $paradigm) {
    $msg=  '<b>Междометие</b> - '. $paradigm->getBaseForm();
     echo $msg."<br>";
}
foreach($paradigms->getByPartOfSpeech('СОЮЗ') as $paradigm) {
    $msg=  '<b>Союз</b> - '. $paradigm->getBaseForm();
     echo $msg."<br>";
}
foreach($paradigms->getByPartOfSpeech('ЧИСЛ') as $paradigm) {
    $msg=  '<b>Числительное</b> - '. $paradigm->getBaseForm();
     echo $msg."<br>";
}
foreach($paradigms->getByPartOfSpeech('ПРЕДЛ') as $paradigm) {
    $msg=  '<b>Предлог</b> - '. $paradigm->getBaseForm();
     echo $msg."<br>";
     $prepositions=$paradigm->getBaseForm();
}


 // обрабатываем омонимы
    echo '<b>Лемма -</b> ', $paradigm->getBaseForm(), PHP_EOL."<br>";
//    echo 'Все формы - ', implode(',', $paradigm->getAllForms()), PHP_EOL."<br>";
 
    // информация о искомом слове т.к. в парадигме словоформы могут повторятся $found_word - массив
    $found_word_ary = $paradigm->getFoundWordForm();
 
    foreach($found_word_ary as $found_form) {
         //граммемы
        echo "Морфологическая информация - ".$found_form->getWord(), ' - ', $found_form->getPartOfSpeech(), ' ', implode(',', $found_form->getGrammems()) . PHP_EOL."<br>";
    }
     //Глаголы
     if($paradigms->getByPartOfSpeech('Г')) {
    if ($found_form->hasGrammems('1Л')){
         echo "<b>1 лицо</b><br>";
    }
    if ($found_form->hasGrammems('2Л')){
         echo "<b>2 лицо</b><br>";
    }
    if ($found_form->hasGrammems('3Л')){
         echo "<b>3 лицо</b><br>";
    }
    }
    //Существительное
     if($paradigms->getByPartOfSpeech('С')) {
    if ($found_form->hasGrammems('ПР')){
         echo "<b>Предложный падеж </b><br>";
        $noun1=$found_form->getWord();
    }
    if ($found_form->hasGrammems('РД')){
         echo "<b>Родительный падеж </b><br>";
        $noun1=$found_form->getWord();
    }
    if ($found_form->hasGrammems('ДТ')){
         echo "<b>Дательный падеж </b><br>";
        $noun1=$found_form->getWord();
    }
    if ($found_form->hasGrammems('ИМ')){
         echo "<b>Иминительный падеж </b><br>";
        $noun1=$found_form->getWord();
    }
    }
     if($paradigms->getByPartOfSpeech('С')) {
        if ($found_form->hasGrammems(array('НО', 'ВН'))){
             echo "<b>Винительный падеж неодушевлённое</b>";
            $question="ЧТО";
           $noun2=$found_form->getWord();        
        }
        if ($found_form->hasGrammems(array('ОД', 'ВН'))){
            echo "<b>>Винительный падеж одушевлённое\n </b><br>";
             $question="КОГО";
           $noun2=$found_form->getWord();        
        }
    }

      if($paradigms->getByPartOfSpeech('Г','ДСТ')) {
     echo "<b>Глагол в действительном залоге </b><br>";
        if ($found_form->getPartOfSpeech('ПВ')){
             echo "<b>Повелительное наклонение </b><br>";
         $verb = $paradigm->getBaseForm();    
        }
    } 
 
    echo "---------<br>";
} 


echo "<br>МНЕ НАДО ".$verb."<br>";
 
if($prepositions=="НА"){
     echo "УКАЗАНО ГДЕ - НА ".$noun1;
     $noun1 = "НА ".$noun1; 
}else if($prepositions=="В"){
      echo "УКАЗАНО ГДЕ - В ".$noun1;
     $noun1 = "В ".$noun1;
}
echo "<br> УКАЗАНО ".$question." - ".$noun2."<br>";
echo "<b>АЛИСА ".$verb.' '.$noun2.' '.$noun1.' '.$adjective.'</b>';
так вот что если мы вместе выделим основные правила формирования команд и оформим в скрипт разбора.
ну а для начала оформить то что есть в нормальный код
За это сообщение автора m-malva поблагодарил:
lanket (Ср ноя 02, 2016 5:44 pm)
Рейтинг: 1.16%
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Библиотека phpMorphy

Сообщение sergejey » Ср ноя 02, 2016 7:57 pm

А вы уверены, что использовали все возможности текущей реализации? Просто, как мне кажется, с помощью контекстов и той же библиотеки морфологии уже можно строить достаточно гибкие шаблоны со свободным порядком слов в предложении, с различными формами слов и т.п. В вашем примере уже несколько существительных и глаголов, не думаю что, можно сформулировать правило, которое будет в общем случае определять главное действие или главный объект, если он не указан явно.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
m-malva
Сообщения: 291
Зарегистрирован: Чт фев 26, 2015 1:38 am
Откуда: Санкт-Петербург
Благодарил (а): 16 раз
Поблагодарили: 66 раз
Контактная информация:

Re: Библиотека phpMorphy

Сообщение m-malva » Чт ноя 03, 2016 12:15 am

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

можно на конкретном примере?
Я говорил про повелительные команды, за два дня тестирований 80% попаданий
мне кажется это не плохой результат.
Да и здесь я не стал затрагивать сложные вещи такие как словари с весом слов итд.


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

ПРИМЕР
ПОЛЬЗОВАТЕЛЬ: Алиса выключи пожалуйста свет
АЛИСА: Вы сегодня очень вежливы
АЛИСА: Пожалуйста
АЛИСА: Выключаю свет

ПОЛЬЗОВАТЕЛЬ: Алиса быстро выключи свет
АЛИСА: Тороплюсь как могу
АЛИСА: Выключаю свет

Вот чего хочется. А не формализма как в ioBroker

более того разобранную фразу сохранять для того чтоб Алиса знала а чем идет речь.

Пример:
ПОЛЬЗОВАТЕЛЬ: Алиса выключи пожалуйста свет
АЛИСА: Вы сегодня очень вежливы
АЛИСА: Пожалуйста
АЛИСА: Выключаю свет
ПОЛЬЗОВАТЕЛЬ: а теперь быстро включи
АЛИСА: Тороплюсь как могу
АЛИСА: Включаю свет
За это сообщение автора m-malva поблагодарил:
lanket (Чт ноя 03, 2016 9:02 am)
Рейтинг: 1.16%
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Библиотека phpMorphy

Сообщение sergejey » Чт ноя 03, 2016 12:27 pm

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

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
m-malva
Сообщения: 291
Зарегистрирован: Чт фев 26, 2015 1:38 am
Откуда: Санкт-Петербург
Благодарил (а): 16 раз
Поблагодарили: 66 раз
Контактная информация:

Re: Библиотека phpMorphy

Сообщение m-malva » Чт ноя 03, 2016 2:59 pm

sergejey писал(а):Если создать контекст "свет", а в нём две команды "включи" и "выключи", то Алиса будет отрабатывать на "выключи пожалуйста свет", "будь добра, свет включи" и т.п. Более того, если указать, чтобы при сработке контекст "свет" не сбрасывался сразу, то можно будет и "а теперь выключи" использовать, т.к. система всё ещё будет находится в контексте. А если сказать фразу "что-то мне свет мешает", то система войдёт в контекст "свет" и, не найдя команды, может переспросить "что мне сделать со светом?". Это, конечно, не смысловой разбор предложения, но некоторая гибкость в использовании.
тоже не гуд
1: у меня жену зовут Света. соответственно действие надо указывать сначала
напиши Свете
найди Свету
включи СВЕТ
2:"система всё ещё будет находится в контексте" как долго??? ведь мы или в контексте и ждем продолжения или "забей" и новая команда. а так получается что ожидаем новую но помним о старой
3: как обрабатывать "будь добра", "быстрее", "пожалуйста" в рамках открытого контекста? на каждый шаблон цеплять обработку "словесного мусора"?
4: сложность отладки текущего механизма

в любом случае с библиотекой морфологии тоже не все так однозначно но буду ковырять
-------------------------------------------------------------------
Разбор строки - прошу тебя радио канал переключи в магнитоле

МНЕ НАДО ПЕРЕКЛЮЧИТЬ
УКАЗАНО ГДЕ - В

Array
(
[0] => РАДИО
)
Array
(
[0] => РАДИО
[1] => МАГНИТОЛЕ
)

УКАЗАНО ЧТО -

Array
(
[0] => РАДИО
[1] => КАНАЛ
)
АЛИСА ПЕРЕКЛЮЧИТЬ КАНАЛ В МАГНИТОЛЕ


будем учить подчинительную связь существительных
Bluefox
Сообщения: 9
Зарегистрирован: Пн авг 13, 2012 11:06 am
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Библиотека phpMorphy

Сообщение Bluefox » Сб ноя 05, 2016 1:48 pm

тоже не гуд
1: у меня жену зовут Света
включи СВЕТ
Как workaround:
Включи подсветку, освещение, лампу, люстру, :)
Sasha95
Сообщения: 57
Зарегистрирован: Ср авг 02, 2017 10:16 pm
Благодарил (а): 17 раз
Поблагодарили: 1 раз

Re: Библиотека phpMorphy

Сообщение Sasha95 » Чт авг 17, 2017 2:06 am

Здравствуйте, почему алиска не реагирует на команду "включай свет", я в шаблонах поведения галочку поставил, что я делаю не так?
Изображение
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Библиотека phpMorphy

Сообщение sergejey » Пн авг 21, 2017 3:57 pm

Всё так, но библиотека phpMorphy, к сожалению, не совершенна и у неё свои правила формирования списка альтернативных словоформ. Например на "включай" она приводит базовую форму "включать", что не совпадает ни с "включи" ни с "включить". Во многих случаях эта библиотека помогает, но далеко не всегда.
За это сообщение автора sergejey поблагодарил:
Sasha95 (Ср сен 06, 2017 9:49 pm)
Рейтинг: 1.16%

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 815 раз

Re: Библиотека phpMorphy

Сообщение tarasfrompir » Чт май 24, 2018 4:19 pm

Добавлен Украинский язык в библиотеку Спасибо что хоть этот реквест принял Сергей
Спасибо нам ПОМОЖЕТ..!
Ответить