【PR】本記事はアフィリエイト広告を利用しています。
要約処理
このシステムではトップページのページ紹介の項目に要約文が自動生成して紹介しています。
この部分ですね。
折角フルスクラッチで作成したシステムですので、何か特徴が欲しかったというところです。
デザインセンスはないので、その部分に関しては気にしないでください。
昔、数年前に研究レベルでマルコフ連鎖アルゴリズムで文章の自動生成をした文章はまるで使い物になりませんでした。
ただアルゴリズムで生成した文章は突拍子もなくて逆に面白かったので、遊び要素として採用するってのはありかもしれないなと感じていました。
そこから、文章の自動生成についてChatGPTが出るまで何もしてこなかったのですがそろそろ自分で作らなくても自動作成してくれるライブラリがあるだろうと探し始めました。
恥ずかしながらginzaというライブラリがあるのもしらずsumyというのも最近まで知りませんでした。
形態素解析であればmecabだなーぐらいだと思ってたのでginzaってのができたのかあ、みたいな。
一寸使ってみましたが、新しいものだけあっていい感じですね。
ということで、そのginzaとsumyを使った要約文を生成したものを採用しております。
まずはラッパークラスの紹介。
GinzaLapper.py
# -*- coding: utf-8 -*-
# ! /usr/bin/python
import sys
import ginza
import spacy
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lex_rank import LexRankSummarizer
from sumy.summarizers.lsa import LsaSummarizer
from sumy.summarizers.reduction import ReductionSummarizer
from sumy.summarizers.luhn import LuhnSummarizer
from sumy.summarizers.sum_basic import SumBasicSummarizer
from sumy.summarizers.kl import KLSummarizer
from sumy.summarizers.edmundson import EdmundsonSummarizer
# 銀座ラッパークラス
class GinzaLapper:
def __init__(self):
try:
self.nlp = spacy.load('ja_ginza_electra')
print("ja_ginza_electra ok.")
return
except Exception as e:
self.nlp = None
print(e)
try:
self.nlp = spacy.load('ja_ginza')
print("ja_ginza ok.")
return
except Exception as e:
self.nlp = None
print(e)
#---------------------------------------------
# 要約処理
#---------------------------------------------
def GenerateSummarizer( self, input_text = ""):
parser = PlaintextParser.from_string(input_text, Tokenizer('japanese'))
summarizer = LexRankSummarizer()
ret = summarizer(document=parser.document, sentences_count=3)
RetVal = ""
for val in ret:
RetVal = RetVal + val._text
return RetVal
pipで適当にginzaやsumyをインストールしてください。
そのあたりの説明は公式ページを参考にすれば難しくありませんので。
私の環境はクライアントにはGPUが搭載されているのでCUDAが使用できますが、実際このコードを乗っけるVPSには当然そんな
いいものはついてないので初期化方法が独特だと思います。
自身の環境に合わせてください。
また、実は形態素解析の関数などがクラスにあったのですが今回の目的はあくまで要約文の生成なのでそれ以外は省略してます。
次にこれを実際に使ったサンプルを以下に示します。
test.py
from GinzaLapper import GinzaLapper
# 青空文庫より・パーティ物語の一節
Document = "アメリカの脊骨をなしている中堅階級は、案外に健全な生活をしている。しかしそれは何も、そういう連中が皆朴念仁ぼくねんじんであるという意味ではない。皆>結構生活を楽しんでいるのであるが、その楽しみ方が甚だ利口なのである。その話について、まず正月向きに、少し柔らかいところから始めよう。それはアメリカにも芸者がい>るという話である。たいていの日本の奥さん方は、「アメリカには芸者がいない」という話をきいて、たいへん羨ましい国だと思っておられるらしい。しかしそれは間違いであ>って、アメリカにも、ちゃんと芸者はいるのである。もっとも、鑑札をもったそういう連中はいないが、もっとれっきとした同業の女性が、沢山いるのである。それは良家の奥>さんたち御自身である。考えてみれば当然な話で、アメリカだって、野郎ばかり十人も集まって、一晩話をしていたら、どうしてもあたりが殺風景になる。綺麗な着物を着た女>性が、少しちらちらしていてくれた方が、気分がなごんで来るところであるが、女権が強くて、人件費の高いアメリカでは、日本の芸者のような職業は生まれて来ない。それで>普通は、奥さん方が、その役をつとめるわけである。野郎ばかりで酒を飲む場合もあり、それが男たちには一つの息抜きになっているのであるが、その方は話が少し高級になる>ので、まず一般のアメリカ人の生活の話から入ることにしよう。アメリカは、中産階級の幅が広いのであるが、それを少し乱暴に大別すると、夫婦共稼ぎの階級と、女房を家に>遊ばせておく階級との二つになる。この後者の場合、奥さん方は、一応はまことに結構な御身分である。家の中は、これでもか、これでもか、とばかりに、便利重宝に出来てい>るし、たいてい通い女中がいるし、半日も片付けものをしたら、あとは仕事がない。羨ましい話であるが、これも一生となると、少々退屈するものらしい。"
nlp = GinzaLapper()
# 要約文の作成して表示
print( nlp.GenerateSummarizer( Document ) )
データは、青空文庫のパーティ物語の一節を使用して要約文を生成するようにしています。
以下のような結果になれば要約文が自動生成に成功しています。
以外と簡単なことが分かると思います。
意外と簡単な要約文の生成
触ってみると意外と簡単なことがわかります。
皆さんも是非遊んでみてください。
スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ) [ 国本 大悟 ] 価格:2750円 |