pure kotlin な double array の実装である KDary をリリースした
https://central.sonatype.com/artifact/io.github.tokuhirom.kdary/kdary https://github.com/tokuhirom/kdary
KMP(Kotlin Multiplatform) 環境で Mac アプリを実装していた。その中で雑な文書要約をしたくなり、 TF-IDF を使いたくなった。日本語で TF-IDF を使うには単語を分かち書きする必要があるわけだが、分かち書きするには形態素解析機を使うのが手っ取り早いということになる。しかしながら、KMP 環境では利用できる日本語形態素解析機は存在していない。 ないものは作るしかないので、作るのだが、日本語の形態素解析を効率よくやるためには共通接頭辞検索を行う必要がある。このために使えるライブラリも KMP 環境には存在していない。 そこで、まずは共通接頭辞検索のためのライブラリを、他の言語から移植することとした。
MeCab の実装を参考にすれば、移植元は Darts,Darts-Clone, MARISA あたりがパッと思い浮かぶ。tx,rx, ux とかでも良い。xcdat や crawdad でも良い。
LOUDS でもダブル配列でもいいんだけど、シングルファイルで実装されてて移植が簡単そうな darts-clone をベースとすることとした。Darts よりも darts-clone のほうが生成ファイルが小さくなるという点も魅力である。そこそこの速度がでて、実績あるやつならまじでなんでもよかった。
darts-clone の移植は、chatgpt などの力も借りてやろうと思ったが、思ったよりうまくいかず。c++ のコードでは、メソッド呼び出し時に参照やポインタを渡す事ができ、そこを書き換えることが可能だが、そういう概念を chatgpt がうまく解釈できないようだ。今どき、c/c++ 以外でそういう言語ないしな。。 というわけでほとんど手書きした。テストケースは概ね chatgpt に生成させ、darts-clone の出力と突合し、正解データを darts-clone のものに揃えるように実装を調整しながらデバッグしていった。 本来、darts-clone では配列の添字の範囲が size_t だが、kotlin では配列の添字の範囲が Int なので、Int の範囲になるように調整した。
2024-07-06 に実装開始して、2024-07-16 に maven central にリリースしているので、片手間にやって約10日の実装期間ということになる。
工夫したところ
- 当初、UByteArray を採用していたが、途中で普通の ByteArray を使うことにした。これは、UByteArray が experimental であるため。
- AutoPool/AutoStack/AutoArray 周りは kotlin の標準データ構造を採用するように改変。
- Kotlin の ByteArray は長さを持ってるので、長さを別途渡してるパラメータを削った
- inline value class を使いたかったが、Kotlin/JVM 以外ではサポートされてない。actual/expect にしてもいいが、、コピペまつりになりそうでだるい。
はまったところ
ByteArray を Set に入れようとしてハマった。
val setByteArray =
setOf(
"a".toByteArray(),
"a".toByteArray(),
"b".toByteArray(),
)
println(setByteArray)
のような場合、"a".toByteArray() が重複登録されてしまう。 まぁ、これは JVM から始まった言語だからしょうがないが、罠い。
Maven Central へのリリース
KMP のライブラリは Maven Central へのリリースが可能だ。
先日の kotlin fest で発表していた atsushieno さんのブログ記事を参考にして試したところうまくいった。昔は Maven Central への登録は担当者との温かみのある JIRA 上でのやりとりが必要となっていて、めんどくさかったが、今は github 認証をすれば、io.github.tokuhirom
以下にスッとアップロードできるようになっていて、圧倒的に簡単になっている。
https://zenn.dev/atsushieno/articles/d066e757c9640f https://speakerdeck.com/atsushieno/building-kotlin-multiplatform-libraries-in-2024-cc23c2ab-bbbd-4e28-bd05-c46985685a23
atsushieno さんに感謝。
libs.kmp.icerock.dev への登録
https://libs.kmp.icerock.dev に KMP なライブラリはまとまってるんで、ここに登録していく。
Pull request を出せばいいだけなので簡単だ。 https://github.com/icerockdev/libs.kmp.icerock.dev/pull/111
まとめ
- s-yata さんの darts-clone を KMP に移植した。移植しやすいコードで助かりました。ありがとうございました。
- atsushieno さんの記事のおかげでめっちゃ簡単に maven central に KMP ライブラリをリリースすることができた