Как я могу оптимизировать свой PHP-скрипт, чтобы получить фонетические показания японских предложений от Yahoo!API Японии? - PullRequest
2 голосов
/ 03 мая 2011

Я написал PHP-скрипт, который читает японские предложения из файла, получая фонетическое чтение каждого предложения с помощью Yahoo! Japan API и записывает их в выходной файл. Но сценарий невероятно медленный, он обработал только 50 000 предложений за последние 12 часов на Apache, работающем на моей Mac OS X. Является ли вызов API главным узким местом? Как я могу оптимизировать это? Должен ли я использовать язык, отличный от PHP? Спасибо!

Вот как выглядят первые 4 строки файла input (examples-utf.utf):

A: ムーリエルは20歳になりました。 Muiriel is 20 now.#ID=1282_4707
B: は 二十歳(はたち){20歳} になる[01]{になりました}
A: すぐに戻ります。 I will be back soon.#ID=1284_4709
B: 直ぐに{すぐに} 戻る{戻ります}

Вот XML, возвращенный API в предложении "私 は 学生 で す": http://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=YuLAPtSxg64LZ2dsAQnC334w1wGLxuq9cqp0MIGSO3QjZ1tbZCYaRRWkeRKdUCft7qej73DqEg--&grade=1&sentence=%E7%A7%81%E3%81%AF%E5%AD%A6%E7%94%9F%E3%81%A7%E3%81%99

Мой скрипт выглядит следующим образом:

<?php
    function getReading($wabun)
    {
        $res = "";
        $applicationID = "YuLAPtSxg64LZ2dsAQnC334w1wGLxuq9cqp0MIGSO3QjZ1tbZCYaRRWkeRKdUCft7qej73DqEg--";
        $grade = 1;
        $url = "http://jlp.yahooapis.jp/FuriganaService/V1/furigana?appid=".$applicationID."&grade=".$grade."&sentence=".$wabun;    
        $doc = new DOMDocument();
        $doc->load($url);
        foreach ($doc->getElementsByTagName('Word') as $node) {
            $surface = $node->getElementsByTagName('Surface')->item(0)->nodeValue;
            $furigana = $node->getElementsByTagName('Furigana')->item(0)->nodeValue;
            $reading = (isset($furigana)) ? $furigana : $surface;
            $res .= $reading;
        }
        return $res;
    }
?>
<?php
    header('Content-Type: text/html;charset=utf-8');    
    $myFile = "examples-utf.utf";
    $outFile = "examples-output.utf";
    $file = fopen($myFile, 'r') or die("can't open read file");
    $out = fopen($outFile, 'w') or die("can't open write file");
    $i = 1; // line number
    $start = 3; // beginning of japanese sentence, after "A: "
    while($line = fgets($file))
    {
        // line starts at "A: "
        if($i&1)
        {
            $pos = strpos($line, "\t");
            $japanese = substr($line, $start, $pos - $start);

            $end = strpos($line, "#ID=", $pos + 1);
            $english = substr($line, $pos + 1, $end - $pos - 1);
            $reading = getReading($japanese);

            fwrite($out, $japanese."\n");
            fwrite($out, $english."\n");
            fwrite($out, $reading."\n");

        }
        ++$i;
    }
    fclose($out);
?>

Ответы [ 3 ]

1 голос
/ 03 мая 2011

С того места, где я нахожусь (Берлин / Германия), сайт jlp.yahooapis.jp имеет задержку пинга около 500 мс, поэтому он длится почти 7 часов только на выполнение 50 000 пингов.Не говоря уже об обработке данных на Yahoo-сервере.Так что да, я думаю, что основным узким местом является использование веб-сервиса на другом сервере.

0 голосов
/ 18 февраля 2016

Я не уверен, что послужило причиной этой проблемы, но последняя версия Yahoo!API-интерфейсы довольно плавные (конечная точка: https://jlp.yahooapis.jp/FuriganaService/V1/furigana)

Я разместил похожий вопрос здесь:

Как использовать API обработки японского языка Yahoo! JAPAN

0 голосов
/ 03 мая 2011

Если это пакетный процесс, вы можете попробовать запустить несколько ваших сценариев одновременно в отдельных списках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...