如何优化我的PHP脚本以获取来自Yahoo!的日语句子的语音读数日本API?

时间:2011-05-02 22:37:59

标签: php api unicode nlp

我写了一个PHP脚本,它从文件中读取日语句子,使用Yahoo!获取每个句子的语音阅读。日本API并将它们写入输出文件。但是脚本非常慢,在我的Mac OS X上运行的Apache上,过去12小时内只处理了50,000个句子。对API的调用是主要的瓶颈吗?我该如何优化它?我应该使用PHP以外的语言吗?谢谢!

以下是输入(examples-utf.utf)文件的前4行的样子:

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

以下是API在“私は学生です”句子中返回的XML: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 个答案:

答案 0 :(得分:1)

从我所在的地方(柏林/德国),网站jlp.yahooapis.jp的ping延迟大约为500毫秒,所以它持续将近7小时才能完成50.000 ping。更不用说Yahoo-Server上的数据处理了。所以是的,我认为主要的瓶颈是在另一台服务器上使用web服务。

答案 1 :(得分:0)

如果这是一个批处理过程,您可以尝试在不同的列表上同时运行多个脚本。

答案 2 :(得分:0)

我不确定这个问题的原因是什么,但最新版本的Yahoo! API非常流畅(端点:https://jlp.yahooapis.jp/FuriganaService/V1/furigana

我在这里发布了一个类似的问题:

How to use the Yahoo! JAPAN Japanese Language Processing API