TF-IDF値 | python3Xのブログ

python3Xのブログ

ここでは40代、50代の方が日々の生活で役に立つ情報や私の趣味であるプログラム、Excelや科学に関する内容で投稿する予定です。

情報(データ)からトレンドや単語の重要度をはかるのに

TF-IDF値が使われる

Scikit-LearnのTfidfVectorizerを使ってこれを求めます

詳しくは

 

Pythonで

動かして学ぶ

自然言語処理 入門

 

を購入して確認してください(笑い)

 

コード

import json
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()
   結果
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