2017-11-27 21 views
0

TF_norm行列とIDFベクトルからTF-IDFを作成しようとしています。彼らは同じ次元を持っていないことを知っているので、私は2つをどのように掛け合わせることができないのか分からない。 TF_norm行列を使ってreduceを追加するか、IDFベクトルを変換する必要がありますか?ここから完全になくなった。Python TF-IDFプロダクト

#c) Normalized term frequency 
count=0 
total=lexicon_dim 
matrix_TF_norm=[[0 for c in range(lexicon_dim)] for r in range(4)] 
for c in lexicon: 
    matrix_TF_norm[0][count]=c 
    matrix_TF_norm[1][count]=hamlet_tok_norm_stop_stem.count(c)/total 
    matrix_TF_norm[2][count]=macbeth_tok_norm_stop_stem.count(c)/total 
    matrix_TF_norm[3][count]=pinocchio_tok_norm_stop_stem.count(c)/total 
    count=count+1 
print(matrix_TF_norm) 
#d) TF-IDF 
vector_idf=[] #initialize IDF vector 
for i in range(lexicon_dim): #run through loop for each token in lexicon 
    df=0 
    if matrix_binary[1][i]==1: #[1] = doc1 
     df=df+1 
    if matrix_binary[2][i]==1: 
     df=df+1 
    if matrix_binary[3][i]==1: 
     df=df+1 
    #add them together 
    idf=math.log(3/df) 
    vector_idf.append(idf) 
print(vector_idf) 

import numpy as np 
vector_idf=np.diag(vector_idf) 
tf_idf=np.cross(vector_idf,matrix_TF_norm) 

答えて

1

あなたのコードに従うのが難しい種類ですが、寸法と算術演算を細分化できます。

  • すべては固定語で始まり、サイズはNで、テキストの一部から抽出されています。
  • これは、IDFの重みがNであることを意味します。これは、サイズが1 X NのベクトルまたはN X N行列の対角のいずれかになり、そうでない場合は両方とも0になります。
  • 次に、サイズがKのテキストコレクションがいくつかあるとしましょうボキャブラリーを抽出するために使用された元のコレクションである)。各テキストは語彙に従って、用語頻度カウントのサイズNのベクトルにトークン化され、Kサイズのコレクション全体がサイズK X Nのマトリックスになります。
  • したがって、K X Nのtf_matrix、サイズN X Nのidf_matrix、またはサイズ1 X Nのidf_vectorがあります。 tf_idf_matrixを得るには、行列の乗算を行う必要があります:tf_matrix * idf_matrixまたは要素ごとの行列とベクトルの乗算tf_matrix * idf_vector。両方とも、i-thのtfにidfの重量i-thを掛けるという目標を達成します。
  • これらのステップのいくつかで正規化を行うことはできますが、これらの次元は決して変更されず、対応する位置の数値のみが変更されます。

関連する問題