Python

【Python】機械学習を用いてテキストを文章単位に区切るサンプルコード

この記事は約6分で読めます。

 

テキストの自動化処理で以下のような複数の文章がつながった以下のような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で声だけ出演してるよな
—————————-
ヨーダとかいう作中で雑魚しか倒してないのに何故か偉そうにしてる緑

 

感想や口コミみたいな取り留めのない文章でもいい感じで文章単位で区切ることができていてかなり精度がいいですね!

 

 


プログラミング・スクレイピングツール作成の相談を受け付けています!

クラウドワークス・ココナラ・MENTAなどでPython・SQL・GASなどのプログラミングに関する相談やツール作成などを承っております!

過去の案件事例:

  • Twitter・インスタグラムの自動化ツール作成
  • ウェブサイトのスクレイピングサポート
  • ダッシュボード・サイト作成
  • データエンジニア転職相談

これまでの案件例を見る

キャリア相談もお気軽に!文系学部卒からエンジニア・データサイエンティストへの転職経験をもとに、未経験者がどう進むべきかのアドバイスを提供します。


スポンサーリンク
/* プログラミング速報関連記事一覧表示 */
ミナピピンの研究室

コメント

タイトルとURLをコピーしました