前回はpythonのライブラリのpysummarizationで文章要約を行う方法について書きました。
今回は、文章要約ってどんな機能があるのか調べる必要があった際に見つけたうちの一つであるsumyについてのメモです。
sumyの使い方
sumyを使った文の要約には『sumy』、『janome』、『tinysegmenter』が必要です。
それぞれpip isntallで追加します。
pip install sumy
pip install janome
pip install tinysegmenter
ソースコードです。
import numpy as np
import pandas as pd
import re
from janome.tokenizer import Tokenizer as Tokenizer
with open(ファイルがあるパスを指定, "r", encoding="utf-8") as f:
data = f.read()
data = re.sub("《[^》]+》", "", data)
data = re.sub("[[^]]+]", "", data)
data = re.sub("[| 「」\n]", "", data)
# 1文毎に区切る(『。』を1文とする)
lines = data.split("。")
mainText = [x+"。" for x in lines]
#print(mainText)
t = Tokenizer()
wakati = []
tmp1 = []
tmp2 = []
for line in mainText:
for token in t.tokenize(line):
tmp1.append(token.surface)
tmp2 = " ".join(tmp1)
wakati.append(tmp2)
tmp1 = []
from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lex_rank import LexRankSummarizer
from sumy.summarizers.text_rank import TextRankSummarizer
from sumy.summarizers.lsa import LsaSummarizer
parser = PlaintextParser.from_string("".join(wakati),Tokenizer("japanese"))
# Lex-Rank
# LexRankは、抽出型に分類される要約アルゴリズムで、文書からグラフ構造を作り出して重要な文のランキングを作ることで要約と言える文を発見する
LexRankSummarizer = LexRankSummarizer()
LexRankSummarizer.stop_words = [" "]
summary = LexRankSummarizer(document=parser.document, sentences_count=15)
print(summary)
# LSA
LsaSummarizer = LsaSummarizer()
summary = LsaSummarizer(document=parser.document, sentences_count=5)
print(summary)
#Text-Rank
TextRankSummarizer = TextRankSummarizer()
summary = TextRankSummarizer(document=parser.document, sentences_count=5)
print(summary)
sumyにはいくつかの要約オプションがあります。
今回はLSA,Lex-Rank,Text-Rankの3つを使ってみました。
正直LSAとかLex-Rankなど説明を読みましたがチンプンカンプンでした。
とりあえずこんなのも出来るんだよ、というサンプルですので興味がある方は別途調べていただければと思います。
実際に要約をした結果
今回も前回に続き、青空文庫よりカフカの「変身」を要約しました。
データは青空文庫よりダウンロード可能です。
要約した結果です。
プログラムのまま出力すると文が「<sentence:>」タグで括られて表示されます。
このブログの表示上sentence:を入れてしまうと表示がおかしくなるので除去していますがその点はご了承を
[Lex-Rank]
グレ ゴール !
グレ ゴール !
ところが 両親 は しばしば 、 妹 が グレ ゴール の 部屋 で 掃除 し て いる あいだ 、 二 人 で 彼 の 部屋 の 前 に 待ちかまえ て い て 、 妹 が 出 て くる やいなや 、 部屋 の なか が どんな 様子 で ある か 、 グレ ゴール が 何 を 食べ た か 、 その とき 彼 が どんな 態度 を 取っ た か 、 きっと ちょっと 快方 へ 向い て いる の が 見 られ た の で ない か 、 など と 語っ て 聞か せ なけれ ば なら なかっ た 。
実 の ところ 何 も 異常 な こと が 起っ て いる わけ で は ない 、 ただ 一つ 二つ の 家具 が 置き 変え られる だけ だ 、 と グレ ゴール は 何 度 か 自分 に 言い聞かせ た に も かかわら ず 、 彼 は まもなく みとめ ない わけ に は いか なく なっ た の だ が 、 この 女 たち の 出 たり 入っ たり 、 彼女ら の 小さな かけ声 、 床 の 上 で 家具 の きしむ 音 、 それら は まるで 四方 から 数 を 増し て いく 大 群集 の よう に 彼 に 働きかけ 、 頭 と 脚 と を しっかと ちぢめ て 身体 を 床 に ぴったり と つけ て い た けれども 、 おれ は もう こうした こと の すべて を 我慢 でき なく なる だろ う 、 と どうしても 自分 に 言い聞かせ ない で は い られ なく なっ た 。
それ は そう と し て も 、 これ が まだ 彼 の 父親 な の だろ う か 。
[LSA]
糸 の こ 細工 で も やっ て いれ ば 、 あの 子 に は もう 気ばら し な ん です から ね 。
残念 な こと に 、 歯 らしい もの が ない よう だっ た ―― なんで すぐ 鍵 を つかん だら いい の だろ う か ―― 。
自分 が 入っ て いく こと によって 、 母親 の そば に い なけれ ば なら ない 妹 を 追い立て たく は なかっ た 。
世間 が 貧しい 人びと から 要求 し て いる もの を 、 家族 の 者 たち は 極限 まで やり つくし た 。
しかし 、 きっと 何 週間 も そこ に い て み た ところ で 、 妹 が あらためる という こと は ない だろ う 。
[Text-Rank]
だが 、 また 同じ よう に 骨 を 折っ て 、 溜息 を もらし ながら 、 さっき の よう に 身体 を 横たえ 、 またもや 自分 の たくさん の 小さな 脚 が おそらく さっき より も いっそう ひどく 争い 合っ て いる の を ながめ 、 この 勝手 な 争い に 静けさ と 秩序 と を もちこむ こと が 不可能 だ と わかっ た とき に 、 もう ベッド の なか に とどまっ て いる こと は でき ない 、 たとい ベッド から 出 られる という 希望 が ほんの ちょっと しか ない に し て も 、 いっさい を 犠牲 に し て 出よ う と 試みる の が いちばん 賢明 な やり かた な の だ 、 と また 自分 に 言い聞かせ た 、 だが 同時に 、 やけ に なっ て 決心 する より も 冷静 に 、 きわめて 冷静 に 思いめぐらす ほう が ずっと いい の だ 、 と ときどき 思い出す こと を 忘れ なかっ た 。
わたし たち が 部屋 を すっかり 以前 の まま に し て おく よう に 努め 、 グレ ゴール が また わたし たち の ところ へ もどっ て き た とき に 、 なんにも 変っ て い ない こと を 見 て 、 それだけ たやすく それ まで の こと が 忘れ られる よう に し て おく こと が いちばん いい 、 と わたし は 思う よ 母親 の こうした 言葉 を 聞い て 、 直接 の 人間 的 な 話しかけ が 自分 に 欠け て いる こと が 、 家族 の あいだ の 単調 な 生活 と 結びつい て 、 この 二 カ月 の あいだ に すっかり 自分 の 頭 を 混乱 さ せ て しまっ た に ちがい ない 、 と グレ ゴール は 知っ た 。
文の要約方法で頻出単語を使うのか?などアプローチによって結果は当然異なるようです。
今回は小説を選びましたが、文章のタイプによって予約の精度は変わりますので、気になる方は試してみていただければと思います。
お役に立ったのなら幸いです。