元のページ
ステージ3-4: ベクトルの重み付け例(バイナリ、正規化、TFIDF値)(情報工学実験 3 : データマイニング班)
目次
想定環境
- OS: Mac OS X 10.8.x (10.7.x以降であれば同じ方法で問題無いはず)
- Python: 2.7.x
- Mercurial: 2.2
- numpy: 1.8.0 (numpy.version)
バイナリ・ベクトル
# データ準備(タームベクトルの続き)
# data[x][4]は全てのサンプルで同じ回数出現。
from prettyprint import pp
docs = []
docs.append(u"会場には車で行きます。")
docs.append(u"会場には自動車で行きます。")
docs.append(u"会場には自転車で行きます。")
docs.append(u"お店には自転車で行きます。")
data = [[1, 0, 0, 0, 1, 1], [1, 0, 1, 0, 1, 0], [1, 0, 0, 1, 1, 0], [0, 1, 0, 1, 1, 0]]
data[0][0] = 10 #一部変更
# バイナリ(0/1)ベクトル
def transform_binary_vectors(data, threshold=0.):
u'''データ(サンプル集)を0/1(binary)ベクトルに変換。
threshold より大きい値を1、以下は0に変換。
threshold のデフォルト値は0。
'''
binary_vectors = []
for sample in data:
tmp_vector = []
for value in sample:
if value > threshold:
tmp_vector.append(1)
else:
tmp_vector.append(0)
binary_vectors.append(tmp_vector)
return binary_vectors
data2 = transform_binary_vectors(data)
data2
# dataと比べてdata2はどう変わった?
正規化ベクトル
# 正規化
import numpy as np
data3 = [data[i]/np.linalg.norm(data[i]) for i in range(len(data))]
data3
print "data[0]'s norm=%f" % (np.linalg.norm(data[0]))
print "data3[0]'s norm=%f" % (np.linalg.norm(data3[0]))
# dataと比べてdata3はどう変わった?
TFIDF値ベクトル(正規化済み)
- TF*IDF: TF: Term Frequency, IDF: Inverse Document Frequency
# TFIDF値ベクトル (正規化済み)
from sklearn.feature_extraction.text import TfidfTransformer
transformer = TfidfTransformer()
data4 = transformer.fit_transform(data).toarray()
data4
# dataと比べてdata4はどう変わった?