janome(日本語)のパープレキシティによる用語抽出

モジュールをimport

In [6]:
import termextract.janome
import termextract.core

from pprint import pprint # このサンプルでの処理結果の整形表示のため

日本語のプレインテキストを読み込み

テキストはWikipediaの「人工知能」記事( https://ja.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD )から抜粋

In [7]:
f = open("jpn_sample_s.txt", "r", encoding="utf-8")
text = f.read()
f.close
print(text)
「人工知能」という名前は1956年にダートマス会議でジョン・マッカーシーにより命名された。現在では、記号処理を用いた知能の記述を主体とする情報処理や研究でのアプローチという意味あいでも使われている。日常語としての「人工知能」という呼び名は非常に曖昧なものになっており、多少気の利いた家庭用電気機械器具の制御システムやゲームソフトの思考ルーチンなどがこう呼ばれることもある。

プログラミング言語 LISP による「ELIZA」というカウンセラーを模倣したプログラムがしばしば引き合いに出されるが(人工無脳)、計算機に人間の専門家の役割をさせようという「エキスパートシステム」と呼ばれる研究・情報処理システムの実現は、人間が暗黙に持つ常識の記述が問題となり、実用への利用が困難視されている現状がある。

人工的な知能の実現へのアプローチとしては、「ファジィ理論」や「ニューラルネットワーク」などのようなアプローチも知られているが、従来の人工知能[1]との差は記述の記号的明示性にあると言えよう。近年では「サポートベクターマシン」が注目を集めた。また、自らの経験を元に学習を行う強化学習という手法もある。

「この宇宙において、知性とは最も強力な形質である」(レイ・カーツワイル)という言葉通り、知性を機械的に表現し実装するということは極めて重要な作業であると言える。

janome (日本語の形態素解析器)で日本語処理

事前にjanomeのインストールが必要

In [8]:
from janome.tokenizer import Tokenizer
t = Tokenizer()
tokenize_text = t.tokenize(text)

複合語抽出処理(ディクショナリとリストの両方可)

In [9]:
frequency = termextract.janome.cmp_noun_dict(tokenize_text)
pprint(frequency)

#erm_list = termextract.janome.cmp_noun_list(tokenize_text)
#pprint(term_list)
{'ELIZA': 1,
 'LISP': 1,
 'アプローチ': 3,
 'エキスパート システム': 1,
 'カウンセラー': 1,
 'カーツ ワイル': 1,
 'ゲーム ソフト': 1,
 'サポートベクターマシン': 1,
 'ジョン': 1,
 'ダート マス 会議': 1,
 'ニューラルネットワーク': 1,
 'ファジィ 理論': 1,
 'プログラミング 言語': 1,
 'プログラム': 1,
 'マッカーシー': 1,
 'レイ': 1,
 '主体': 1,
 '人工': 1,
 '人工 知能': 3,
 '人間': 2,
 '作業': 1,
 '元': 1,
 '利用': 1,
 '制御 システム': 1,
 '名前': 1,
 '呼び名': 1,
 '学習': 1,
 '宇宙': 1,
 '実現': 2,
 '実用': 1,
 '家庭 用 電気 機械 器具': 1,
 '専門 家': 1,
 '差': 1,
 '常識': 1,
 '引き合い': 1,
 '強化 学習': 1,
 '形質': 1,
 '役割': 1,
 '思考 ルーチン': 1,
 '情報処理': 1,
 '情報処理 システム': 1,
 '意味あい': 1,
 '手法': 1,
 '日常 語': 1,
 '暗黙': 1,
 '気': 1,
 '注目': 1,
 '現状': 1,
 '知性': 2,
 '知能': 2,
 '研究': 2,
 '経験': 1,
 '脳': 1,
 '言葉 通り': 1,
 '計算 機': 1,
 '記号 処理': 1,
 '記号 的 明示 性': 1,
 '記述': 3}

Frequencyからパープレキシティ重要度を生成する

In [11]:
term_imp = termextract.core.score_pp(
    frequency,
    ignore_words=termextract.mecab.IGNORE_WORDS,
    average_rate=1)
pprint(term_imp)
{'ELIZA': 1.0,
 'LISP': 1.0,
 'アプローチ': 2.0,
 'エキスパート システム': 1.5,
 'カウンセラー': 1.0,
 'カーツ ワイル': 1.25,
 'ゲーム ソフト': 1.25,
 'サポートベクターマシン': 1.0,
 'ジョン': 1.0,
 'ダート マス 会議': 1.3333333333333333,
 'ニューラルネットワーク': 1.0,
 'ファジィ 理論': 1.25,
 'プログラミング 言語': 1.25,
 'プログラム': 1.0,
 'マッカーシー': 1.0,
 'レイ': 1.0,
 '主体': 1.0,
 '人工': 1.25,
 '人工 知能': 2.25,
 '人間': 1.5849625007211563,
 '作業': 1.0,
 '元': 1.0,
 '利用': 1.0,
 '制御 システム': 1.5,
 '名前': 1.0,
 '呼び名': 1.0,
 '学習': 1.25,
 '宇宙': 1.0,
 '実現': 1.5849625007211563,
 '実用': 1.0,
 '家庭 用 電気 機械 器具': 1.4,
 '専門 家': 1.25,
 '差': 1.0,
 '常識': 1.0,
 '引き合い': 1.0,
 '強化 学習': 1.25,
 '形質': 1.0,
 '役割': 1.0,
 '思考 ルーチン': 1.25,
 '情報処理': 1.25,
 '情報処理 システム': 1.5,
 '意味あい': 1.0,
 '手法': 1.0,
 '日常 語': 1.25,
 '暗黙': 1.0,
 '気': 1.0,
 '注目': 1.0,
 '現状': 1.0,
 '知性': 1.5849625007211563,
 '知能': 1.8349625007211563,
 '研究': 1.5849625007211563,
 '経験': 1.0,
 '脳': 1.0,
 '言葉 通り': 1.25,
 '計算 機': 1.25,
 '記号 処理': 1.3891604167868592,
 '記号 的 明示 性': 1.3195802083934298,
 '記述': 2.0}

collectionsを使って重要度が高い順に表示

膠着言語の場合は、termextract.core.modify_agglutinative_lang()で整形をする

In [12]:
import collections
data_collection = collections.Counter(term_imp)
for cmp_noun, value in data_collection.most_common():
    print(termextract.core.modify_agglutinative_lang(cmp_noun), value, sep="\t")
人工知能	2.25
記述	2.0
アプローチ	2.0
知能	1.8349625007211563
知性	1.5849625007211563
実現	1.5849625007211563
人間	1.5849625007211563
研究	1.5849625007211563
エキスパートシステム	1.5
情報処理システム	1.5
制御システム	1.5
家庭用電気機械器具	1.4
記号処理	1.3891604167868592
ダートマス会議	1.3333333333333333
記号的明示性	1.3195802083934298
ゲームソフト	1.25
思考ルーチン	1.25
言葉通り	1.25
ファジィ理論	1.25
計算機	1.25
情報処理	1.25
プログラミング言語	1.25
カーツワイル	1.25
人工	1.25
日常語	1.25
強化学習	1.25
学習	1.25
専門家	1.25
常識	1.0
脳	1.0
ELIZA	1.0
役割	1.0
利用	1.0
手法	1.0
レイ	1.0
現状	1.0
サポートベクターマシン	1.0
実用	1.0
名前	1.0
差	1.0
気	1.0
経験	1.0
暗黙	1.0
ニューラルネットワーク	1.0
プログラム	1.0
呼び名	1.0
ジョン	1.0
宇宙	1.0
マッカーシー	1.0
LISP	1.0
引き合い	1.0
主体	1.0
注目	1.0
意味あい	1.0
作業	1.0
元	1.0
形質	1.0
カウンセラー	1.0
In [ ]: