「テキストを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の動作確認の説明でした。