【Python】テキスト自動要約が可能なsumyのインストール

【Python】テキスト自動要約が可能なsumyのインストール プログラミング

「テキストをPythonで自動要約したい」
「日本語の文章も自動要約の対象にしたい」

このような場合には、sumyを試してみてください。
100%完璧なモノは、無理でしょう。

でも、あなたが望むレベルに達している可能性もあります。
この文章では、簡単に試せるようにその手順を解説しています。

本記事の内容

  • sumyとは?
  • sumyのシステム要件
  • sumyのインストール
  • sumyの動作確認

それでは、上記に沿って解説していきます。

sumyとは?

sumyとは、自動要約が可能なPythonライブラリです。
sumyの対応言語は以下となります。

  • Chinese (Simplified)
  • Czech
  • English
  • French
  • German
  • Italian
  • Japanese
  • Portuguese
  • Slovak
  • Spanish

日本語が、サポートされています。
これだけで、試す価値は十分にあると言えます。

使い方としては、sumyはテキストをインプットすれば要約を行います。
その際、WebページのURLを指定することも可能です。
ページにアクセスして、そのページをテキストを自動で抽出します。

これは、スクレイピングとまでは言える代物ではないでしょう。
でも、便利な機能です。

また、sumyには二つの利用方法があります。

  • コマンドラインツール
  • Python API

そして、要約のアルゴリズムには次のモノが用意されています。

  • Luhn
  • Edmundson
  • LSA(Latent Semantic Analysis)
  • LexRank
  • TextRank
  • SumBasic
  • KL-Sum

一つ一つをここでは説明しません。
気になった場合は、Googleで検索してください。

とにかく、全部で7種類も存在することだけを覚えておいてください。
それだけ、選択肢がたくさんあるということです。

あと、要約した結果を評価する簡易評価ツールも備わっています。

以上、sumyの説明を行いました。
次は、sumyのシステム要件を確認します。

sumyのシステム要件

現時点(2021年10月)でのsumyの最新バージョンは、2.26.0となります。
この最新バージョンは、2019年5月19日にリリースされています。

sumyを日本語で動かすことが、この記事でのゴールとなります。
そのためのシステム要件としてのポイントは、以下。

  • OS
  • Pythonバージョン
  • Numpy
  • tinysegmenter

それぞれを下記で説明します。

OS

サポートOSに関しては、以下を含むクロスプラットフォーム対応です。

  • Windows
  • macOS
  • Linux

Pythonバージョン

サポート対象となるPythonのバージョンは、以下となります。

  • Python 2.7
  • Python 3.3
  • Python 3.4
  • Python 3.5
  • Python 3.6
  • Python 3.7

Python 3.8以降については、問題ありません。
以下のバージョンでも問題なく動いています。

>python -V 
Python 3.9.7

Numpy

LexRankを動かすために必要ということです。
事前にインストールしておきましょう。

Numpyについては、次の記事で解説しています。

tinysegmenter

日本語に対応するために、tinysegmenterを利用します。
分かち書きをスクリプトのみで行うようです。

本来であれば、Mecabなどを使うのが理想と言えます。
でも、ライブラリを追加するだけで日本語対応を実現してくれています。

開発者に感謝して、使わせてもらいましょう。
tinysegmenterのインストールは、次のコマンドで行います。

pip install tinysegmenter

なお、tinysegmenterは開発が止まっています。
tinysegmenter 0.4が、2018年9月16日にリリースされたのが最後です。

でも、Python 2.6以降(Python 3もOK)であれが問題ないとのことです。
実際、Python 3.9.7でも問題ありません。

以上、sumyのシステム要件を説明しました。
次は、sumyをインストールします。

sumyのインストール

まずは、現状のインストール済みパッケージを確認しておきます。
Numpyとtinysegmenterをインストールしただけの状況です。

>pip list 
Package       Version 
------------- ------- 
numpy         1.21.2 
pip           21.2.4 
setuptools    58.2.0 
tinysegmenter 0.4

次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。

python -m pip install --upgrade pip setuptools

では、sumyのインストールです。
sumyのインストールは、以下のコマンドとなります。

pip install sumy

インストールには、少しだけ時間がかかります。
では、どんなパッケージがインストールされたのかを確認しましょう。

 >pip list 
