Re: Библиотека phpMorphy
Добавлено: Ср июн 01, 2016 1:30 pm
Исправлено, теперь $original не содержит морфологических вариантов
Код: Выделить всё
$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>';
Нет не уверен. Более того шаблоны я настроил раньше чем появилась библиотека морфологи в контекстах и больше их не трогал.sergejey писал(а):А вы уверены, что использовали все возможности текущей реализации? Просто, как мне кажется, с помощью контекстов и той же библиотеки морфологии уже можно строить достаточно гибкие шаблоны со свободным порядком слов в предложении, с различными формами слов и т.п.
sergejey писал(а): В вашем примере уже несколько существительных и глаголов, не думаю что, можно сформулировать правило, которое будет в общем случае определять главное действие или главный объект, если он не указан явно.
тоже не гудsergejey писал(а):Если создать контекст "свет", а в нём две команды "включи" и "выключи", то Алиса будет отрабатывать на "выключи пожалуйста свет", "будь добра, свет включи" и т.п. Более того, если указать, чтобы при сработке контекст "свет" не сбрасывался сразу, то можно будет и "а теперь выключи" использовать, т.к. система всё ещё будет находится в контексте. А если сказать фразу "что-то мне свет мешает", то система войдёт в контекст "свет" и, не найдя команды, может переспросить "что мне сделать со светом?". Это, конечно, не смысловой разбор предложения, но некоторая гибкость в использовании.
Как workaround:тоже не гуд
1: у меня жену зовут Света
включи СВЕТ