[Модуль] phpMorphy (morphy)
Модератор: immortal
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Библиотека phpMorphy
Исправлено, теперь $original не содержит морфологических вариантов
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- m-malva
- Сообщения: 291
- Зарегистрирован: Чт фев 26, 2015 1:38 am
- Откуда: Санкт-Петербург
- Благодарил (а): 16 раз
- Поблагодарили: 66 раз
- Контактная информация:
Re: Библиотека phpMorphy
Первое, что хочу сказать, я не программист и не лингвист.
И так (где то я уже это предлагал) но хочу предложить снова.
Что неудобно в шаблонах поведения? Их статичность. При этом в большей степени мы всегда что-то хотим от Алисы прося ее выполнить то, что мы в нее заложили, и не редко натыкаемся на "неизвестная команда" или просто на тишину.
Более того Алисе хочется придать больше человечности и уйти от машинного формализма.
и так у многих шаблоны по типу "действие объект свойство" - включи свет на кухне, сделай радио потише ну и тд.
а как быть если Алисе хочется сказать "прошу тебя выключи пожалуйста телевизор в спальне"?
Вот здесь и может помочь phpMorphy и маломальские знания русского языка.
"действие объект свойство"
ДЕЙСТВИЕ
Глагол в действительном залоге
2 лицо
Повелительное наклонение
ОБЪЕКТ
Существительное
Винительный падеж
неодушевлённое
СВОЙСТВО
Существительное
Предложный падеж
или прилагательное
Это конечно не работает в рамках всех возможных фраз но приказы и задания будут проходить с меньшим количеством ошибок. здесь можно поиграть с разбором
так вот что если мы вместе выделим основные правила формирования команд и оформим в скрипт разбора.
ну а для начала оформить то что есть в нормальный код
И так (где то я уже это предлагал) но хочу предложить снова.
Что неудобно в шаблонах поведения? Их статичность. При этом в большей степени мы всегда что-то хотим от Алисы прося ее выполнить то, что мы в нее заложили, и не редко натыкаемся на "неизвестная команда" или просто на тишину.
Более того Алисе хочется придать больше человечности и уйти от машинного формализма.
и так у многих шаблоны по типу "действие объект свойство" - включи свет на кухне, сделай радио потише ну и тд.
а как быть если Алисе хочется сказать "прошу тебя выключи пожалуйста телевизор в спальне"?
Вот здесь и может помочь phpMorphy и маломальские знания русского языка.
"действие объект свойство"
ДЕЙСТВИЕ
Глагол в действительном залоге
2 лицо
Повелительное наклонение
ОБЪЕКТ
Существительное
Винительный падеж
неодушевлённое
СВОЙСТВО
Существительное
Предложный падеж
или прилагательное
Это конечно не работает в рамках всех возможных фраз но приказы и задания будут проходить с меньшим количеством ошибок. здесь можно поиграть с разбором
СпойлерПоказать
Код: Выделить всё
$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>';
ну а для начала оформить то что есть в нормальный код
- Рейтинг: 1.16%
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Библиотека phpMorphy
А вы уверены, что использовали все возможности текущей реализации? Просто, как мне кажется, с помощью контекстов и той же библиотеки морфологии уже можно строить достаточно гибкие шаблоны со свободным порядком слов в предложении, с различными формами слов и т.п. В вашем примере уже несколько существительных и глаголов, не думаю что, можно сформулировать правило, которое будет в общем случае определять главное действие или главный объект, если он не указан явно.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- m-malva
- Сообщения: 291
- Зарегистрирован: Чт фев 26, 2015 1:38 am
- Откуда: Санкт-Петербург
- Благодарил (а): 16 раз
- Поблагодарили: 66 раз
- Контактная информация:
Re: Библиотека phpMorphy
Нет не уверен. Более того шаблоны я настроил раньше чем появилась библиотека морфологи в контекстах и больше их не трогал.sergejey писал(а):А вы уверены, что использовали все возможности текущей реализации? Просто, как мне кажется, с помощью контекстов и той же библиотеки морфологии уже можно строить достаточно гибкие шаблоны со свободным порядком слов в предложении, с различными формами слов и т.п.
Но то что я читал по диагонали не ложилось сразу на текущую модель которая была настроена у меня года два назад (кровью, потом, страшно было вмешиваться, все и так работало).
sergejey писал(а): В вашем примере уже несколько существительных и глаголов, не думаю что, можно сформулировать правило, которое будет в общем случае определять главное действие или главный объект, если он не указан явно.
можно на конкретном примере?
Я говорил про повелительные команды, за два дня тестирований 80% попаданий
мне кажется это не плохой результат.
Да и здесь я не стал затрагивать сложные вещи такие как словари с весом слов итд.
Данный разбор не перечеркивает все наработки и не претендует быть первоначальным и основным. Я предлагаю производить разбор в случае если строка уже попала в "неизвестная команда", в этом случае попытаться упростить запрос и отправить его на выполнение заново предварительно переспросив.
ведь можно при этом выхватывать междометия, наречия и деепричастия выдавать реакцию на них просто разбавляя речь Алисы человечностью.
ПРИМЕР
ПОЛЬЗОВАТЕЛЬ: Алиса выключи пожалуйста свет
АЛИСА: Вы сегодня очень вежливы
АЛИСА: Пожалуйста
АЛИСА: Выключаю свет
ПОЛЬЗОВАТЕЛЬ: Алиса быстро выключи свет
АЛИСА: Тороплюсь как могу
АЛИСА: Выключаю свет
Вот чего хочется. А не формализма как в ioBroker
более того разобранную фразу сохранять для того чтоб Алиса знала а чем идет речь.
Пример:
ПОЛЬЗОВАТЕЛЬ: Алиса выключи пожалуйста свет
АЛИСА: Вы сегодня очень вежливы
АЛИСА: Пожалуйста
АЛИСА: Выключаю свет
ПОЛЬЗОВАТЕЛЬ: а теперь быстро включи
АЛИСА: Тороплюсь как могу
АЛИСА: Включаю свет
- Рейтинг: 1.16%
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Библиотека phpMorphy
Если создать контекст "свет", а в нём две команды "включи" и "выключи", то Алиса будет отрабатывать на "выключи пожалуйста свет", "будь добра, свет включи" и т.п. Более того, если указать, чтобы при сработке контекст "свет" не сбрасывался сразу, то можно будет и "а теперь выключи" использовать, т.к. система всё ещё будет находится в контексте. А если сказать фразу "что-то мне свет мешает", то система войдёт в контекст "свет" и, не найдя команды, может переспросить "что мне сделать со светом?". Это, конечно, не смысловой разбор предложения, но некоторая гибкость в использовании.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- m-malva
- Сообщения: 291
- Зарегистрирован: Чт фев 26, 2015 1:38 am
- Откуда: Санкт-Петербург
- Благодарил (а): 16 раз
- Поблагодарили: 66 раз
- Контактная информация:
Re: Библиотека phpMorphy
тоже не гудsergejey писал(а):Если создать контекст "свет", а в нём две команды "включи" и "выключи", то Алиса будет отрабатывать на "выключи пожалуйста свет", "будь добра, свет включи" и т.п. Более того, если указать, чтобы при сработке контекст "свет" не сбрасывался сразу, то можно будет и "а теперь выключи" использовать, т.к. система всё ещё будет находится в контексте. А если сказать фразу "что-то мне свет мешает", то система войдёт в контекст "свет" и, не найдя команды, может переспросить "что мне сделать со светом?". Это, конечно, не смысловой разбор предложения, но некоторая гибкость в использовании.
1: у меня жену зовут Света. соответственно действие надо указывать сначала
напиши Свете
найди Свету
включи СВЕТ
2:"система всё ещё будет находится в контексте" как долго??? ведь мы или в контексте и ждем продолжения или "забей" и новая команда. а так получается что ожидаем новую но помним о старой
3: как обрабатывать "будь добра", "быстрее", "пожалуйста" в рамках открытого контекста? на каждый шаблон цеплять обработку "словесного мусора"?
4: сложность отладки текущего механизма
в любом случае с библиотекой морфологии тоже не все так однозначно но буду ковырять
-------------------------------------------------------------------
Разбор строки - прошу тебя радио канал переключи в магнитоле
МНЕ НАДО ПЕРЕКЛЮЧИТЬ
УКАЗАНО ГДЕ - В
Array
(
[0] => РАДИО
)
Array
(
[0] => РАДИО
[1] => МАГНИТОЛЕ
)
УКАЗАНО ЧТО -
Array
(
[0] => РАДИО
[1] => КАНАЛ
)
АЛИСА ПЕРЕКЛЮЧИТЬ КАНАЛ В МАГНИТОЛЕ
будем учить подчинительную связь существительных
-
- Сообщения: 9
- Зарегистрирован: Пн авг 13, 2012 11:06 am
- Благодарил (а): 0
- Поблагодарили: 1 раз
Re: Библиотека phpMorphy
Как workaround:тоже не гуд
1: у меня жену зовут Света
включи СВЕТ
Включи подсветку, освещение, лампу, люстру,
-
- Сообщения: 57
- Зарегистрирован: Ср авг 02, 2017 10:16 pm
- Благодарил (а): 17 раз
- Поблагодарили: 1 раз
Re: Библиотека phpMorphy
Здравствуйте, почему алиска не реагирует на команду "включай свет", я в шаблонах поведения галочку поставил, что я делаю не так?
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Библиотека phpMorphy
Всё так, но библиотека phpMorphy, к сожалению, не совершенна и у неё свои правила формирования списка альтернативных словоформ. Например на "включай" она приводит базовую форму "включать", что не совпадает ни с "включи" ни с "включить". Во многих случаях эта библиотека помогает, но далеко не всегда.
- Рейтинг: 1.16%
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- tarasfrompir
- Сообщения: 3216
- Зарегистрирован: Ср мар 02, 2016 8:18 pm
- Откуда: Украина Пирятин
- Благодарил (а): 223 раза
- Поблагодарили: 816 раз
Re: Библиотека phpMorphy
Добавлен Украинский язык в библиотеку Спасибо что хоть этот реквест принял Сергей
Спасибо нам ПОМОЖЕТ..!