ローマ字のtypoを検出するコマンドラインツールのご紹介

もしあなたが、日本のお客様の業務に合わせたアプリケーションを作っている、またはアプリケーション内で日本にしかない概念を扱う必要があるような場合、変数等の命名で悩んだことはありませんか。

専門用語を英語に翻訳できない！
翻訳すると余計に意味がわかりにくくなってしまう！

そんなとき、日本語をそのままローマ字にしてしまうことはありませんか。
ありますね。
あるんですよ。

ローマ字を使うこと自体は悪いことではないと思います。
しかし、英語が標準であることが多いソフトウェア開発において、なんだか気にすることが増えて辛いですね。
ヘボン式、日本式、訓令式・・・うーん、どれがどれ？

人間にはもっと気にすべき大事なことがあるので、最初にローマ字表記の決まりだけ作ったらコーディング時の typo チェックのようなことはできるだけ機械にお任せしたい。
ということで、下記の2つのツールを作ってみました。

* [Romajic：ローマ字のtypoを検出するツール](https://github.com/emsk/romajic)
* [Romajify：ひらがなやカタカナをローマ字に変換するツール](https://github.com/emsk/romajify)

ついカッとなってやった類のものです。
車輪の再発明でしょうか。
気にしません。

RubyGems に公開していますので、`gem install` や `bundle install` のコマンドにてインストールしていただけます。

## 使用方法

どちらのツールもコマンドラインから実行できます。

```sh:Romajic
$ romajic search すし
SUSI -> sushi @ /usr/local/src/Example.java:5
sushiya -> sushi @ /usr/local/src/example.txt:2
```

```sh:Romajify
$ romajify hepburn すし
sushi
```

Ruby で実装していますので、Ruby のソースコードから呼び出すことも可能です。
実際に Romajic では探索対象の単語にひらがなやカタカナを指定した場合に、内部で Romajify の変換処理を呼び出しています。

## もう少し詳しく

### Romajic

この記事のメインとなっている、ローマ字の typo を検出する gem です。
前述の実行例のように `romajic search` の後ろに探索対象の単語（ひらがな、カタカナ、アルファベット）を指定します。
コマンドライン引数または設定ファイルでオプションを指定することもできます。

#### 検出処理

[CodeRay](http://coderay.rubychan.de/) という gem で探索対象ファイル内の字句解析を行い、levenshtein という gem で探索対象の単語に似ている（一致はしていない）単語を検出し、標準出力に結果を出力します。

「似ている」というのは、探索対象の単語との[レーベンシュタイン距離](https://ja.wikipedia.org/wiki/%E3%83%AC%E3%83%BC%E3%83%99%E3%83%B3%E3%82%B7%E3%83%A5%E3%82%BF%E3%82%A4%E3%83%B3%E8%B7%9D%E9%9B%A2)が1〜3（オプションにより変更可能）のものを指しています。

#### コマンドラインオプション

実行時には下記のオプションを指定できます。

| オプション | 説明 | デフォルト |
| :--- | :--- | :--- |
| `-e/--exclude-word` | 検出結果から除外する単語を指定します。 | 指定なし |
| `-c/--config` | 設定ファイルのパスを指定します。 | Romajic gem 内の default.yml |
| `-d/--dir` | 探索対象ディレクトリのパスを指定します。 | コマンドを実行しているディレクトリ |
| `-E/--extensions` | カンマ区切りで探索対象のファイルの拡張子を指定します。 | 全ての拡張子 |
| `-D/--distance` | 探索対象の単語と比較する際に使用するレーベンシュタイン距離を指定します。ここで指定した距離以内の単語を「似ている」とみなし、検出結果に出力します。 | `3` |
| `-C/--converter` | 探索対象の単語にひらがなやカタカナを指定した際のローマ字変換に使用される Romajify のコンバータを指定します。`hepburn`、`modified_hepburn`、`traditional_hepburn`、`nihon`、`kunrei` のいずれかを指定できます。 | `hepburn` |

#### 設定ファイル

YAML 形式の設定ファイルにオプションを記載することにより、少しだけリッチな探索処理ができます（2015/3/26現在）。
例えば、探索対象の単語はコマンドライン引数としては1つしか渡すことができませんが、この設定ファイルを使用することにより、複数の単語を探索対象として指定することができます。

設定例を下記に示します。

```yaml:romajic.yml
target_words:
  - すし
  - まっちゃ
  - まちづくり
  - sakura
exclude_words:
  - maccha
root_dir: /Users/emsk/projects/example1
extensions:
  - java
  - rb
  - js
  - css
distance: 2
converter: hepburn
```

```sh:設定ファイルを使用した場合の実行例
$ romajic search --config /path/to/romajic.yml
```

### Romajify

ひらがなやカタカナをローマ字に変換する gem です。
この変換処理は Romajic 本体に組み込まない方が設計がシンプルになるし、Romajify 単体で使えるので使い勝手が良さそう、という判断で別の gem にしました。

ヘボン式、日本式、訓令式のローマ字への変換に対応しています。
コマンドライン引数でオプションを指定することもできます。

#### コマンド

下記コマンドの後ろに変換対象の単語（ひらがな、カタカナ）を指定します。

| コマンド | 説明 |
| :--- | :--- |
| `romajify hepburn` | ヘボン式ローマ字に変換します。 |
| `romajify nihon` | 日本式ローマ字に変換します。 |
| `romajify kunrei` | 訓令式ローマ字に変換します。 |

#### コマンドラインオプション

下記のオプションを指定できます。

| オプション | 説明 | デフォルト |
| :--- | :--- | :--- |
| `-u/--upcase` | 変換結果を大文字で返す場合に指定します。 | `false`（小文字） |
| `-t/--traditional` | [「和英語林集成」第3版](http://mgda.meijigakuin.ac.jp/mgda/waei/)に従ったヘボン式へ変換する場合に指定します。`hepburn`　コマンドのみのオプションです。 | `false`（修正ヘボン式） |


## 開発方針

ローマ字というのは、意外に定義が曖昧だったり、普通にコーディングしていても使わない文字（長音を表す記号等）が定義されていたりします。
方針としては、定義に完全に従うことよりも、どちらかと言うと使いやすさの方を重視したいと思います。
実際に Romajify での変換も定義に従っていないところがあります。

## 今後について

下記のような対応もできればと思っています（思っているだけの可能性も・・・）。

* 自動で typo を訂正できるようにする
* 漢字もローマ字に変換できるようにする
* 検出処理やその他諸々の処理のアルゴリズムを見直し、高速化する
* Jenkins で検出処理を定期的に回し、グラフ表示できるようにする

まだ v0.1.0 をリリースしたばかりで、至らない点も多々あるかと思います。
お気軽にフィードバックをいただければと思います。:pray: