Help us understand the problem. What is going on with this article?

sumyを使って青空文庫を要約してみる

sumyを使って青空文庫を要約してみる

TL;DR

テキスト要約モジュールであるsumyを使って青空文庫の書籍を要約してみました。

sumyを使う部分はけ日記 - Python: LexRankで日本語の記事を要約するを参考にさせていただきました。
同記事ではTokenizerにJanomeを使用していますが、今回はginza(spacy)を使用しています。

実行環境

  • Python 3.6.8
  • sumy 0.7.0
  • ginza(spacy) 1.0.2
  • beautifulsoup4 4.7.1

ソースコード

spacyのロード

import spacy

nlp = spacy.load('ja_ginza_nopn')

青空文庫のスクレイピング

from urllib import request
from bs4 import BeautifulSoup
import bs4

# urlに要約対象とする書籍のURLを指定します。以下は「だしの取り方 by 北大路魯山人」のURLです。
url = 'https://www.aozora.gr.jp/cards/001403/files/49986_37674.html'
html = request.urlopen(url)
soup = BeautifulSoup(html, 'html.parser')
body = soup.select('.main_text')
text = ''
for b in body[0]:
    if type(b) == bs4.element.NavigableString:
        text += b
        continue
    # ルビの場合、フリガナは対象にせずに、漢字のみ使用します。
    text += ''.join([e.text for e in b.find_all('rb')])

分析用コーパスの準備

活用などで表記が異なると違う単語として計算されてしまうため、分析用コーパスではレンマ化します。

corpus = []
originals = []
doc = nlp(text)
for s in doc.sents:
    originals.append(s)
    tokens = []
    for t in s:
        tokens.append(t.lemma_)
    corpus.append(' '.join(tokens))

print(len(corpus))
print(len(originals))

sumyによる要約

from sumy.parsers.plaintext import PlaintextParser
from sumy.nlp.tokenizers import Tokenizer
from sumy.summarizers.lex_rank import LexRankSummarizer

# 連結したcorpusを再度tinysegmenterでトークナイズさせる
parser = PlaintextParser.from_string(''.join(corpus), Tokenizer('japanese'))

summarizer = LexRankSummarizer()
summarizer.stop_words = [' ']  # スペースも1単語として認識されるため、ストップワードにすることで除外する

# sentencres_countに要約後の文の数を指定します。
summary = summarizer(document=parser.document, sentences_count=3)

# 元の文を表示
for sentence in summary:
    print(originals[corpus.index(sentence.__str__())])

まとめ

だしの取り方 by 北大路魯山人を3行で要約すると以下のようになりました。良いだしを取るためには、鉋(かんな)から準備しましょう。

どんなふうに削ったのがいいだしになるかというと、削ったかつおぶしがまるで雁皮紙のごとく薄く、ガラスのように光沢のあるものでなければならない。
現在、鉋でかつおぶしを削っているのは料理屋のみであって、たいがいは道具もなくて我慢しているようである。
鉋があっても、切れない場合が多いし、それを使用して削れないと思うくらいなら、日本料理をやめた方がいい。

蜘蛛の糸 by 芥川龍之介の場合は以下のとおりです。

陀多は両手を蜘蛛の糸にからみながら、ここへ来てから何年にも出した事のない声で、「しめた。
ところがふと気がつきますと、蜘蛛の糸の下の方には、数限もない罪人たちが、自分ののぼった後をつけて、まるで蟻の行列のように、やはり上へ上へ一心によじのぼって来るではございませんか。
が、そう云う中にも、罪人たちは何百となく何千となく、まっ暗な血の池の底から、うようよと這い上って、細く光っている蜘蛛の糸を、一列になりながら、せっせとのぼって参ります。

参考文献

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away