Я написал 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);
?>