ある日、spaCy を使って構文木を眺めていたら。
import spacy
# cited from https://mdpr.jp/news/detail/2468738
text = "斉藤は「いつも応援して頂き本当にありがとうございます。私からご報告があります。5月末をもって乃木坂46合同会社を退所しこのお仕事を引退することを決めました」と5月末をもって芸能界を引退することを発表。"
nlp = spacy.load("ja_core_news_md")
print(list(nlp(text).sents))
[斉藤は「いつも応援して頂き本当にありがとうございます。,
私からご報告があります。,
5月末をもって乃木坂46合同会社を退所しこのお仕事を引退することを決めました」と5月末をもって芸能界を引退することを発表。]
NLPer たるもの、もう少し人間の直感に合った文の切れ方にしたいと思ってしまった。 spaCy 内部を見てみると、日本語に特化した文分割の機構は入ってなさそう(本当?)なので、アドホックに良くするやり方を書く。
ここでは”文”とはどういった単位であるかについては一切触れない。こういう書籍はあるらしい。
多くの場合、いくつかの簡単なルールを記述するだけで、多くの自然言語のテキストを適切に文分割することができるが、筆者は怠惰である。わざわざ正規表現など書きたくない。機械学習モデルはもっと書きたくない。 ありもので済ませたいのでpySBDを使うことにする。関連論文が昨年の EMNLP の Workshop にも採択されている。
この他にも(サブ機能として)サポートされているツールは色々あるらしい。みんな各々オレオレルールでやってるんだと思う。
例えば固有表現由来の誤解析を可能な限り無くしたいのであれば、形態素解析の結果をベースにしたものが一番安心感はある。
pip install pysbd
pip で入れる。日本語含め様々な言語がサポートされたのは v0.3 以降のよう。
import pysbd
seg = pysbd.Segmenter(language="ja", clean=False)
print(seg.segment(text))
['斉藤は「いつも応援して頂き本当にありがとうございます。私からご報告があります。5月末をもって乃木坂46合同会社を退所しこのお仕事を引退することを決めました」と5月末をもって芸能界を引退することを発表。']
良さそう。
ドキュメントに親切に spaCy への integration 方法が記載されているのでそれに習って、再トライ。
# based on https://github.com/nipunsadvilkar/pySBD/blob/0f4821213ee33b3e60ea91066fbbfb28c0936960/examples/pysbd_as_spacy_component.py
def pysbd_sentence_boundaries(doc):
seg = pysbd.Segmenter(language="ja", clean=False, char_span=True)
sents_char_spans = seg.segment(doc.text)
char_spans = [doc.char_span(sent_span.start, sent_span.end) for sent_span in sents_char_spans]
start_token_ids = [span[0].idx for span in char_spans if span is not None]
for token in doc:
token.is_sent_start = True if token.idx in start_token_ids else False
return doc
nlp = spacy.load("ja_core_news_md")
nlp.add_pipe(pysbd_sentence_boundaries, before="parser")
print(list(nlp(text).sents))
[斉藤は「いつも応援して頂き本当にありがとうございます。私からご報告があります。5月末をもって乃木坂46合同会社を退所しこのお仕事を引退することを決めました」と5月末をもって芸能界を引退することを発表。]
おわり。ちなみにモーニング娘。問題が解決されているわけではない。
print(list(nlp("モーニング娘。は、日本の女性アイドル・ボーカル&ダンスグループである。").sents))
[モーニング娘。, は、日本の女性アイドル・ボーカル&ダンスグループである。]
こんな感じでも後段のパイプライン処理とのスパンの整合性などは問題ないのだろうか?