🐕
Python向け文切りライブラリを作った
こんにちは。初めまして。Zenn初投稿です。
今まではnoteで書いていましたが最近zennをよく見かけるようになったので移ってきました。
初投稿でいきなりですが、Python向け文切りライブラリを作ったので紹介します。
ソースコード
マニュアル
これは何?
複数文からなる日本語テキストを1文ごとに分割します。
例
import kuzukiri
segmenter = kuzukiri.Segmenter()
text = "これはテストです。文分割します。"
sentences = segmenter.split(text)
print(sentences) # => ['これはテストです。', '文分割します。']
segmenter = kuzukiri.Segmenter()
text = " split_with_normを使うと文分割の後でNFKC正規化を行います。 \n 前後の空白も除去します。 "
sentences = segmenter.split_with_norm(text)
print(sentences) # => ['split_with_normを使うと文分割の後でNFKC正規化を行います。', '前後の空白も除去します。']
# splitは余計なことをしません。
sentences = segmenter.split(text)
print(sentences) # => [' split_with_normを使うと文分割の後でNFKC正規化を行います。', ' \n', ' 前後の空白も除去します。', ' ']
インストール方法
pip install kuzukiri
なんで作ったの?
自然言語処理では文書を文に分割する処理は頻出問題です。おそらく同業の方はこういうコードは何度も書いていると思います。
契約の関係上、個別のクライアント向けに書いたコードは使いまわせないため、今まで顧客ごとにフルスクラッチで(何も見ずに)書き直していました。しかしこのような再発明は余りにも無駄です。
OSSとして公開しておくことで、複数のクライアントに使いまわせるようになり、再発明する手間が省けます。(直近で書く必要があったクライアント様に許可をいただいた上での公開です。名前は出しませんがありがとうございます!)
なお、既存のライブラリも存在しますが、なんとなく手になじまない感じがありました。(個人の感想です)
動作の詳細は?
ルールベースです。
- 句点が現れたタイミングで分割します
- 括弧内に表れた句点は無視します
- 括弧の対応関係を考慮します
- 括弧の対応が取れていない場合、あまりにも長くなった時点(デフォルト1000文字)で括弧閉じる記号の待機を打ち切ります
なお、句点類や括弧類の定義は変更可能です。
詳細な動作はテストをご覧いただければご理解いただけるかと思います。
感想とか色々
- Pythonで書くと将来的にPython以外で使いにくくなることが気になったのでRustで書きました。C++も検討しましたが新しいことに挑戦したかった。
- PyO3 が素敵すぎます。Rustのコードが半自動でPythonにportできました。portしている部分 ⇒ https://github.com/alinear-corp/kuzukiri/blob/main/src/wrapper.rs
- ドキュメントの生成に初めはSphinxを使おうとしましたがどうにもうまくいきませんでした。(ネイティブモジュールを認識してくれない) 運良くpdoc3の方は動いたのでこちらを利用しました。
Discussion