Тут возникает ситуация,у меня получился шаблон,но этот шаблон должен срабатывать перед другим шаблоном чтобы передать эти результаты в массивы.То есть получается кроме самих шаблонов существует их очерёдность(приоритет).Тогда как это оформить? Можно добавить к массиву ещё одно измерение (по аналогии с z-index в css) которое будет устанавливать порядок обработки шаблонов у на уровень ноль поставить шаблон определения дополнения.Вообщем-то таким способом можно решить эту задачу которая меня честно сказать заколебала (а решение то простое и перед носом).Однако в парсер не встроено дополнительное определение шаблонов с помощью свойств слов,а только с помощью «корня»,то есть нужно ещё в описательную часть добавить и массив свойств,кроме этого определять по этому описанию свойство.
Итак ,сам скрипт:
//Первичная переработка//
$g=0;
$r=0;
$prc='';//Число части речи
while (isset($ot[$g])){
include 'text1/chleni.php';//Определение членов предложения
$r=0;
while (isset($tre[$g][$r]))
{
$флаг=false;
$cicl7=0;
$ном_св=0;
/////////////////////Скрипт работа//////////////////////
$корень=$kon[$g][$r];
$чречи=$tre[$g][$r];//
$gh=0;
$io=0;//Счётчик массивов внитри массива связи
//.$чречи
if($шаблон[$корень][$gh])
{
$условия=$шаблон[$корень][$gh];
//Поиск в прямую сторону
for($i=$r;$kon[$g][$i];$i++)
{
for($h=0;$условия[$h];$h++)
{
$v=$условия[$h];
$k=$h;
$flag=true;
//Совпадения по свойствам слов
if($v[kon]){if(strpos(''.$v[kon],''.$kon[$g][$i])===false){$flag=false;}}//Корень
if($v[tre]){if(strpos(''.$v[tre],''.$tre[$g][$i])===false){$flag=false;}}//Часть речи
if($v[pad]){if(strpos(''.$v[pad],''.$pad[$g][$i])===false){$flag=false;}}//Падеж
if($v[chi]){if(strpos(''.$v[chi],''.$chi[$g][$i])===false){$flag=false;}}//Число
if($v[vre]){if(strpos(''.$v[vre],''.$vre[$g][$i])===false){$flag=false;}}//Время
//Совпадение по интервалам
if($v[int1]){if($io>$v[int1]){}else{$flag=false;};}//0
if($v[int2]){if($io<=$v[int2]){}else{$flag=false;};}//3
//Если нужно добавить множественные интервалы можно сделать foreach
//if($i==2 and $h==5){var_dump($flag);echo '|'.$io.'|';}
if($flag===true)
{
//Тут for дополняет счётчик дополняет до следующего не интервального значения
if(!$v['*'])
{
for($z=$io+1;$условия[$z];$z++)
{
if($z==6)
{
echo $условия[$z]['int1'];
}
if(!$условия[$z][int1] and !$условия[$z][int2] and !$условия[$z]['*']){
$io=$z;
break;
};
}
}
//if($i==6 and $h==4){var_dump($flag);}
//5=>2 потому что он должен начинаться с 3 ей
if(!$exit[$k]){
//$exit[$k]=array('p'=>$g,'n'=>$i);
$exit[$k]=$kon[$g][$i];
}
}
}
//if(count($условия)==count($exit))break; тут ещё из условия убрать с *
}
}
if($exit)
{
mysql_query('INSERT INTO esli_to (podl1,skaz1,podl2,skaz2) VALUES ("'.$exit[1].'",»'.$exit[2].'",»'.$exit[4].'",»'.$exit[5].'");');
unset($exit);
}
$r++;
};
$r=0;
//include('text1/otveti.php');#Модуль ответов
//include('text1/prikazi.php');#Модуль приказов
$g++;
};
Ясно к любому упоминанию перменной $шаблон нужно добавить ешё измерение в виде и добавить for с этой перменной.
Но тут опять проблема шаблоны нижнего уровня теоритически могут оказаться дальше шаблонов верхнего уровня,то есть лучше
присоединить это всё к счётчику предложений в виде уровней обработки,однако при этом уже можно избавляться от определения частей предложения (но это лишнее действие).
Но тут конечно потребуется пожертововать оптимизацией,придётся столько раз проходить предложение сколько всего мы возьмём слоёв (пусть это будет пока 5 штук).
Теперь нужно реанимировать из вчерашнего поста шаблон:
«cуществительное в именительном падеже1"
«сказуемое»
«cуществительное в именительном падеже2"
«cуществительное в именительном падеже3"
и исходя из этого можно построить шаблон который вылавливает такую конфигурацию и назначает
«cуществительное в именительном падеже2"-дополнением
Построим его шаблонную переменную:
//////////Шаблоны/////////////////////
//Будем обозначать в ключе в в виде строки массива свойства искомого слова:
//#часть речи|число|падеж|время
$шаблон['#1||14|'][0][0]=array //Шаблонов для одного слова может быть много ,поэтому введён дополнительный массив [0]
(
0=>array(
'tre'=>1,
'pad'=>14,
),
1=>array(
'tre'=>2,
'int1'=>0,
'int2'=>4,
'*'=>'k',
),
2=>array(
'tre'=>1,
'pad'=>14,
'*'=>'k',
),
3=>array(
'tre'=>1,
'pad'=>14,
'*'=>'k',
),
);
тогда для удобства в сам массив добавить действие которое он делает над найденными словами
например присвоение,тогда действие можно записать так,но в данном случае мы уточняем лишь падеж слова
то есть действие можно выразить так:
deistvie=>array(2,'=','pad',4)
Вообщем дальше нужно написать обработчик этих шаблонов.К сожалению я забыл что невозможно в ключах массива нельзя производить внутренний поиск,если только с помощью foreach ,то есть перебором всех шаблонов придётся если хочу реализовать
такой поиск.
Завтра нужно подумать и понять суть что я вообще делаю этими действиями ,что выражают данные шаблоны и продолжить с объединением словесной системы и системы закономерностей и ПсевдоИИ