「文章からキーフレーズを抽出したい」
キーフレーズは、文章におけるキーとなるフレーズのことです。
キーフレーズがわかれば、その文章を読む必要すらないかもしれません。
そして、pkeを使えば文章から簡単にキーフレーズと抽出できます。
この記事では、pkeの導入方法をわかりやすく解説しています。
本記事の内容
- pkeとは?
- pkeのシステム要件
- pkeのインストール
- pkeの動作確認
それでは、上記に沿って解説していきます。
pkeとは?
pke公式
https://github.com/boudinfl/pke
pkeとは、Pythonで開発されたキーフレーズ抽出ツールキットです。
公式には、このように記載されています。
ツールキットと書かれていますが、ライブラリに過ぎません。
何らかのソフトウェアというモノではありません。
では、キーフレーズの抽出とは、一体どういうことでしょうか?
文章から、その文章内で重要と思われる単語の組み合わせを抜き出すことです。
単語の組み合わせというのが、ポイントになります。
単語だけなら、キーフレーズではなく、キーワードと表現しますので。
以上、pkeについての説明でした。
次は、pkeのシステム要件を確認します。
pkeのシステム要件
この記事では、Windowsでpkeを動かすことを想定しています。
かつ、日本語が対象言語です。
上記条件の場合、pkeのシステム要件は結構複雑になります。
でも、安心してください。
次のポイントに分けて、一つづつ説明していきます。
- OS
- Python
- NLTK
- GiNZA
- git
それぞれを下記で説明します。
OS
公式ページでは、特に指定はありません。
ソースを見る限り、以下のOSを含むクロスプラットフォーム対応だと思われます。
- Windows
- macOS
- Linux
要は、Pythonが動けば基本的には問題ないのでしょう。
Python
Pythonのバージョンについてです。
公式では、Python 3.6以降のみが対象と記述されています。
検証した環境は、以下のPythonを利用しています。
>python -V Python 3.9.6
なお、Pythonのアップグレードが必要な場合は次の記事が参考になります。
NLTK
pkeの主な機能は、文章からキーフレーズを抽出することです。
この機能は、自然言語処理が技術基盤となっています。
具体的には、その技術基盤はNLTKです。
つまり、pkeはNLTKに自然言語処理を依存しています。
そうなると、もちろんNLTKのインストールが必要となります。
NLTKについては、以下の記事でまとめています。
GiNZA
pkeには、文章からキーフレーズを抽出する仕組みが備わっています。
重要度を判定するロジックやモデルは用意されているということです。
ただし、文章を意味のあるフレーズに分けるようなことをpke単独ではできません。
文章を理解することが、pke単独は不可ということです。
だからこそ、次のようにモデルをダウンロードしています。
python -m spacy download en
上記は、英語の場合の話です。
日本語を対象とするなら、上記では意味がありません。
日本語の文章を理解するためのモデルが必要になります。
そのモデルとなるのが、GiNZAということです。
GiNZAについては、下記の記事で解説しています。
git
pkeの動き自体には、直接は関係ありません。
その意味では、システム要件とは言えません。
しかし、pkeのインストールの際に必要となります。
gitコマンドを利用しない場合、インストールはかなり面倒です。
そのため、gitはシステム要件と言えるレベルで必要なモノだと認識しています。
Windowsの場合は、次の記事が参考になります。
まとめ
次の3つは、事前にインストールしておきます。
- NLTK
- GiNZA
- git
Pythonは、必要ならアップグレードしましょう。
以上、pkeのシステム要件を説明しました。
次は、pkeのインストールを行っていきます。
pkeのインストール
まずは、現状のインストール済みパッケージを確認しておきます。
NLTKとGiNZAをインストールした状態です。
>pip list Package Version ------------------ --------- blis 0.7.4 catalogue 1.0.0 certifi 2021.5.30 charset-normalizer 2.0.3 click 8.0.1 colorama 0.4.4 cymem 2.0.5 Cython 0.29.24 dartsclone 0.9.0 ginza 4.0.6 idna 3.2 ja-ginza 4.0.0 joblib 1.0.1 murmurhash 1.0.5 nltk 3.6.2 numpy 1.21.1 pip 21.1.3 plac 1.1.3 preshed 3.0.5 regex 2021.7.6 requests 2.26.0 setuptools 57.4.0 sortedcontainers 2.1.0 spacy 2.3.7 srsly 1.0.5 SudachiDict-core 20210608 SudachiPy 0.5.2 thinc 7.4.5 tqdm 4.61.2 urllib3 1.26.6 wasabi 0.8.2
次にするべきことは、pipとsetuptoolsの更新です。
pipコマンドを使う場合、常に以下のコマンドを実行しておきましょう。
python -m pip install --upgrade pip setuptools
では、pkeのインストールです。
pkeのインストールは、以下のコマンドとなります。
pip install git+https://github.com/boudinfl/pke.git
上記は、gitコマンドが使えないとエラーになります。
エラーというか、動きません。
gitを使わずに自らダウンロードする方法でも、何とかなるとは思います。
でも、大変なのでgitを使う方法をおススメします。
インストールは、少し時間がかかります。
では、どんなパッケージがインストールされたのかを確認しましょう。
>pip list Package Version ------------------ --------- blis 0.7.4 catalogue 1.0.0 certifi 2021.5.30 charset-normalizer 2.0.3 click 8.0.1 colorama 0.4.4 cymem 2.0.5 Cython 0.29.24 dartsclone 0.9.0 decorator 4.4.2 future 0.18.2 ginza 4.0.6 idna 3.2 ja-ginza 4.0.0 joblib 1.0.1 murmurhash 1.0.5 networkx 2.5.1 nltk 3.6.2 numpy 1.21.1 pip 21.1.3 pke 1.8.1 plac 1.1.3 preshed 3.0.5 regex 2021.7.6 requests 2.26.0 scikit-learn 0.24.2 scipy 1.7.0 setuptools 57.4.0 six 1.16.0 sklearn 0.0 sortedcontainers 2.1.0 spacy 2.3.7 srsly 1.0.5 SudachiDict-core 20210608 SudachiPy 0.5.2 thinc 7.4.5 threadpoolctl 2.2.0 tqdm 4.61.2 Unidecode 1.2.0 urllib3 1.26.6 wasabi 0.8.2
GiNZAと被るモノが多いですけど、多くのパッケージがインストールされています。
それだけ、依存関係のあるパッケージが多いということです。
以上、pkeのインストールについて説明しました。
次は、pkeの動作確認を行います。
pkeの動作確認
pkeの動作確認を行っていきます。
日本語の文章からキーフレーズを抽出します。
その日本語の文章は、次の文章を利用します。
Wikipeidaにおける「人工知能」の内容ですね。
https://github.com/zhaolins/pytermextract/blob/master/test_data/jpn_sample.txt
別に上記ではなく、各自で用意しても問題ありません。
動作確認のコードは、以下。
import nltk import pke from spacy.lang.ja import stop_words # ファイルパス file_path = "jpn_sample.txt" # 日本語のストップワードを設定 pke.base.lang_stopwords['ja_ginza'] = 'japanese' # テキストの読み込み with open(file_path, "r", encoding="utf-8") as f: text = f.read() # NLTKの処理 stopwords = list(stop_words.STOP_WORDS) nltk.corpus.stopwords.words_org = nltk.corpus.stopwords.words nltk.corpus.stopwords.words = lambda lang: stopwords if lang == 'japanese' else nltk.corpus.stopwords.words_org( lang) # pkeの処理 extractor = pke.unsupervised.MultipartiteRank() extractor.load_document(input=text, language='ja_ginza', normalization=None) extractor.candidate_selection(pos={'NOUN', 'PROPN', 'ADJ', 'NUM'}) extractor.candidate_weighting(threshold=0.74, method='average', alpha=1.1) # 結果表示(上位10) result = extractor.get_n_best(n=10) for value in result: print(value)
関数の詳細については、興味があれば調べてみてください。
上記のコードでは、デフォルト設定で関数を利用しています。
上記コードを実行した結果は、以下。
('人工知能', 0.05920867252136012) ('制御 システム', 0.023386849284969854) ('プログラム', 0.013486591500444529) ('ニューラル ネットワーク', 0.013422099409278054) ('正統派 ai', 0.011133000860612701) ('エキスパートシステム', 0.009982741982686345) ('アメリカ 海軍', 0.008670147955263333) ('チェス 専用 コンピュータ', 0.007800344998519274) ('システム', 0.00770803561639657) ('プログラミング 言語 lisp', 0.007085620344493909)
人工知能に関するキーフレーズ(1語だけでもフレーズと言える)が、抽出されています。
確かに、上記のフレーズは重要なモノという印象は受けます。
重要度が数値で表示されているのは、文章の理解に役立ちます。
キーフレーズの羅列だけで、ちょっとした要約になりますからね。
以上、pkeの動作確認についての説明でした。