はじめに
タイ語が読めるので、インターン先で社内唯一のタイ語NLPデータサイエンサーとして登用されている者です。
プログラミングは9年以上やっているのですが、初めてOSSにコントリビューションできて嬉しくなったので、その手順と、そのOSSの管理手法について記録を残します。
pythainlp
とは?
タイ語の自然言語処理を行うにあたって恐らく全人類が使うであろう大御所ライブラリ pythainlp があります。
これには、
- 形態素解析
- 文章正規化
- ローマ字化
- スペルチェック
- コーパス提供
- ...
など、タイ語の処理に関する森羅万象の機能が搭載されています。
管理は、backさんとwannaphongさんの2名が積極的に行っております。
プルリク2; 文章正規化
タイ人はSNSなどでフランクに話す時、感極まると同じ文字を連打します
สัตตตตตตตต
良いいいいいいいいい
のように。(正しくはสัต
だけ)
これは、形態素解析のときに邪魔です。消えてもらいたいので、消す関数を作り、プルリクを出しました。
まずはissue
このプルリクのお話をしています:
https://github.com/PyThaiNLP/pythainlp/pull/862
自分の計画がライブラリに無用かどうかを確認するために、何がともあれissueで提案・確認
管理者からGOサインが出ました。
プルリクのコメントにissue番号(#
の後にある番号)を書き込むと、自動的に下部にあるように「mentioned」が書き込まれるので、取り組んでいることが分かりやすいです。
要件定義
issueの通り、実はすでに実装済みのことを移すだけなのですが、一応。
テストコードからそのまま転載しますが、
self.assertEqual(
remove_trailing_repeat_consonants(
'อืมมมมมมมมมมมมม คุณมีบุคลิกที่เริ่ดดดดด '
'ฉันจะให้เกรดดีกับคุณณณ\nนี่เป็นความลับบบบบ'
),
'อืมมม คุณมีบุคลิกที่เริ่ด ฉันจะให้เกรดดีกับคุณ\nนี่เป็นความลับ'
)
このようなことがしたいです。
すなわち、
อืมมมมมมมมมมมมม คุณมีบุคลิกที่เริ่ดดดดด ฉันจะให้เกรดดีกับคุณณณ
นี่เป็นความลับบบบบ
うーーーーーーーーーん、キミいいねえええええええ。良い成績を上げるよおおおおおお
これは秘密だよおおおおおおお
を
อืมมม คุณมีบุคลิกที่เริ่ด ฉันจะให้เกรดดีกับคุณ
นี่เป็นความลับ
うーん、キミいいね。良い成績を上げるよ。
これは秘密だよ。
にしたいわけです。
まず、傾向として、
- スペース・改行の直前に繰り返し子音が現れる
- 末尾が繰り返すのが正しい単語もある
というところがありますね。
なので
- スペース・改行・EOSの直前を見ればよく、
-
しかし繰り返された子音を全て消さばいいわけではない
- →辞書ベースに合致する単語が現れるまで消していく
ということですね。
実装
すると、レビュワーが出てくるまでもなく、Actionからかなり指摘をうけます。
Linter
からコード規約違反の警告と、CodeClimate
から「関数デカすぎ」の警告。
__init__.py
__init__.py
にユーザーへ提供したい関数を書き込み
これにより、ユーザーは頑張って関数のあるファイルのパスを探さなくとも
from pythainlp.util import remove_trailing_repeat_consonants
としてimport
できます。
テストコード
テストコードを書きました
お恥ずかしながら、今までテストコードをちゃんと書いたことがないのですが、書いてみると安心感が違いますね。現在は笑顔でテストコード書くようにしています。
リファクタリング;コード規約
指摘事項をそのまま直しても、Linterが許可してくれず、そのまま不貞寝しました。
ここで、CONTRIBUTING.mdを見ると、Black
を使うように指示されていました。
すると1コマンドだけでこんな簡単にコード規約関係が解決。めっちゃ便利!!
Black
すごく良くて、pip
でインストールして
python -m black パス --line-length=79
のコマンドを打つだけでそのファイルをPEP8
通りに仕立て上げてくれます。現在は愛用しております。
リファクタリング;関数分解
責務ごとに関数を分解すると、最終的に256行のファイルに。
CodeClimate
の警告はなくなりましたが、これでよかったのかなあ。
CodeClimateについては:
【GitHub】レビュワーがいなくとも綺麗にコード書く気になるサービス2選と利用方法
コードレビュー対応
ライブラリを制作する場合は、__init__.py
ではimport
のみならず__all__
というのも指定しないといけないらしいです。(じゃないとpylance
に認識されない)初めて知った。
これらを修正して、commit
&push
すると、自動的にプルリクが更新されます。(別件で初めてプルリク出した時にこれを知らずにプルリクを削除して怒られました)
merge
最後に
まだプルリク2発分ありますが、明日ぐらいに書きます。
ここで総括するまでもなく、python
のライブラリ管理を実践的に学べたので、すごくいい経験になりましたね。
いいね頂けると泣きながら喜びます><
この記事を読んでいる方は、これらの記事も読んでいるのかもしれません: