今回はPython3の自動要約ライブラリであるpysummarizationを使って実際にテキストを処理してみたいと思います。
因みに「要約」とは
だそうです。
pysummarizationは、自然言語処理とニューラルネットワーク言語モデルを使用しており、 ドキュメントやWebスクレイピングしたテキストの重要なポイントを含む概要を作成できるとの事です。
詳しくは公式ドキュメントの方へ
バックエンドでは、深層学習(ディープラーニング)ライブラリのpydbmが使用されており、RNNの改良版LSTMに基づくエンコーダー/デコーダーを実装しています。
日本語のテキストを扱う場合は、pysummarizationとは別にモジュールをインストールする必要があるので、まずは準備から行っていきます。
実行環境 |
---|
Windows Subsystem for Linux |
Python 3.6.8 |
pip 9.0.1 |
使用ライブラリ | ライセンス |
---|---|
pysummarization | GNU General Public License v2 (GPLv2) (GPL2) |
numpy | OSI Approved (new BSD) |
libmecab-dev | ? |
mecab-ipadic-utf8 | ? |
mecab-python3 | BSD |
まずは本体のpysummarizationをインストールします。
$ pip3 install pysummarization
するとpysummarizationの依存関係にあるソフトも一緒にインストールされます。
すでにNumpyをインストールされている方は、バージョンを1.13.3以降にアップグレードしてください。
そして日本語のテキストを扱う為にmecab-python3をpipでインストールします。
その前に、mecab-python3を使用するために必要なモジュールをインストールしておきます。でないと「Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-dbw_g1lo/mecab-python3/」というエラーに遭遇してしまいます。
$ sudo apt install libmecab-dev
$ sudo apt install mecab mecab-ipadic-utf8
$ pip3 install mecab-python3==0.7
MeCab(メカブ)の実装についてはこちら「【Python】形態素解析器のMeCabを使って自然言語処理の実装」をご参照ください。
ではさっそく実装していきたいと思います。
まずは必要なモジュールをインポートします。
from pysummarization.nlpbase.auto_abstractor import AutoAbstractor
from pysummarization.tokenizabledoc.mecab_tokenizer import MeCabTokenizer
from pysummarization.abstractabledoc.top_n_rank_abstractor import TopNRankAbstractor
自動要約する文字列を準備します。
使用した文字列は、Wikipedia:自然言語の1部です。
document = '人間がお互いにコミュニケーションを行うための自然発生的な言語である。「自然言語」に対置される語に「形式言語」「人工言語」がある。形式言語との対比では、その構文や意味が明確に揺るぎなく定められ利用者に厳格な規則の遵守を強いる(ことが多い)形式言語に対し、話者集団の社会的文脈に沿った曖昧な規則が存在していると考えられるものが自然言語である。自然言語には、規則が曖昧であるがゆえに、話者による規則の解釈の自由度が残されており、話者が直面した状況に応じて規則の解釈を変化させることで、状況を共有する他の話者とのコミュニケーションを継続する事が可能となっている。'
機能を呼び出し、文字列の入った変数を渡し呼び出します。
# 自動要約のオブジェクト
auto_abstractor = AutoAbstractor()
# 日本語のトークナイザーを設定
auto_abstractor.tokenizable_doc = MeCabTokenizer()
# 文のリストを作成するための区切り文字を設定
auto_abstractor.delimiter_list = ["。", "\n"]
# キュメントを抽象化およびフィルタリングするオブジェクト
abstractable_doc = TopNRankAbstractor()
# 変数を渡し文書を要約
result_dict = auto_abstractor.summarize(document, abstractable_doc)
"""result_dictは辞書型となっています。
dict{
"summarize_result": "要約された文のリスト。",
"scoring_data": "スコアのリスト(重要度のランク)。"
}
"""
# 出力
for sentence in result_dict["summarize_result"]:
print(sentence)
「実行結果」
’’’
人間がお互いにコミュニケーションを行うための自然発生的な言語である。
「自然言語」に対置される語に「形式言語」「人工言語」がある。
形式言語との対比では、その構文や意味が明確に揺るぎなく定められ利用者に厳格な規則の遵守を強いる(ことが多い)形式言語に対し、話者集団の社会的文脈に沿った曖昧な規則が存在していると考えられるものが自然言語である。
自然言語には、規則が曖昧であるがゆえに、話者による規則の解釈の自由度が残されており、話者が直面した状況に応じて規則の解釈を変化させることで、状況を共有する他の話者とのコミュニケーションを継続する事が可能となっている。
'''
「入力した文章」
’’’
人間がお互いにコミュニケーションを行うための自然発生的な言語である。「自然言語」に対置される語に「形式言語」「人工言語」がある。形式言語との対比では、その構文や意味が明確に揺るぎなく定められ利用者に厳格な規則の遵守を強いる(ことが多い)形式言語に対し、話者集団の社会的文脈に沿った曖昧な規則が存在していると考えられるものが自然言語である。自然言語には、規則が曖昧であるがゆえに、話者による規則の解釈の自由度が残されており、話者が直面した状況に応じて規則の解釈を変化させることで、状況を共有する他の話者とのコミュニケーションを継続する事が可能となっている。
’’’
「......」
見比べてみると、「。」でインデントされテキストが読みやすくなったかのように思えます。
pysummarizationには幾つか便利な機能が公式ドキュメントで紹介されていて、その中の1つを実装してみたいと思います。
SimilarityFilter機能は、文章内にある文字列に対し類似性の尺度を使って計算し冗長な文章などを短くまとめます。
類似性の尺度を使った計算とは、訓練データを丸暗記学習し新しいデータが与えられたときに、学習したデータからもっとも近いもの見つけてそれを利用して予測をするインスタンスベース学習と言われている。
このSimilarityFilter機能には幾つか種類がありますが、公式ドキュメントでも紹介されている機能を1つ試してみます。
先ほど実装したコードに幾つか追加していきます。
from pysummarization.nlpbase.auto_abstractor import AutoAbstractor
from pysummarization.tokenizabledoc.mecab_tokenizer import MeCabTokenizer
from pysummarization.abstractabledoc.top_n_rank_abstractor import TopNRankAbstractor
"""追加"""
from pysummarization.nlp_base import NlpBase
from pysummarization.similarityfilter.tfidf_cosine import TfIdfCosine
日本語トークナイザなどをインスタンス化します。
# NLPのオブジェクト
nlp_base = NlpBase()
# トークナイザーを設定します。 これは、MeCabを使用した日本語のトークナイザーです
nlp_base.tokenizable_doc = MeCabTokenizer()
SimilarityFilter機能をインスタンス化し、カットオフしきい値を設定します。
# 「類似性フィルター」のオブジェクト。
このオブジェクトによって観察される類似性は、Tf-Idfベクトルのいわゆるコサイン類似性です
similarity_filter = TfIdfCosine()
# NLPのオブジェクトを設定します
similarity_filter.nlp_base = nlp_base
# 類似性がこの値を超えると、文は切り捨てられます
similarity_filter.similarity_limit = 0.25
文章をセットします。
先ほど実装したテキストでどれくらいの違いが出るか試してみます。
Wikipedia:自然言語の1部です。
document = '人間がお互いにコミュニケーションを行うための自然発生的な言語である。「自然言語」に対置される語に「形式言語」「人工言語」がある。形式言語との対比では、その構文や意味が明確に揺るぎなく定められ利用者に厳格な規則の遵守を強いる(ことが多い)形式言語に対し、話者集団の社会的文脈に沿った曖昧な規則が存在していると考えられるものが自然言語である。自然言語には、規則が曖昧であるがゆえに、話者による規則の解釈の自由度が残されており、話者が直面した状況に応じて規則の解釈を変化させることで、状況を共有する他の話者とのコミュニケーションを継続する事が可能となっている。'
先ほどの実装と同じ要領で機能を呼び出し出力します。
# 自動要約のオブジェクト
auto_abstractor = AutoAbstractor()
# トークナイザーを設定します。 これは、MeCabを使用した日本語のトークナイザーです
auto_abstractor.tokenizable_doc = MeCabTokenizer()
# ドキュメントを抽象化およびフィルタリングするオブジェクト
abstractable_doc = TopNRankAbstractor()
# オブジェクトを委任し、要約を実行します
# similarity_filter機能追加
result_dict = auto_abstractor.summarize(document, abstractable_doc, similarity_filter)
# 出力
for sentence in result_dict["summarize_result"]:
print(sentence)
「実行結果」
’’’
人間がお互いにコミュニケーションを行うための自然発生的な言語である。
自然言語には、規則が曖昧であるがゆえに、話者による規則の解釈の自由度が残されており、話者が直面した状況に応じて規則の解釈を変化させることで、状況を共有する他の話者とのコミュニケーションを継続する事が可能となっている。
’’’
「入力した文章」
'''
'人間がお互いにコミュニケーションを行うための自然発生的な言語である。「自然言語」に対置される語に「形式言語」「人工言語」がある。形式言語との対比では、その構文や意味が明確に揺るぎなく定められ利用者に厳格な規則の遵守を強いる(ことが多い)形式言語に対し、話者集団の社会的文脈に沿った曖昧な規則が存在していると考えられるものが自然言語である。自然言語には、規則が曖昧であるがゆえに、話者による規則の解釈の自由度が残されており、話者が直面した状況に応じて規則の解釈を変化させることで、状況を共有する他の話者とのコミュニケーションを継続する事が可能となっている。'
'''
こちらのsimilarity_filter機能を使った実装では、ちゃんと要約されていて分かりやすい内容になっていますね。
他にも、Webスクレイピングを行いテキストを要約機能などがあるので余力のある方は試してみてください。
この自動要約ライブラリのpysummarizationをどのようにしてシステムに組み込んでいくか、想像が止まりません!
このような便利なライブラリに感謝したいと思います。
それでは以上になります。
最後までご覧いただきありがとうございました。