TF*IDFによる用語重要度 【janome(日本語)による用語抽出を例に】

モジュールをimport

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

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

Step1 DF情報を蓄積

1-1. dbmとjanomeの用意

In [6]:
import dbm
DF = dbm.open("df", "n")

from janome.tokenizer import Tokenizer
t = Tokenizer()

1-2. 処理対象ファイル群を読み込み

入力テキスト例は以下の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 [7]:
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_df(frequency, dbm=DF)
DF.close()

Step2 個々のファイルのTF*IDFをもとめる

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. FrequencyをTFに変換

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

2-3. 蓄積したDF情報からIDFを呼び出し

In [10]:
DF = dbm.open("df", "r")
idf = termextract.core.get_idf(frequency, dbm=DF)
DF.close()

2-4. 重要度をTFとIDFの組み合わせで計算

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