[СРОЧНО!] Получить инфу в нужном виде

Статус
В этой теме нельзя размещать новые ответы.

dig555

Постоялец
Регистрация
22 Июн 2007
Сообщения
365
Реакции
160
Для заказа одной нужной штуки, необходимо срочно проанализировать большой объём данных, чтобы составить нормальное ТЗ.
Есть список ключевых слов и словосочетаний. Возьмём произвольное, нетипичное и сложное: "какой иконе молиться чтобы выйти замуж".
Нужно, изпользуя, морфологический анализатор от Яндекса:
Для просмотра ссылки Войди или Зарегистрируйся
вывести на экран
часть_речи(альтернативная часть_речи) часть_речи часть_речи часть_речи - исходная фраза.
Если в файле 0.txt записана фраза:
"какой иконе молиться чтобы выйти замуж", то следующий код:
PHP:
<?
exec("mystem.exe -irg 0.txt",$out);
preg_match_all('|{(.*)}|Uis',$out[0],$real);
for($i=0; $i<count($real[1]); $i++){
$str=trim($real[1][$i]);
echo $str."<br />";
}
?>
Выведет:
Код:
какой=APRO=(им,ед,муж|род,ед,жен|дат,ед,жен|вин,ед,муж,неод|твор,ед,жен|пр,ед,жен)
икона=S,жен,неод=(дат,ед|пр,ед)
молить=V,несов=инф,страд|молиться=V,несов=инф
чтобы=PART=|чтобы=CONJ=
выходить=V=инф,сов
замуж=ADV=
Где латинским обозначение из первого массива, соответствует русские из второго:
PHP:
$eng=array("A","ADV","CONJ","INTJ","NUM","PART","PR","S","V","ANUM","APRO","ADVPO","SPRO");
$rus=array("прилагательное","наречие","союз","междометие","числительное","частица","предлог","существительное","глагол","порядковое числительное","местоименное прилагательное","местоименное наречие","местоименное существительное");
Фактически задача - привести выдаваемый результат к виду:
Код:
APRO S V PART(CONJ) V ADV (какой иконе молиться чтобы выйти замуж)
Латинские обозначения на русские заменить можно тупо, через str_replace...
 
PHP:
<?
$file = file("0.txt");

$eng=array("APRO","ADVPO","ADV","SPRO","S","CONJ","INTJ","PART","PR","V","ANUM","NUM","A");
$rus=array("местоименное прилагательное","местоименное наречие","наречие","местоименное существительное","существительное","союз","междометие","частица","предлог","глагол","порядковое числительное","числительное","прилагательное");

exec("mystem.exe -irg 0.txt",$out);
preg_match_all('|{(.*)}|Uis',$out[0],$real);

for($i=0; $i<count($real[1]); $i++){
	$str=trim($real[1][$i]);
#	preg_match("|.*?=(.*?)[,=][^a-z]*([a-z]*)[,=]{0,1}|i",$str,$out2);
#	echo str_replace($eng,$rus,$out2[1]).(($out2[1]==$out2[2] || $out2[2]=="")?" ":("(".str_replace($eng,$rus,$out2[2]).") "));
	preg_match_all("|=([a-z]+)[,=]|i",$str,$out);
	$uniq = array_unique($out[1]);
	echo str_replace($eng,$rus,$uniq[0])." ";
	if(count($uniq)>1) {
		$str = "(";
		for($j=1; $j<count($uniq); ++$j)
			$str .= str_replace($eng,$rus,$uniq[$j]).";";
		$str = trim($str,";");
		echo $str.") ";
	}
		
}
echo "- \"".$file[0]."\"";

Так пойдет? Если все ок, буду рад сотрудничать ;)
 
эх, опередил :)

PHP:
<?

$eng=array("APRO","ADVPO","ADV","SPRO","S","CONJ","INTJ","PART","PR","V","ANUM","NUM","A");
$rus=array("местоименное прилагательное","местоименное наречие","наречие","местоименное существительное","существительное","союз","междометие","частица","предлог","глагол","порядковое числительное","числительное","прилагательное");
$eng2rus = array_combine($eng, $rus);


