文区切りをいい感じに実行したい

A8バナー広告

こんなことを書くよ

  • 文区切りをいい感じにやっといてくれるライブラリの紹介
  • ちょっと不都合があったので、改造して使う場合の紹介

文区切り?なんで必要?

「文」を扱いたいタスクのときに、文区切りが必要になる。

例えば、固有表現表現抽出をするときは、文区切りをしてから実行する(イメージ。ぼくの頭の中で)

ここ2年くらいだと、を使うタスクのときは、割と文区切りをすることが多いと思う。主にメモリ制約の問題などで。

文区切り?句点で切ればいいんじゃないの?

ところがどっこい、そうはいかない。

新聞記事以外の日本語では、句点以外の文区切りパターンが存在している。

  • クエスチョンマークとエクスクラメーションマーク
  • 顔文字

さらに、こういうパターンに起き得る。

  • 直接引用文の中身に句点、?、!が書かれている。でも、本文は終了していないので、区切ってほしくない
    • Ex. ぼくはいいんじゃいかな?と思う
  • 見た目の整形のために、文途中で改行を入れる人がいる。特にメールでは多いと思う。
    • ぼくも「しゃかいじんまなー」とかいうやつでそう指導された。でも、しょーじき言ってどーでもいいレベルといまは思ってる。でも、くせになってしまったので、結局はぼくも改行してしまっている。
    • 時々、英語・語のメールを書いているときも「文途中で改行いれて整形したい病」に襲われる。悪しき弊害だな〜。

と、いう、あれやこれやを自分でルールを書いていくと相当に面倒くさい。

どうすんのよ?

ja-sentence-segmenterっていう割といい感じにやってくれるパッケージがある。

ちなみに、Qiitaにも作者の書いた記事がある。

こいつのすごい点は次の2点だ。

  • 直接引用文の中身で文区切りしないように工夫してくれている。
  • 文区切り中の処理(全角・半角変換、文字区切り)の処理を自分で任意の処理で置き換えることができる。

詳細な使い方は、Qiitaの記事を見てもらえれば〜。

ちょっと困った

いろいろ事情があって「改行を消さないで残してほしい」っていうユースケースが発生した。

ちょっと苦戦したので、メモとして残しておく。ちな、ja-sentence-segmenterのバージョンは0.02

何に困った?

サンプルコードをそのまま実行すると、こうなる。

改行が消えてしまう原因は2箇所に問題があった。

  1. サンプルコードのsplit_newline関数
  2. サンプルコードのsplit_punctuation関数

この2つの関数と自分で作成して、パイプラインに入れてやれば良い。

で、こうした。

で、最後にパイプラインを作ってやる。

実行してみる。

うまく行った!

作者の方が柔軟も変更にできる設計にしてくれているので、モンキーパッチみたいなことをしなくても良かった。すばらしい?