テキストの自動化処理で以下のような複数の文章がつながった以下のような1つの文字列の中から文章単位で区切る方法について調べた結果を紹介したいと思います
25 名無しさん
実際ベイダーになったあとってあの落とせる場所でルーク虐めに夢中になってる時のパルパティーン不意打ちするくらいしか勝ち目なくない?
26 名無しさんクワイガン普通に霊体になって出てきてるけど
ジェダイの霊体ってシスには見えないんやな
28 名無しさん反乱しないように性能抑えられてたじゃん
29 名無しさんぶっちゃけディズニーに権利売るならクローンウォーズ作り切ってからにして欲しかったわ
31 名無しさんアソーカってep9で声だけ出演してるよな
32 名無しさんヨーダとかいう作中で雑魚しか倒してないのに何故か偉そうにしてる緑
「こんにちは。今日もいい天気ですね。」みたいな感じで。で区切られている文章であればPythonだと文字列に対してsplit()を用いて。で区切れば解決できますが上記のように。句読点で区切られていない場合には適応することが難しいです
機械学習を使って区切る
というわけで行き着いたのが「機械学習による自然言語処理で区切る」という方法。具体的にはGiNZA
というライブラリを使用すれば、Pythonで日本語の文区切りにも使えます
GiNZAを用いた文区切り
ライブラリのインストールは以下で行うことができます
$ pip install -U ginza ja-ginza -q
GiNZAを用いた文章区切りのサンプルコードは以下で行えます。
# 区切りたいテキスト text =''' 25 名無しさん 実際ベイダーになったあとってあの落とせる場所でルーク虐めに夢中になってる時のパルパティーン不意打ちするくらいしか勝ち目なくない? 26 名無しさん クワイガン普通に霊体になって出てきてるけど ジェダイの霊体ってシスには見えないんやな 28 名無しさん 反乱しないように性能抑えられてたじゃん 29 名無しさん ぶっちゃけディズニーに権利売るならクローンウォーズ作り切ってからにして欲しかったわ 31 名無しさん アソーカってep9で声だけ出演してるよな 32 名無しさん ヨーダとかいう作中で雑魚しか倒してないのに何故か偉そうにしてる緑 ''' import spacy nlp = spacy.load('ja_ginza') doc = nlp(text) for sent in doc.sents: print(sent) print('----------------------')
<実行結果>
———————
実際ベイダーになったあとってあの落とせる場所でルーク虐めに夢中になってる時のパルパティーン不意打ちするくらいしか勝ち目なくない?
———————クワイガン
———————
普通に霊体になって出てきてるけど
ジェダイの霊体ってシスには見えないんやな
反乱しないように性能抑えられてたじゃん
ぶっちゃけディズニーに権利売るならクローンウォーズ作り切ってからにして欲しかったわ———————
アソーカってep9で声だけ出演してるよな
ヨーダとかいう作中で雑魚しか倒してないのに何故か偉そうにしてる緑———————
それっぽい部分で区切ることはできていますが、少し精度が悪いです。。。
ja-sentence-segmenterを使用する
そんな中で見つけたのがhttps://qiita.com/wwwcojp/items/3535985007aa4269009c で紹介されていた「ja-sentence-segmenter」というライブラリ。
インストールはpipで簡単にインストールできます。
$ pip install ja-sentence-segmenter
ja-sentence-segmenterを用いた文章区切りは以下のような感じで実装できます
import functools from ja_sentence_segmenter.common.pipeline import make_pipeline from ja_sentence_segmenter.concatenate.simple_concatenator import concatenate_matching from ja_sentence_segmenter.normalize.neologd_normalizer import normalize from ja_sentence_segmenter.split.simple_splitter import split_newline, split_punctuation split_punc2 = functools.partial(split_punctuation, punctuations=r"。!?") concat_tail_te = functools.partial(concatenate_matching, former_matching_rule=r"^(?P.+)(て)$", remove_former_matched=False) segmenter = make_pipeline(normalize, split_newline, concat_tail_te, split_punc2) for i in list(segmenter(text)): print(i) print('----------------------------')
<実行結果>
実際ベイダーになったあとってあの落とせる場所でルーク虐めに夢中になってる時のパルパティーン不意打ちするくらいしか勝ち目なくない?
—————————-
クワイガン普通に霊体になって出てきてるけど
—————————-
ジェダイの霊体ってシスには見えないんやな
—————————-
反乱しないように性能抑えられてたじゃん
—————————-
ぶっちゃけディズニーに権利売るならクローンウォーズ作り切ってからにして欲しかったわ
—————————-
アソーカってep9で声だけ出演してるよな
—————————-
ヨーダとかいう作中で雑魚しか倒してないのに何故か偉そうにしてる緑
感想や口コミみたいな取り留めのない文章でもいい感じで文章単位で区切ることができていてかなり精度がいいですね!
コメント