3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CA Tech LoungeAdvent Calendar 2023

Day 24

タイ語処理OSSに4発プルリクを出した初コントリビューション体験記②; 文章正規化

Last updated at Posted at 2023-12-05

はじめに

タイ語が読めるので、インターン先で社内唯一のタイ語NLPデータサイエンサーとして登用されている者です。

プログラミングは9年以上やっているのですが、初めてOSSにコントリビューションできて嬉しくなったので、その手順と、そのOSSの管理手法について記録を残します。

pythainlpとは?

タイ語の自然言語処理を行うにあたって恐らく全人類が使うであろう大御所ライブラリ pythainlp があります。

これには、

  • 形態素解析
  • 文章正規化
  • ローマ字化
  • スペルチェック
  • コーパス提供
  • ...

など、タイ語の処理に関する森羅万象の機能が搭載されています。

管理は、backさんwannaphongさんの2名が積極的に行っております。

プルリク2; 文章正規化

タイ人はSNSなどでフランクに話す時、感極まると同じ文字を連打します

สัตตตตตตตต
良いいいいいいいいい

のように。(正しくはสัตだけ)

これは、形態素解析のときに邪魔です。消えてもらいたいので、消す関数を作り、プルリクを出しました。

まずはissue

このプルリクのお話をしています:
https://github.com/PyThaiNLP/pythainlp/pull/862

自分の計画がライブラリに無用かどうかを確認するために、何がともあれissueで提案・確認

image.png

管理者からGOサインが出ました。

image.png

プルリクのコメントにissue番号(#の後にある番号)を書き込むと、自動的に下部にあるように「mentioned」が書き込まれるので、取り組んでいることが分かりやすいです。

要件定義

issueの通り、実はすでに実装済みのことを移すだけなのですが、一応。

テストコードからそのまま転載しますが、

self.assertEqual(
    remove_trailing_repeat_consonants(
        'อืมมมมมมมมมมมมม คุณมีบุคลิกที่เริ่ดดดดด '
        'ฉันจะให้เกรดดีกับคุณณณ\nนี่เป็นความลับบบบบ'
    ),
    'อืมมม คุณมีบุคลิกที่เริ่ด ฉันจะให้เกรดดีกับคุณ\nนี่เป็นความลับ'
)

このようなことがしたいです。

すなわち、

อืมมมมมมมมมมมมม คุณมีบุคลิกที่เริ่ดดดดด ฉันจะให้เกรดดีกับคุณณณ
นี่เป็นความลับบบบบ
うーーーーーーーーーん、キミいいねえええええええ。良い成績を上げるよおおおおおお
これは秘密だよおおおおおおお

อืมมม คุณมีบุคลิกที่เริ่ ฉันจะให้เกรดดีกับคุ
นี่เป็นความลั
うーん、キミいいね。良い成績を上げるよ。
これは秘密だよ。

にしたいわけです。

まず、傾向として、

  • スペース・改行の直前に繰り返し子音が現れる
  • 末尾が繰り返すのが正しい単語もある

というところがありますね。
なので

  • スペース・改行・EOSの直前を見ればよく、
  • しかし繰り返された子音を全て消さばいいわけではない
    • →辞書ベースに合致する単語が現れるまで消していく

ということですね。

実装

124行のずいぶんおデブな関数を最初に提出しちゃいました

すると、レビュワーが出てくるまでもなく、Actionからかなり指摘をうけます。
image.png

Linterからコード規約違反の警告と、CodeClimateから「関数デカすぎ」の警告。

__init__.py

__init__.pyにユーザーへ提供したい関数を書き込み
これにより、ユーザーは頑張って関数のあるファイルのパスを探さなくとも

from pythainlp.util import remove_trailing_repeat_consonants

としてimportできます。

テストコード

テストコードを書きました
お恥ずかしながら、今までテストコードをちゃんと書いたことがないのですが、書いてみると安心感が違いますね。現在は笑顔でテストコード書くようにしています。

リファクタリング;コード規約

指摘事項をそのまま直しても、Linterが許可してくれず、そのまま不貞寝しました。
image.png

ここで、CONTRIBUTING.mdを見ると、Blackを使うように指示されていました。

すると1コマンドだけでこんな簡単にコード規約関係が解決。めっちゃ便利!!
image.png

Blackすごく良くて、pipでインストールして

python -m black パス --line-length=79

のコマンドを打つだけでそのファイルをPEP8通りに仕立て上げてくれます。現在は愛用しております。

リファクタリング;関数分解

責務ごとに関数を分解すると、最終的に256行のファイルに。
CodeClimateの警告はなくなりましたが、これでよかったのかなあ。

コードレビュー対応

Action全て対応できたので、コメントで報告。
image.png

関数名の指摘。確かにそうだ。
image.png

コメントの誤りが複数。ごめんなさい。
image.png

ライブラリを制作する場合は、__init__.pyではimportのみならず__all__というのも指定しないといけないらしいです。(じゃないとpylanceに認識されない)初めて知った。
image.png

これらを修正して、commit&pushすると、自動的にプルリクが更新されます。(別件で初めてプルリク出した時にこれを知らずにプルリクを削除して怒られました)

merge

そしてマージしていただけました。嬉しい。
image.png

最後に

まだプルリク2発分ありますが、明日ぐらいに書きます。

ここで総括するまでもなく、pythonのライブラリ管理を実践的に学べたので、すごくいい経験になりましたね。

いいね頂けると泣きながら喜びます><

この記事を読んでいる方は、これらの記事も読んでいるのかもしれません:

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?