Package            Version 
------------------ --------- 
breadability       0.1.20 
certifi            2021.5.30 
chardet            4.0.0 
charset-normalizer 2.0.6 
click              8.0.1 
colorama           0.4.4 
docopt             0.6.2 
idna               3.2 
joblib             1.0.1 
lxml               4.6.3 
nltk               3.6.3 
numpy              1.21.2 
pip                21.2.4 
pycountry          20.7.3 
regex              2021.9.30 
requests           2.26.0 
setuptools         58.2.0 
sumy               0.8.1 
tinysegmenter      0.4 
tqdm               4.62.3 
urllib3            1.26.7

依存関係のあるパッケージが、インストールされています。
これだけパッケージが多いと、sumyは仮想環境での利用がおススメです。

Windowsであれば、PyCharmでプロジェクトを作るだけで仮想環境を利用できます。
もちろん、macOSやLinux(GUI)でもPyCharmの利用は可能です。

コマンドでも仮想環境を簡単に用意できます。

以上、sumyのインストールを説明しました。
最後は、sumyの動作確認を行います。

sumyの動作確認

sumyの動作確認は、以下のパターンで行います。

  • コマンドラインツール
  • Python API

それぞれを下記で説明します。

コマンドラインツール

ヘルプを見れば、だいたいわかります。

>sumy --help 
Sumy - automatic text summarizer. 
Usage: 
    sumy (luhn | edmundson | lsa | text-rank | lex-rank | sum-basic | kl) [--length=<length>] [--language=<lang>] [--stopwords=<file_path>] [--format=<format>] 
    sumy (luhn | edmundson | lsa | text-rank | lex-rank | sum-basic | kl) [--length=<length>] [--language=<lang>] [--stopwords=<file_path>] [--format=<format>] --url=<url> 
    sumy (luhn | edmundson | lsa | text-rank | lex-rank | sum-basic | kl) [--length=<length>] [--language=<lang>] [--stopwords=<file_path>] [--format=<format>] --file=<file_path> 
    sumy (luhn | edmundson | lsa | text-rank | lex-rank | sum-basic | kl) [--length=<length>] [--language=<lang>] [--stopwords=<file_path>] [--format=<format>] --text=<text> 
    sumy --version 
    sumy --help 
Options: 
    --length=<length>        Length of summarized text. It may be count of sentences 
                             or percentage of input text. [default: 20%] 
    --language=<lang>        Natural language of summarized text. [default: english] 
    --stopwords=<file_path>  Path to a file containing a list of stopwords. One word per line in UTF-8 encoding. 
                             If it's not provided default list of stop-words is used according to chosen language. 
    --format=<format>        Format of input document. Possible values: html, plaintext 
    --url=<url>              URL address of the web page to summarize. 
    --file=<file_path>       Path to the text file to summarize. 
    --text=<text>            Raw text to summarize 
    --version                Displays current application version. 
    --help                   Displays this text.

例えば、LexRankのアルゴリズムを利用する場合は以下のようになります。

sumy lex-rank --length=3 --language=japanese --url=https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%8C

上記を実行した結果は、以下。

>sumy lex-rank --length=3 --language=japanese --url=https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%8C 
イヌ科グループの他の動物と同様、イヌは基本的には肉食であるが、植物質を含むさまざまな食物にも、ある程度までは適応する。 
縄文時代 早期からの遺跡から犬( 縄文犬 )が出土しており、その一部は 埋葬 された状態で発見されているが、多数例は散乱状態で出ており、家族の一員として飼われた犬と、そうでない犬がいた 
と考えられる。 
(イヌの肉は数千年前から食用とされてきた。

この結果は、ウィキペディアにおける「イヌ」ページを3行で要約したモノです。

あと、sumy_evalコマンドで要約の評価も行うこともできます。
sumy コマンドと同じく、ヘルプが用意されています。

sumy_eval --help

Python API

sumyコマンドと同じ処理をコーディングしています。

from __future__ import absolute_import 
from __future__ import division, print_function, unicode_literals 
from sumy.parsers.html import HtmlParser 
from sumy.nlp.tokenizers import Tokenizer 
from sumy.summarizers.lex_rank import LexRankSummarizer as Summarizer 
from sumy.nlp.stemmers import Stemmer 
from sumy.utils import get_stop_words 

LANGUAGE = "japanese" 
SENTENCES_COUNT = 3 

if __name__ == "__main__": 
    url = "https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%8C" 
    parser = HtmlParser.from_url(url, Tokenizer(LANGUAGE)) 
    stemmer = Stemmer(LANGUAGE) 
    summarizer = Summarizer(stemmer) 
    summarizer.stop_words = get_stop_words(LANGUAGE) 
    for sentence in summarizer(parser.document, SENTENCES_COUNT): 
        print(sentence)

実行結果は、同じです。

以上、sumyの動作確認の説明でした。

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