janome(日本語)による用語抽出

モジュールをimport

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

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

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

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

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

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

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

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

In [4]:
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からLRを生成する

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

FrequencyとLRを組み合わせFLRの重要度を出す

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

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

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

In [10]:
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")
人工知能	6.0
知能	4.0
記述	3.0
アプローチ	3.0
人工	2.0
人間	2.0
研究	2.0
知性	2.0
実現	2.0
家庭用電気機械器具	1.7411011265922482
エキスパートシステム	1.681792830507429
制御システム	1.681792830507429
情報処理システム	1.681792830507429
ダートマス会議	1.5874010519681994
記号処理	1.5650845800732873
記号的明示性	1.4877378261644902
カーツワイル	1.4142135623730951
プログラミング言語	1.4142135623730951
計算機	1.4142135623730951
強化学習	1.4142135623730951
専門家	1.4142135623730951
言葉通り	1.4142135623730951
ゲームソフト	1.4142135623730951
日常語	1.4142135623730951
情報処理	1.4142135623730951
学習	1.4142135623730951
ファジィ理論	1.4142135623730951
思考ルーチン	1.4142135623730951
意味あい	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
ELIZA	1.0
ニューラルネットワーク	1.0
LISP	1.0
注目	1.0
サポートベクターマシン	1.0
脳	1.0
ジョン	1.0
プログラム	1.0
レイ	1.0
主体	1.0
実用	1.0
In [ ]: