情報(データ)からトレンドや単語の重要度をはかるのに
TF-IDF値が使われる
Scikit-LearnのTfidfVectorizerを使ってこれを求めます
詳しくは
Pythonで
動かして学ぶ
自然言語処理 入門
を購入して確認してください(笑い)
コード
import json
from sklearn.feature_extraction.text import TfidfVectorizer
import sqlite_data_store as datastore
from sklearn.feature_extraction.text import TfidfVectorizer
import sqlite_data_store as datastore
if __name__ == '__main__':
datastore.connect()
# 出現する単語原型を 空白区切りで『data』変数に格納
# doc_idと単語原型をセットで格納(後で呼び出すため)
data = []
doc_ids = []
for doc_id in datastore.get_all_ids(limit=-1):
data.append(' '.join(
[token['lemma'] for token in datastore.get_annotation(doc_id, 'token')]))
doc_ids.append(doc_id)
# scikit-learn の TfidfVectorizer で TF-IDF値を計算
# vectorizer.fit:引数『data』を元に各文書中のTFI-DF値を計算
# fit_transform:返り値はTFI-DFベクトル(すべての単語に個々のIDが与えられる)
# vecs変数:TFI-DFベクトルのリストが格納される(行列 matrixクラス)
# 出現頻度が全体の0.9以上の単語は重要ではないとし、無視する
vectorizer = TfidfVectorizer(analyzer='word', max_df=0.9)
vecs = vectorizer.fit_transform(data)
f = open('tfidf.txt', 'a')
for doc_id, vec in zip(doc_ids, vecs.toarray()):
meta_info = json.loads(datastore.get(doc_id, ['meta_info'])['meta_info'])
title = meta_info['title']
print(doc_id, title)
f.write(str(doc_id) + ' ' + title + '\n')
# TRI-DF値の高い順にソートする
for w_id, tfidf in sorted(enumerate(vec), key=lambda x: x[1], reverse=True)[:10]:
lemma = vectorizer.get_feature_names()[w_id]
print('\t{0:s}: {1:f}'.format(lemma, tfidf))
f.write('\t{0:s}: {1:f}'.format(lemma, tfidf)+'\n')
f.close()
datastore.close()
結果
datastore.connect()
# 出現する単語原型を 空白区切りで『data』変数に格納
# doc_idと単語原型をセットで格納(後で呼び出すため)
data = []
doc_ids = []
for doc_id in datastore.get_all_ids(limit=-1):
data.append(' '.join(
[token['lemma'] for token in datastore.get_annotation(doc_id, 'token')]))
doc_ids.append(doc_id)
# scikit-learn の TfidfVectorizer で TF-IDF値を計算
# vectorizer.fit:引数『data』を元に各文書中のTFI-DF値を計算
# fit_transform:返り値はTFI-DFベクトル(すべての単語に個々のIDが与えられる)
# vecs変数:TFI-DFベクトルのリストが格納される(行列 matrixクラス)
# 出現頻度が全体の0.9以上の単語は重要ではないとし、無視する
vectorizer = TfidfVectorizer(analyzer='word', max_df=0.9)
vecs = vectorizer.fit_transform(data)
f = open('tfidf.txt', 'a')
for doc_id, vec in zip(doc_ids, vecs.toarray()):
meta_info = json.loads(datastore.get(doc_id, ['meta_info'])['meta_info'])
title = meta_info['title']
print(doc_id, title)
f.write(str(doc_id) + ' ' + title + '\n')
# TRI-DF値の高い順にソートする
for w_id, tfidf in sorted(enumerate(vec), key=lambda x: x[1], reverse=True)[:10]:
lemma = vectorizer.get_feature_names()[w_id]
print('\t{0:s}: {1:f}'.format(lemma, tfidf))
f.write('\t{0:s}: {1:f}'.format(lemma, tfidf)+'\n')
f.close()
datastore.close()
結果
1 アイスランド
アイスランド: 0.859708
加盟: 0.101879
漁業: 0.100236
捕鯨: 0.087623
地熱: 0.082684
危機: 0.076366
温泉: 0.074057
火山: 0.071398
金融: 0.061700
海嶺: 0.055691
2 アイルランド
アイルランド: 0.928448
北アイルランド: 0.124943
イギリス: 0.076243
イングランド: 0.065400
ダブリン: 0.048990
アメリカ: 0.045905
植民: 0.044198
多く: 0.041342
ケルト: 0.039145
人気: 0.036696
3 アゼルバイジャン
アゼルバイジャン: 0.844359
バクー: 0.193584
アルメニア: 0.181395
カスピ海: 0.157323
ロシア: 0.110365
ワイン: 0.098482
イラン: 0.094433
共和: 0.090410
大統領: 0.066140
ソビエト: 0.064814
アイスランド: 0.859708
加盟: 0.101879
漁業: 0.100236
捕鯨: 0.087623
地熱: 0.082684
危機: 0.076366
温泉: 0.074057
火山: 0.071398
金融: 0.061700
海嶺: 0.055691
2 アイルランド
アイルランド: 0.928448
北アイルランド: 0.124943
イギリス: 0.076243
イングランド: 0.065400
ダブリン: 0.048990
アメリカ: 0.045905
植民: 0.044198
多く: 0.041342
ケルト: 0.039145
人気: 0.036696
3 アゼルバイジャン
アゼルバイジャン: 0.844359
バクー: 0.193584
アルメニア: 0.181395
カスピ海: 0.157323
ロシア: 0.110365
ワイン: 0.098482
イラン: 0.094433
共和: 0.090410
大統領: 0.066140
ソビエト: 0.064814