我写了一个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);
?>
答案 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