ソースコード内の日本語文章の表記ゆれをなんとかしたくて試行錯誤している話

ソースコード内の日本語文章の表記ゆれ問題

システム開発をしていると、管理画面のタイトルとか、エラーメッセージとか日本語文章を(HTMLやconfigを含む)ソースコード内のどこかに記述します。

しっかりと、開発の前に用語集(Excel!?)を作ったり、エラーメッセージ全一覧(Excel!?)などを作っていたら、もしかしたら解決なのかもしれませんが、

  • 「追加」と「新規作成」が混在
  • 「ユーザ管理」と「ユーザ一覧」が混在
  • 文章の最後に「。」がついたりつかなかったり
  • 「◯◯が発生しています」「◯◯しています」

みたいな日本語文章が、ソースコード内にばらまかれます。

そしてこれは、プログラムとしてエラーになりませんし、大抵のLintやチェックツールには引っかかりません。

表記ゆれを解決するツール

さきほど「大抵の」と言ったのは、実は、表記ゆれをいい感じにしてくれそうなLintやチェックツールがあるからです。

ただ、自分がなんとかしたいなあと思っている対象は微妙に違っていて

  • 「マニュアルのような日本語文章」ではなく「ソースコード内の日本語文章」(エラーメッセージレベルなので大抵短い短い。必要のないコード部分もある。)
  • 表記の正解の辞書を最初に作っている状況ではなく、できれば「なんとなく」表記ゆれを把握したい(そして、把握したあと修正を検討したりtextlintの辞書を作成したい)
  • ソースコード全体で把握したい(特定のプログラミング言語や記法に依存したくない)

とか、ちょっと特殊なケースです。

試行錯誤の途中結果報告

とりあえず、

「なんかいい感じにソースコードから日本語文章を抽出」⇒「なんかいい感じに表記ゆれが把握できそうな情報を表示」

という雑すぎる作戦で考えているのですが、あんまり解決方法は見えていません。

「なんかいい感じにソースコードから日本語文章を抽出」のほう

まずはソースコードから日本語文章を抽出してみようと思って、bun(文)というツールを作っています。

github.com

使い方は簡単で、grepみたいにファイルや文字列を渡すと、日本語部分を抽出して表示します。

$ curl https://twitter.com/tksmd/status/647570587561291776 | bun -n
39:     を使っています
39:     無事集合したところで
39:     がラップトップの電源を忘れてきて事務所に走るという順調なスタート
62:     さんは
62:     を使っています
62:     無事集合したところで
62:     がラップトップの電源を忘れてきて事務所に走るという順調なスタート
63:     さんは
63:     を使っています
63:     無事集合したところで
63:     がラップトップの電源を忘れてきて事務所に走るという順調なスタート
...

現在は、ほぼ「grepで非ASCIIを抽出すればいいじゃないか」というレベルですが、「10,000点獲得しました」とか「無事集合したところで @debility がラップトップの電源を忘れてきて事務所に走るという順調なスタート」とかを1つの文章として抽出できたらいいなあという妄想があります。

というわけで「日本語文章ならMeCabだろ」という変な思い込みから、(今のところ)無駄にMeCab(とnatto)を介して形態素に分割された情報を利用するようにしています。

そして、より精度の高い抽出のために形態素の付随情報をうまくつかったらなんかうまくいくのでは?と思っているのですが、現状は、「MeCabを介した結果MeCabをあつかいきれずダメなHackがはいる」という、むしろダメ感が漂っています。

これからさらに頑張るかもしれないし、「まあこれくらいでいいかな」ってなるかもしれません。

「なんかいい感じに表記ゆれが把握できそうな情報を表示」のほう

こっちはあんまり思いついていないです。

抽出した文章の全ての対でレーベンシュタイン距離とかN-gramを計算してリコメンドを出すのか?とか、SimStringのほうがいいのか?とか、まだ自分の中の「なんかいい感じの表示」の部分すら定まっていないので、なんとも。

ただ、bunの結果を眺めているだけで( $ bun index.html | sort | uniq )、意外に表記ゆれが見えてきたりします。人間すごい。

というわけで

何か進捗があったらまた書こうと思います。

あと、既に世の中に解決方法があったら是非教えて欲しいです。