LR情報の蓄積と利用【janome(日本語)による用語抽出を例に】

モジュールをimport

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

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

Step1 LR情報の蓄積

1-1. dbmとjanomeの用意

In [3]:
import dbm
DB = dbm.open("store-lr", "n")

from janome.tokenizer import Tokenizer
t = Tokenizer()

1-2. LR情報蓄積対象ファイルを読み込み

入力テキスト例は以下のWikipedia記事からそれぞれ抜粋。

 「人工知能」( https://ja.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%9F%A5%E8%83%BD ) / 「自然言語処理」( https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86 ) / 「専門用語」( https://ja.wikipedia.org/wiki/%E5%B0%82%E9%96%80%E7%94%A8%E8%AA%9E )

In [5]:
input_files = ["jpn_sample_s.txt", "jpn_sample2_s.txt", "jpn_sample3_s.txt"]
for file in input_files:
    f = open(file, "r", encoding="utf-8")
    text = f.read()
    f.close()
    tokenize_text = t.tokenize(text)
    frequency = termextract.janome.cmp_noun_dict(tokenize_text)
    termextract.core.store_lr(frequency, dbm=db)
DB.close()

Step2 蓄積したLR情報を使って重要度計算を行う

2-1. 専門用語抽出対象の文書を読み込み

入力テキストにはStep1で使用した「人工知能」記事を使用

In [8]:
f = open("jpn_sample_s.txt", "r", encoding="utf-8")
text = f.read()
f.close()
tokenize_text = t.tokenize(text)
frequency = termextract.janome.cmp_noun_dict(tokenize_text)
pprint(frequency)
{'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}

2-2. 蓄積したLR情報をベースにLR重要度を計算

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

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

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

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

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

In [11]:
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")
人工知能	7.937253933193772
知能	5.291502622129181
プログラミング言語	5.07432619952319
記号処理	3.5840246342157207
記述	3.0
アプローチ	3.0
記号的明示性	2.9617652193647284
人工	2.6457513110645907
家庭用電気機械器具	2.4082246852806923
専門家	2.1406951429280725
情報処理システム	2.1406951429280725
エキスパートシステム	2.1406951429280725
制御システム	2.1406951429280725
ダートマス会議	2.080083823051904
知性	2.0
実現	2.0
人間	2.0
研究	2.0
日常語	1.7320508075688772
言葉通り	1.7320508075688772
計算機	1.7320508075688772
思考ルーチン	1.7320508075688772
学習	1.7320508075688772
実用	1.7320508075688772
情報処理	1.7320508075688772
ファジィ理論	1.7320508075688772
ゲームソフト	1.7320508075688772
カーツワイル	1.7320508075688772
強化学習	1.7320508075688772
引き合い	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
サポートベクターマシン	1.0
役割	1.0
形質	1.0
気	1.0
LISP	1.0
経験	1.0
宇宙	1.0
常識	1.0
ELIZA	1.0
手法	1.0
In [ ]: