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

Тема в разделе "PHP", создана пользователем dig555, 10 ноя 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Для заказа одной нужной штуки, необходимо срочно проанализировать большой объём данных, чтобы составить нормальное ТЗ.
    Есть список ключевых слов и словосочетаний. Возьмём произвольное, нетипичное и сложное: "какой иконе молиться чтобы выйти замуж".
    Нужно, изпользуя, морфологический анализатор от Яндекса:
    http://company.yandex.ru/technology/mystem
    вывести на экран
    часть_речи(альтернативная часть_речи) часть_речи часть_речи часть_речи - исходная фраза.
    Если в файле 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...
     
  2. potuga

    potuga

    Регистр.:
    22 сен 2009
    Сообщения:
    376
    Симпатии:
    91
    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]."\"";
    Так пойдет? Если все ок, буду рад сотрудничать ;)
     
    dig555 нравится это.
  3. nuke333

    nuke333 Создатель

    Регистр.:
    8 дек 2008
    Сообщения:
    47
    Симпатии:
    12
    эх, опередил :)

    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 
    " ";

     
    dig555 нравится это.
  4. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Огромное спасибо обоим. Тогда если использовать первый образец, то следующая конструкция, по логике должна обрабатывать целый файл 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");
    }
    ?>
    Т.е. беру первый кей из списка, записываю его во временный файл, получаю результат и удаляю временный файл. Но что-то работать отказывается. В чём может быть проблема?
     
  5. nuke333

    nuke333 Создатель

    Регистр.:
    8 дек 2008
    Сообщения:
    47
    Симпатии:
    12
    вообще должно обрабатывать построчно из файл, пример кинь, чтобы не на голом месте разбираться
     
  6. dig555

    dig555

    Регистр.:
    22 июн 2007
    Сообщения:
    362
    Симпатии:
    148
    Ну вот допустим список из пары десятков кеев:
     

    Вложения:

    • keys.txt
      Размер файла:
      1 КБ
      Просмотров:
      19
  7. nuke333

    nuke333 Создатель

    Регистр.:
    8 дек 2008
    Сообщения:
    47
    Симпатии:
    12
    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 />";
      }
    }
     
    dig555 нравится это.
Статус темы:
Закрыта.