Yahoo! 日本語入力 API を使う

少し前の話ですが、Yahoo! の日本語入力 API が公開されました。 以前から gawk の TCP 通信を使って試していたのですが、どうもうまく動作しません。

そこで localhost に Squid を起動して Proxy を介してアクセスすることにします。 コードは以下のとおりです。

#! /usr/bin/gawk -f
# yahoo_jimservice.awk

BEGIN {
    ORS = RS = "\r\n";

    base_url = "jlp.yahooapis.jp";
    url      = "JIMService/V1/conversion";

    param["appid"] = "YahooDemo";
    param["sentence"] = ARGV[1] ? ARGV[1] : "きょうはよいてんきです。";

    # Proxy を介さないとうまく動作しないのは何故?
    http_url = "/inet/tcp/0/localhost/8080";
    str = sprintf("GET http://%s/%s?", base_url, url);

    for (a in param) {
        str = str sprintf("%s=%s&", a, param[a]);
    }
    sub(/\%PAGE_BODY%amp;$/, "", str);

    print str " HTTP/1.0" |& http_url;
    print "" |& http_url;
    while ((http_url |& getline) > 0) {
        print $0;
    }
    close(http_url);
}

もともと gawk の TCP または UDP の通信は Proxy を介するように書かれているのですが、gawk 単独でアクセスするわけではないので、利便性が悪くなります。

実際に実行してみましょう。 第一引数に日本語を入力しても動作します。

$ gawk -f yahoo_jimservice.awk
HTTP/1.0 200 OK
Date: Thu, 31 Jul 2008 15:23:10 GMT
P3P: policyref="http://privacy.yahoo.co.jp/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Content-Type: text/xml; charset="UTF-8"
X-Cache: MISS from fedorasrv.com
X-Cache-Lookup: MISS from fedorasrv.com:8080
Via: 1.0 fedorasrv.com (squid/3.0.STABLE7)
Proxy-Connection: close
<?xml version="1.0" encoding="UTF-8"?> <ResultSet xmlns="urn:yahoo:jp:jlp:JIMService" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:yahoo:jp:jlp:JIMService http://jlp.yahooapis.jp/JIMService/V1/conversion.xsd">
  <Result>
    <SegmentList>
      <Segment>
        <SegmentText>きょうは</SegmentText>
        <CandidateList>
          <Candidate>今日は</Candidate>
          <Candidate>きょうは</Candidate>
          <Candidate>教派</Candidate>
          <Candidate>興は</Candidate>
          <Candidate>京は</Candidate>
          <Candidate>強は</Candidate>
          <Candidate>経は</Candidate>
          <Candidate>教は</Candidate>
          <Candidate>境は</Candidate>
          <Candidate>凶は</Candidate>
          <Candidate>卿は</Candidate>
          <Candidate>峡は</Candidate>
          <Candidate>協は</Candidate>
          <Candidate>香は</Candidate>
          <Candidate>恭は</Candidate>
          <Candidate>享は</Candidate>
        </CandidateList>
      </Segment>
      <Segment>
        <SegmentText>よい</SegmentText>
        <CandidateList>
          <Candidate>よい</Candidate>
          <Candidate>良い</Candidate>
          <Candidate>宵</Candidate>
          <Candidate>酔い</Candidate>
          <Candidate>四位</Candidate>
          <Candidate>4位</Candidate>
          <Candidate>余威</Candidate>
          <Candidate>好い</Candidate>
          <Candidate>善い</Candidate>
          <Candidate>佳い</Candidate>
          <Candidate>吉い</Candidate>
          <Candidate>快い</Candidate>
        </CandidateList>
      </Segment>
      <Segment>
        <SegmentText>てんきです。</SegmentText>
        <CandidateList>
          <Candidate>天気です。</Candidate>
          <Candidate>転機です。</Candidate>
          <Candidate>転記です。</Candidate>
          <Candidate>転帰です。</Candidate>
          <Candidate>天機です。</Candidate>
          <Candidate>てんきです。</Candidate>
        </CandidateList>
      </Segment>
    </SegmentList>
  </Result>
</ResultSet>

このように XML 形式で取得することができます。

さて、どのように応用するか難しいところですが、awk を使った IME を作る元気はないので、ここまでにしておきます。 面白い応用事例があれば教えてください。

tag_gawk.pngtag_gawk.png