- 締切済み
YAHOOのAPIの形態素解析機をCGIのフォームから扱いたいと思って
YAHOOのAPIの形態素解析機をCGIのフォームから扱いたいと思っています。 IDは取得済みです。 自分のページにフォームを置いて、そこに文章を入力すると、そのCGI窓の下に解析結果を出すようにしたいです。言語はPerlです。 どなたか教えていただけますでしょうか。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kuzumiHK
- ベストアンサー率72% (132/183)
test.phpで不備がありましたので追記になります。。 <?php $appid = "<ここにAPIのIDが入ります>"; mb_http_output('UTF-8'); mb_internal_encoding('UTF-8'); header('Content-Type: text/xml;charset=UTF-8'); $url ='http://jlp.yahooapis.jp/MAService/V1/parse?'; $url.='sentence=' .urlencode(mb_convert_encoding($_GET['q'],'UTF-8','auto')) .'&appid=' . $appid; print(file_get_contents($url)); ?>
- kuzumiHK
- ベストアンサー率72% (132/183)
つづき、 ▼test.js function connect(){ xmlHttpObj = null; // Firefox用 if (window.XMLHttpRequest){ xmlHttpObj = new XMLHttpRequest(); }else if (window.ActiveXObject){ // IE6用 try{ xmlHttpObj = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ // IE5用 try { xmlHttpObj = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ return null; } } } if (xmlHttpObj) xmlHttpObj.onreadystatechange = getXML; // 送信 if (xmlHttpObj){ xmlHttpObj.open("GET","test.php?q=" + encodeURI(document.getElementById("query").value), true); xmlHttpObj.send(null); } } function getXML(){ var xmlData = null; // XML解析 if ((xmlHttpObj.readyState == 4) && (xmlHttpObj.status == 200)){ xmlData = xmlHttpObj.responseXML; var items = xmlData.getElementsByTagName("word_list"); var html = "<ol>"; var words = xmlData.getElementsByTagName("word"); var max = words.length; for(var i = 0; i < max; i++){ var surface = words[i].getElementsByTagName("surface")[0].childNodes[0].nodeValue; surface = "<dt>表記</dt><dd>" + surface + "</dd>"; var reading = words[i].getElementsByTagName("reading")[0].childNodes[0].nodeValue; reading = "<dt>読み</dt><dd>" + reading + "</dd>"; var pos = words[i].getElementsByTagName("pos")[0].childNodes[0].nodeValue; pos = "<dt>品詞</dt><dd>" + pos + "</dd>"; html = html + "<li><dl>" + surface + reading + pos + "</dl></li>"; } html = html + "</ol>"; document.getElementById("words").innerHTML = html; } return 1; } 以上になります。 キー入力のたびに更新されるようにonkeyupにしていますが、 コメントアウトにonclickを用意していますので、 負荷やリクエストオーバーが恐いようでしたら、onclickをおすすめします。
- kuzumiHK
- ベストアンサー率72% (132/183)
>自分のページにフォームを置いて、そこに文章を入力すると、そのCGI窓の下に解析結果を出すようにしたいです。 リアルタイムで反映したい場合、perlだけでは無理でAjaxにする必要がありそうです。 perlはベタ書きでないかぎり、XMLの読み取りにperlモジュールが必要だったり、 いろいろと面倒なことがありそうですので、 今回はjavascriptとphpを組み合わせたAjaxで考えてみました。 (もし、ベタ書きでよくて、perlでformを表示、サブミットボタンを押したら結果が表示されるだけなら、もっと簡単です) データが長いので、2回に分けてアップさせていただきますね。 APIとの相性や今後の流れを考えて、htmlもjsもUTF-8です。 ※Shift-JISで作りたいときは、php内で文字コードを変換するなどの処理が追加で必要になりそうです(未調査)。 ▼test.html(perlで吐き出したhtml?) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無題</title> <style type="text/css"> <!-- ol *{ border:1px solid #f00; } //--> </style> </head> <body> <form> <textarea rows="3" name="query" id="query" onkeyup="connect();return false;"></textarea> <!-- onkeyupではキーを押すたびにAPIをリクエストしてしまうため負荷が高いonclickなら1クリック1リクエスト <input type="text" size="40" name="query" id="query" value="" /> <input type="button" value="解析" onclick="connect();return false;"> --> </form> <div id="words"></div> <script type="text/javascript" src="test.js"></script> </body> </html> ▼test.php <?php $appid = "<ここにAPIのIDが入ります>"; mb_http_output('UTF-8'); mb_internal_encoding('UTF-8'); header('Content-Type: text/xml;charset=UTF-8'); $url ='http://jlp.yahooapis.jp/MAService/V1/parse?'; $url.='sentence=' .urlencode(mb_convert_encoding($_GET['q'],'UTF-8','auto')) .'&'.'appid=$appid'; print(file_get_contents($url)); ?> 2ページ目につづく
補足
返答が遅くなり申し訳ございません。 とても丁寧なご説明ありがとうございました。 私自身がPHPを理解していないのと、サーバがPHPを使えない関係上、PERLのみ使用しています。 >(もし、ベタ書きでよくて、perlでformを表示、サブミットボタンを押したら結果が表示されるだけなら、もっと簡単です) 構いません。 私の場合、PERLのフォームの入力がしっかりヤフーAPIにつながるというところが目下の課題になっています。