exec("mystem.exe -irg 0.txt",$out);
preg_match_all('|{(.*)}|Uis',$out[0],$real);
for($i=0; $i<count($real[1]); $i++){
  $str=trim($real[1][$i]);
  
  preg_match_all('|=(?P<word>[A-Z]+)|', $str, $matches,  PREG_PATTERN_ORDER);
  $words = array_unique($matches['word']);

  if(count($words)>0) {
    echo strtr(array_shift($words), $eng2rus);
  }
  if(count($words)>0) {
    echo strtr('('.implode(',',$words).')', $eng2rus);
  }
  echo " ";
}
 
Огромное спасибо обоим. Тогда если использовать первый образец, то следующая конструкция, по логике должна обрабатывать целый файл keys.txt с кеями по одному на строку:
PHP:
<?
set_time_limit(0);
$keystxt="keys.txt";
$keys=file($keystxt);
$eng=array("APRO","ADVPO","ADV","SPRO","S","CONJ","INTJ","PART","PR","V","ANUM","NUM","A");
$rus=array("местоименное прилагательное","местоименное наречие","наречие","местоименное существительное","существительное","союз","междометие","частица","предлог","глагол","порядковое числительное","числительное","прилагательное");
foreach ($keys as $key){
$fp=fopen("0.txt","a+");
fwrite($fp,$key);
fclose($fp);
$file = file("0.txt");
exec("mystem.exe -irg 0.txt",$out);
preg_match_all('|{(.*)}|Uis',$out[0],$real);
$x=0;
for($i=0; $i<count($real[1]); $i++){
    $str=trim($real[1][$i]);
#    preg_match("|.*?=(.*?)[,=][^a-z]*([a-z]*)[,=]{0,1}|i",$str,$out2);
#    echo str_replace($eng,$rus,$out2[1]).(($out2[1]==$out2[2] || $out2[2]=="")?" ":("(".str_replace($eng,$rus,$out2[2]).") "));
    preg_match_all("|=([a-z]+)[,=]|i",$str,$out);
    $uniq = array_unique($out[1]);
    echo str_replace($eng,$rus,$uniq[0])." ";
    if(count($uniq)>1) {
        $str = "(";
        for($j=1; $j<count($uniq); ++$j)
            $str .= str_replace($eng,$rus,$uniq[$j]).";";
        $str = trim($str,";");
        echo $str.") ";
    }
}
echo "- \"".$file[0]."\"";
unlink("0.txt");
}
?>
Т.е. беру первый кей из списка, записываю его во временный файл, получаю результат и удаляю временный файл. Но что-то работать отказывается. В чём может быть проблема?
 
вообще должно обрабатывать построчно из файл, пример кинь, чтобы не на голом месте разбираться
 
Ну вот допустим список из пары десятков кеев:
 

Вложения

  • keys.txt
    1 KB · Просмотры: 20
Ну вот допустим список из пары десятков кеев:
PHP:
<?
$input_file = 'keys.txt';
$eng=array("APRO","ADVPO","ADV","SPRO","S","CONJ","INTJ","PART","PR","V","ANUM","NUM","A");
$rus=array("местоименное прилагательное","местоименное наречие","наречие","местоименное существительное","существительное","союз","междометие","частица","предлог","глагол","порядковое числительное","числительное","прилагательное");
$eng2rus = array_combine($eng, $rus);
$file = file($input_file);
$k = 0;
exec("mystem.exe -irgnc ".$input_file, $out);
foreach($out as $line) {
  preg_match_all('|{(.*)}|Uis',$line,$real);
  for($i=0; $i<count($real[1]); $i++){
    $str=trim($real[1][$i]);
    preg_match_all('|=(?P<word>[A-Z]+)|', $str, $matches,  PREG_PATTERN_ORDER);
    $words = array_unique($matches['word']);
    if(count($words)>0) {
      echo strtr(array_shift($words), $eng2rus);
    }
    if(count($words)>0) {
      echo strtr('('.implode(',',$words).')', $eng2rus);
    }
    echo " ";
  } 
  if(strpos($line, '\n')) {
    echo ' - '.strtr($file[$k++], array("\n" =>'',"\r" => ''));
    echo "<br />";
  }
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху