海外のOSSを自社や日本の制度に合わせるとき、いちばん大事なのはどこを直さないかを決めることだと思っています。今回はそれがはっきり出た仕事でした。
英国には TheyWorkForYou という国会議事録サイトが20年あります。郵便番号を入れると自分の議員が出て、その人が国会で何と言ったかを言葉から引ける。mySociety というNPOが作っていて、中身はオープンソース(BSD 3条項)です。
これを日本の国会で動かしました。触れるものがあります。
- デモ: 国会の答弁を、言葉で検索する
- 詳しい手順と5か所の修正: note の記事
最初に決めたこと:上流のコードには触らない
取り込みの本体は1,904行のPerlスクリプト(xml2db.pl)です。議事録XMLを読んでデータベースへ入れる、この製品の心臓部にあたります。
ここを日本語対応に書き換える道もありました。選びませんでした。書き換えると本家の更新を追えなくなるからです。20年動いているコードの改良を、以後ずっと自分で取り込み直すことになります。
代わりに、国会会議録APIの出力をTheyWorkForYou が読む形式のXMLに変換するところで受けました。
speechRecord→speech要素speaker→speakername属性nameOfMeeting→major-heading要素speakerGroup→ 会派
国会会議録検索システムのAPI(国立国会図書館)は、発言を1件ずつ、発言者・会派・役職・順番つきで返します。英国の議事録XMLとほぼ1対1で並びました。ここが合わなかったら方針を変えていたと思いますが、合ったので1,904行は無改造で通りました。
それでも5か所は直さないと動かなかった
無改造で済むのは変換で吸収できる部分だけです。言語そのものに依存する場所は、上流に手を入れる以外にありません。
1. 全文検索が日本語を1語も切っていなかった。 検索エンジンが何を索引したかを覗いたら、「厚生労働大臣に質問いたします」という一文がまるごと1語になっていました。Xapian は既定で空白と句読点でしか語を切らないので、日本語は句点までが1語です。Xapian 1.4 にはCJKをn-gramで切る仕組みが入っているので、それを立てました。索引側(Perl)と検索側(PHP)の両方で立てないと噛み合いません。
2. Perlのバインディングに定数が無かった。 PHP側には FLAG_CJK_NGRAM があるのに、Perl側には用意されていません。ライブラリ本体は対応しているので、PHP側で実測した値をPerlに直接渡しています。定数名が無いだけで機能が無いわけではない、という判断です。
3. 検索機能が黙って無効になっていた。 起動時に /usr/share/php/xapian.php があるかで検索を使うか決める作りでしたが、Debian の php-xapian パッケージはそのファイルを置きません。拡張は入っていて動くのに、「検索できない環境」と判断されていました。エラーは出ません。
4. 日本語が実体参照でデータベースに入っていた。 これ の形です。XMLを出し直すときASCII以外を全部変換する設定が既定で入っていました。英語なら影響が無く、日本語は全滅します。
5. 議院の番号を勝手に振れなかった。 画面側が英国下院のIDを147ファイルで直に使っているので、日本の衆参に別番号を当てると議員一覧が空になります。衆議院を英国下院の番号に、参議院を上院の番号に重ねました。
5つとも実際に詰まって、原因を特定してから直しました。先回りで直した箇所はありません。どれも環境変数か設定で切り替える形にして、英語で使うときの動きは変えていません。
翻訳では足りなかったところ
英国版の入口は「郵便番号を入れる」です。ここは訳して済む話ではありませんでした。
日本には、郵便番号と小選挙区の公式な対応表がありません。ただ、郵便番号を日本郵便の郵便番号データで市区町村と政令市の区に直せば、そこから小選挙区を引けます。全国1,741市区町村のうち、複数の小選挙区にまたがるのは47です。
効いたのは政令市を区まで見ることでした。名古屋市を市で引くと愛知1区から5区まで全部出ますが、瑞穂区なら愛知4区の1つに決まります。区そのものが2つの選挙区にまたがるのは全国で7区だけ(札幌市西区・北区・白石区、浜松市中央区、福岡市東区・南区・城南区)で、そこは町名で決まるので候補を並べて選んでもらいます。
もう1つの落とし穴は同じ名前の町村です。「池田町」は北海道・福井・長野・岐阜に4つあり、同名の組は全国で26あります。市区町村名だけで数えると「複数の選挙区にまたがる市区町村」が実際より多く出てしまいます。必ず都道府県と組にして持つようにしました。
「制度が違うから機能を削る」でも「無理に1つに決める」でもなく、決まるところまで絞って、決まらないところは画面で選ばせるのが答えでした。UIの都合ではなく、日本の選挙制度がそうなっているからです。
投票記録は参議院だけ入れられた
TheyWorkForYou には議員ごとの投票記録の画面があります。日本では参議院が本会議の採決を押しボタンで行い、議員別の賛否を公式サイトに載せています。第221回国会の本会議採決120件を取り込み、取り込んだ全件で議員別の票数が公式の投票総数と一致することを確かめました。
衆議院は起立採決がほとんどで、議員ごとの賛否が記録に残りません。ここも制度の差で、翻訳では埋まりません。
画面の文字は746件のうち636件
正直に書いておきます。翻訳は全部終わっていません。ナビの一部はテンプレートに直書きされていて、翻訳の仕組み(gettext)を通っていないからです。
ここも「全部やってから出す」を選びませんでした。日本語で検索できることが成立しているかどうかが先に知りたかったからです。110件の英語が残っていても、それは分かります。
成果物の形
上流のコードを含めずに配れる形にしました。当社の差分をパッチとして出し、変換スクリプトと翻訳を足した構成です。zipは0.06MBしかありません。上流のライセンスを尊重しつつ、本家の更新も追えます。
導入キットとして出しています。
TheyWorkForYou 日本語化・国会会議録対応キット
振り返り
海外OSSの日本語化で時間を食うのは、翻訳ではなく制度の差を当てる作業でした。郵便番号と住所、二院制の扱い、選挙区のまたがり。ここは上流に答えが無いので、自分で決めるしかありません。
逆に、言語の壁は思ったより薄かった。全文検索が日本語を切れないのは致命的に見えて、検索エンジン自身が答えを持っていました。MeCab を足す必要はありませんでした。
まず動かして、詰まった場所だけ直す。この順でやると、直さなくていい場所が見えてきます。今回は1,904行が無改造で済みました。
OSSを自社仕様に作り変える進め方はこちらにまとめています。
