⌨️

Goでゴママヨを検出するgo-gomamayo作ったので紹介

2023/12/16に公開

タイトルの通りゴママヨという言葉遊びを検出する Go 製の CLI ツール/ライブラリです。

https://github.com/yulog/go-gomamayo

同様のツールとして gomamayo.jsgomamayo-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 テストができるようになっているので、試しに使ってみました。

gomamayo_test.go
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 & ゴママヨ ライフをお過ごしください。

脚注
  1. ゴママヨが Misskey と関係があるのかについては諸説あります。 ↩︎

  2. そこそこ大きい気がしないでもないですが、今日の PC なら大丈夫でしょう… ↩︎

  3. 果たしてどんな場合でも上手く対応できるのかは不明です。 ↩︎

  4. ほかにテストしてないんですけどね。 ↩︎

  5. 両者で条件が異なる部分にゴママヨ観の違いが反映されているのかと思うと奥深いですね。 ↩︎

Discussion