Goでゴママヨを検出するgo-gomamayo作ったので紹介
タイトルの通りゴママヨという言葉遊びを検出する Go 製の CLI ツール/ライブラリです。
同様のツールとして gomamayo.js、gomamayo-deno が存在し、本ツールはそれらを参考に作成しています。
インストール
GitHub Releases からダウンロードして使えます。動作確認したのは Windows だけですが、 Mac や Linux でも使えるはずです。
Go がインストール済みであれば go install
でインストールすることもできます。
go install github.com/yulog/go-gomamayo/cmd/gomamayo@latest
ライブラリとして利用することもできます。(たぶん)
go get -u github.com/yulog/go-gomamayo@latest
使い方
gomamayo analyze
で検出できます。
gomamayo analyze ごまマヨネーズ
結果
※見やすさのために整形しています。
{
"isGomamayo": true,
"combo": 1,
"detail": [
{
"surface": "ごま|マヨネーズ",
"dimension": 1,
"rawResult1": {
"id": 28368,
"start": 0,
"end": 2,
"surface": "ごま",
"class": "KNOWN",
"pos": [
"名詞",
"一般",
"*",
"*"
],
"base_form": "ごま",
"reading": "ゴマ",
"pronunciation": "ゴマ",
"features": [
"名詞",
"一般",
"*",
"*",
"*",
"*",
"ごま",
"ゴマ",
"ゴマ"
]
},
"rawResult2": {
"id": 99158,
"start": 2,
"end": 7,
"surface": "マヨネーズ",
"class": "KNOWN",
"pos": [
"名詞",
"一般",
"*",
"*"
],
"base_form": "マヨネーズ",
"reading": "マヨネーズ",
"pronunciation": "マヨネーズ",
"features": [
"名詞",
"一般",
"*",
"*",
"*",
"*",
"マヨネーズ",
"マ ヨネーズ",
"マヨネーズ"
]
}
}
]
}
辞書は IPA と NEologd が選択できます。(標準は NEologd です)
# ipa or neo
gomamayo analyze -sysdict ipa ごまマヨネーズ
除外ワードを設定することもできます。
# 追加
gomamayo ignore add サラダ
# 削除
gomamayo ignore remove サラダ
# 一覧
gomamayo ignore list
# インポート
gomamayo ignore import
# エクスポート
gomamayo ignore export
使ったもの
- ライブラリ
- ツール
開発について
kagome
Go 製の形態素解析器です。使い方は作者の方による Zenn の書籍『実践:形態素解析 kagome v2』が詳しいです。
本家ゴママヨ検出器では MeCab を使っていますが、今回は Go で作るので kagome を使っています。
これによって、
- MeCab のインストールが不要
- 辞書も一体化
という特徴が得られます。
NEologd がおすすめとあるので、本ツールでも使用したところ、バイナリサイズが230MBになってしまいました[2]。
長音対応
本家や元祖では専用の長音変換用の定義で変換していましたが、ローマ字にしたら、いい感じに母音が取れるのでは?ということで、 goark/krconv というライブラリでローマ字変換しています[3]。
CLI
urfave/cli でサブコマンド付きの CLI にしています。シンプルで良かったです。
ほかに代表的なライブラリに spf13/cobra があります。(これは Go 製の CLI Misskey Client mikuta0407/misskey-cli で使われています)
除外ワード機能
gomamayo-deno では AloeDB という NoSQL データベースが使われていました。NoSQL データベースというのは雑な理解ですが、Key-Value 形式で保存するデータベースのようです。
本ツールでは CloverDB という Go 製の NoSQL データベースを使用しました。
Fuzzing
Go は標準で Fuzzing テストができるようになっているので、試しに使ってみました。
package gomamayo
import (
"testing"
)
func FuzzAnalyze(f *testing.F) {
testcases := []string{"ごまマヨネーズ"}
for _, tc := range testcases {
f.Add(tc)
}
f.Fuzz(func(t *testing.T, s string) {
New("ipa", false).Analyze(s)
})
}
実行はこんな感じにします。 -fuzz
で対象にする関数を指定できて、 -fuzztime
で実行時間を指定できます。
go test -fuzz=Fuzz -fuzztime 10s
# 特定の関数を指定せず、無制限に実行
go test -fuzz .
これによって、長音が2連続すると上手く動かない不具合が見つかりました。テストって:taisetu:ですね[4]。
検出ロジック
既存の2つの実装を参考にしています[5]。
CI
初めてのCI…初めての GitHub Actions…。
どういう時に便利なんだろう?と思っていたんですが、、こんなことが無料でできて良いんですか…??
Go では GitHub Actions などの CI から make というのが呼ばれてビルドする場合が多いようですが、 Windows だと make を使うのは大変そうな印象を受けたので、 Go 製の Mage を使ってみることにしました。
ビルドしたり、リリースしたりするときのアレコレも Go で書けるので、便利でした。
GitHub Action も用意されていて、簡単に使えました。
初期状態では GitHub Actions の secrets.GITHUB_TOKEN
にリリースを行う権限がないようでした。下記のようにしたらできたのですが、ほかのリポジトリを見るとこういった記載はなく、ほかに方法があるようです。難しいです。
release:
name: Release
runs-on: ubuntu-latest
permissions:
contents: write
始めは Task (これも Go 製)を試したのですが、構文を理解するのが大変で今回は止めました。
まとめ
初めてのアドベントカレンダー参加でした。
機会があれば是非使ってみてください!
最後まで読んでくださった方、ありがとうございました!
少し早いですが、年末も良い Misskey & ゴママヨ ライフをお過ごしください。
Discussion