人気ブログランキング | 話題のタグを見る
tf-idfで文章の重み付けをする
■説明
MeCabで形態素解析を行い、文章中に含まれる名詞にかんしてtf-idfで重み付けをする。
nltk.TextCollection() を用いることで計算はおこなえる。

tf: Term Frequency 単語出現頻度
 文章jにおける単語iの出現回数 / 全文章で出現する総単語数

idf: Inverse Document Frequency 逆文章頻度
log(総ドキュメント数/単語iを含むドキュメント数)

tf-idf : tf * idf
 idfを逆数で取得しているのは、他の文章でよく使われる単語は、特定の文章の特徴をあらわすことにならないことを現している。
 つまり、他の文章で使われなくて、調査対象の文章でよく使われる単語は重くなる。

■コード

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import MeCab
import nltk
from collections import defaultdict
mecab = MeCab.Tagger("")

class tf_idf_result:
def __init__(self,doc):
self.text = ''.join(doc)
self.term_scores = defaultdict(int)

def set_score(self,term,score):
self.term_scores[term] = score

def get_tokens(text):
"""
テキストから単語のリストを取得する
text:UTF-8の文章
return 単語のリスト
"""
node = mecab.parseToNode(text)
words = []
while node:
fs = node.feature.split(",")
if (node.surface is not None) and node.surface != "" and fs[0] in [u'名詞']:
words.append(node.surface)
node = node.next
return words


all_text = [u'ここはまりさのゆっくりプレイスなのぜ!痛いめにあいたくなかったら、ゆっくりできない糞人間はあまあまをおいてさっさと出ていくのぜ!',
u'我輩は、まりさである。お飾りはない。どこで生まれたかも見当もつかぬ。なんでもゆっくりプレイスで「ゆんやー、ゆんやー」と泣いていたことだけは記憶している。我輩はここで初めて人間というものをみた。',
u'まりさは激怒した。かならずかの邪智暴虐の人間を除かねばらぬと決意した。まりさには政治がわからぬ。まりさは、町のゆっくりである。歌を歌い、れいむと遊んで暮らしていた。しかし、ゆっくりできないことには、ゆっくり一倍敏感であった。今日未明、まりさは村を出発して迷子になりました。おしまい。',
u'むかしむかし、あるところに、ありすとまりさとが住んでいました。ありすはゆっくりしに、まりさは川へゆっくりしに行きました。まりさが川でゆっくりしていると、ドンブラコ、ドンブラコと大きなれいむが流れてきました。沈みました。おしまい。',
u'むかしむかし、ある村に、心のやさしい、まりさというゆっくりがいました。まりさが海辺をとおりかかると、子供たちがゆっくり・れいむを捕まえていました。そばによってみると子供たちがみんなで、ゆっくり・れいむをいじめていました。「やい、くそ人間 。さっさとれいむから手を離すのぜ!さもないとこの最強のまりさ様がせいっさいするのぜ!」逆に制裁されました。おしまい',
u'ここはれいむのゆっくりプレイスだよ!ゆっくりしないででていってね!可愛くってごめんねー!']

docs = []
for txt in all_text:
docs.append( get_tokens(txt.encode('utf-8')) )

col = nltk.TextCollection(docs)

results = []

# tf : Term Frequency 単語出現頻度 文章jにおける単語iの出現回数/全文章で出現する総単語数
# idf : Inverse Document Frequency 逆文章頻度 log(総ドキュメント数/単語iを含むドキュメント数)
# tf-idf : tf * idf
for doc in docs:
ret = tf_idf_result(doc)
terms = list(set(doc))
for term in terms:
#print "%s : tf-idf%f tf;%f idf:%f" % (term, col.tf_idf(term, doc), col.tf(term, doc), col.idf(term, doc))
ret.set_score(term,col.tf_idf(term, doc))
results.append(ret)

i = 1
for ret in results:
print "(%d)の上位100位キーワード"%(i)
j = 1
for k, v in sorted(ret.term_scores.items(), key=lambda x:x[1], reverse=True):
print " %s : %f" % ( k, v )
if j > 100:
break
j = j + 1
i = i + 1



by mima_ita | 2013-06-18 23:10 | python
<< Excel VBAでメモリをダ... テキストを類似度毎に階層的クラ... >>



実験ですお

by mima_ita
検索
カテゴリ
最新の記事
.NET4.5におけるasy..
at 2014-07-02 00:46
.NETでTwitterを検..
at 2014-06-29 00:49
Redmineのプラグインで..
at 2014-06-28 03:29
IO.popenのwrite..
at 2014-06-28 03:25
RedmineのWikiでU..
at 2014-06-28 03:16
以前の記事
最新のトラックバック
その他のジャンル
ブログパーツ