🐕

Python向け文切りライブラリを作った

2021/12/27に公開

こんにちは。初めまして。Zenn初投稿です。
今まではnoteで書いていましたが最近zennをよく見かけるようになったので移ってきました。

初投稿でいきなりですが、Python向け文切りライブラリを作ったので紹介します。

ソースコード

https://github.com/alinear-corp/kuzukiri

マニュアル

https://alinear-corp.github.io/kuzukiri/

これは何?

複数文からなる日本語テキストを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文字)で括弧閉じる記号の待機を打ち切ります

なお、句点類や括弧類の定義は変更可能です。
詳細な動作はテストをご覧いただければご理解いただけるかと思います。
https://github.com/alinear-corp/kuzukiri/tree/main/tests

感想とか色々

  • Pythonで書くと将来的にPython以外で使いにくくなることが気になったのでRustで書きました。C++も検討しましたが新しいことに挑戦したかった。
  • PyO3 が素敵すぎます。Rustのコードが半自動でPythonにportできました。portしている部分 ⇒ https://github.com/alinear-corp/kuzukiri/blob/main/src/wrapper.rs
  • ドキュメントの生成に初めはSphinxを使おうとしましたがどうにもうまくいきませんでした。(ネイティブモジュールを認識してくれない) 運良くpdoc3の方は動いたのでこちらを利用しました。

Discussion