🌶️

pkeを使い日本語のキーフレーズ抽出を行う

2022/03/18に公開1

この記事は自ブログ記事の編集版です。

pkeとは

python keyphrase extraction
様々な手法のキーフレーズ抽出をサポートしていますが、特にspacyによる係り受け解析を行った上でのグラフベースの手法(TextRank等)が使えるのが強みです。

日本語対応について

2022/03/18時点で、GiNZAがインストールされていれば完全に無改造で動作するようになりました。それ以前ははじめての自然言語処理 pke によるキーフレーズ抽出 | オブジェクトの広場等の記事で示されるようなちょっとしたハックが必要でした。
ここ最近pke自体の更新が盛んなため、いろいろと変化が生じておりこの方法そのままでは動かなくなったり、そもそも小細工が不要な個所もできたりとした変化がありました。
PRを出したところ、完全に手を入れないで動くようになったので、その使い方について記載します。

使い方

前述の記事に倣ったコードを掲載します。

ext.py
import pke
# ベースコード: https://www.ogis-ri.co.jp/otc/hiroba/technical/similar-document-search/part5.html
# 引用元:「東京ディズニーランド」『フリー百科事典 ウィキペディア日本語版』。
# 最終更新 2019年9月29日 (日) 04:02 UTC、URL: https://ja.wikipedia.org
text = "東京ディズニーランド、英称:Tokyo Disneyland、略称:TDL)は、" +\
"千葉県浦安市舞浜にあるディズニーリゾートを形成する日本のディズニーパーク。" +\
"年間来場者数は日本最大の約1,600万人で、世界のテーマパーク・アミューズメントパークの中でも、" +\
"フロリダ州のウォルト・ディズニー・ワールド・リゾートのマジック・キングダム、カリフォルニア州の" +\
"ディズニーランド・リゾートのディズニーランド・パークに次いで世界3位の規模を誇る[1]。オリエンタルランド" +\
"がザ・ウォルト・ディズニー・カンパニーとのライセンス契約のもと運営している[3]。"
extractor = pke.unsupervised.MultipartiteRank()
# language='ja' とする
extractor.load_document(input=text, language='ja', normalization=None)
extractor.candidate_selection(pos={'NOUN', 'PROPN', 'ADJ', 'NUM'})
extractor.candidate_weighting(threshold=0.74, method='average', alpha=1.1)
print(extractor.get_n_best(10))

ポイント

language='ja' とすることで、spacyのモジュールで利用可能なものから'ja'で始まる最初のモデルを利用するようになっています。
ストップワードもspacy.lang以下にある言語で使えるものを自動的に選択するので特に何もする必要がなくなりました。

これもみなGiNZAのおかげです。

Discussion

manoa0404manoa0404

記事参考にさせていただきました。
No stoplist available in pke for 'ja' language.
とのワーニングがでますが、https://blog.foresta.me/posts/keyphrase-extract-with-pke/ のようにストップワードを明示するものとの違いについてお教えいただけないでしょうか。
ワーニングはでものの、ginzaが入っていればpkeが自動で日本語のストップワードを取得しているとの認識でよろしいでしょうか?(import ginzaも不要なのでしょうか)

また、extractor.load_documentにて以下のエラーが出ており、どのような対応するべきかわからずお教え頂ければ幸いです。
Exception: No downloaded spacy model for 'ja' language.
A list of downloadable spacy models is available at https://spacy.io/models.
Alternatively, preprocess your document as a list of sentence tuple (word, pos), such as:
[[('The', 'DET'), ('brown', 'ADJ'), ('fox', 'NOUN'), ('.', 'PUNCT')]]