「Google 日本語入力 CGI API」があるなんて…!
Google CGI API for Japanese Input、Google 日本語入力 CGI API というモノを見つけた。
IME ソフトの「Google 日本語入力」(オープンソース版でいう Mozc) が行う漢字変換を API として利用できるらしい。すげぇ。
以下のように text
クエリ文字列に、変換したい文章を渡す。漢字や英数字なんかが混じっていても動作する。
$ curl -sS 'http://www.google.com/transliterate?langpair=ja-Hira|ja&text=たまにいくならこんなだがしやさん' | jq
[
[
"たまに",
[
"たまに",
"玉に",
"珠に",
"球に",
"多摩に"
]
],
[
"いくなら",
[
"行くなら",
"いくなら",
"逝くなら",
"育なら",
"往くなら"
]
],
[
"こんな",
[
"こんな",
"コンナ",
"コンな",
"婚な",
"紺な"
]
],
[
"だがしやさん",
[
"駄菓子屋さん",
"だがしやさん",
"ダガシヤサン",
"ダガシヤサン"
]
]
]
結果はこんな感じでトップレベルが配列だが JSON として機能している。文節で自動的に区切って、その文節ごとに変換候補を配列でいくつか提供してくれる。
API Key なども必要なく使える API なので、コレを使えば「文章を分節で区切る」とか「ひらがな → 漢字変換」だとかいう機能をコイツだけで実現できる。
- 文章を文節で区切って取得する
$ curl -sS 'http://www.google.com/transliterate?langpair=ja-Hira|ja&text=たまにいくならこんなだがしやさん' | jq -r '.[][0]'
たまに
いくなら
こんな
だがしやさん
- 変換の第1候補を利用してひらがなを漢字に変換する
$ curl -sS 'http://www.google.com/transliterate?langpair=ja-Hira|ja&text=たまにいくならこんなだがしやさん' | jq -j '.[][1][0]|tostring'
たまに行くならこんな駄菓子屋さん
カンマ ,
を使うと強制的に分節を区切ったりできるので、それなりに精度の高い変換ができるだろう。
Node.js で叩くならこんな感じのコードで行ける。慣れている言語で API を叩いてみて、同じことができるコードを別の言語で書いてみることで、プログラミング言語学習にもなりそうだ。
const http = require('http');
const https = require('https');
/**
* Request
*
* @param {string} url URL
* @return {Promise<string>} Response
*/
const request = url => new Promise((resolve, reject) => {
const req = (url.startsWith('https:') ? https : http).request(url, {}, res => {
res.setEncoding('utf8');
let data = '';
res.on('data', chunk => { data += chunk; })
.on('end' , () => { resolve(data); });
}).on('error' , error => { reject(error); })
.on('timeout', () => { req.destroy(); reject('Request Timeout'); })
.setTimeout(10000)
.end();
});
(async () => {
try {
const text = process.argv.slice(2).join(' ').trim();
if(text === '') return console.warn('Please Input Text');
// [Google 日本語入力 - CGI API デベロッパーガイド](https://www.google.co.jp/ime/cgiapi.html)
const url = `http://www.google.com/transliterate?langpair=ja-Hira|ja&text=${text}`;
const response = await request(url);
const json = JSON.parse(response);
if(!Array.isArray(json)) {
console.warn('Invalid Response', { response, json });
throw new Error('Invalid Response');
}
const converted = json.map(item => {
if(!Array.isArray(item) || item.length !== 2) {
console.warn('Invalid Response Item', { response, json });
throw new Error('Invalid Response Item');
}
const candidates = item[1];
if(!Array.isArray(candidates) || candidates.length === 0) {
console.warn('Invalid Response Candidates', { response, json });
throw new Error('Invalid Response Candidates');
}
return candidates[0]; // 第1候補を使用する
}).join('');
console.log(converted);
}
catch(error) {
console.error('Error :', error);
}
})();
API Key が要らない Web API、気軽で最高。