2017-03-07 9 views
0

tmパッケージを使用して作成したドキュメントのコーパスがあり、同じパッケージを使用してドキュメント用語行列を作成しました。私はk-meansクラスタリングを使用して文書をクラスタリングしたいと考えています。私はユークリッド距離を使用するので、まずベクトルを正規化してユークリッドが意味を成すようにします。しかし、正規化すると、特定のドキュメントのNaN値が作成されますが、その理由はわかりません。私が使用するコード:K-はRのクラスタ化を意味します:正規化DTMは「NaN」を作成します

m = dtm 
norm_eucl = function(m) m/apply(m, MARGIN=1, FUN=function(x) sum(x^2)^.5) 
m_norm = norm_eucl(m) 
cl = kmeans(m_norm, 2) 

私は(例えば)、それが言うm_normを見て:

Terms  term1   term2 
Docs 
    1  0.2568640  0.8650674 
    2  0.6204346  0.0000000 
    3  NaN    NaN  
    4  0.0000000  0.6543098 

だから、文書3 'のNaN' 値を持っています。もちろん、k-meansを使用しようとすると、次のエラーがスローされます。

Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1) 

「NaN」値を扱うことができないためです。しかし、なぜこれらの「NaN」値が最初に作成されるのか分かりません。

EDIT: 私は上記norm_eucl関数からapply(m, MARGIN=1, FUN=function(x) sum(x^2)^.5)を見てみると、文書3の値がゼロです。だからゼロに分けようとしていますが、これはもちろん不可能です。しかし、なぜこれがゼロで、これを修正するのか誰もが知っていますので、kmeansはまだ可能ですか?

+1

文書3に用語がない場合は、それを削除するだけです。なぜ言葉がないのかについては、コーパスとデータをどのように処理するのかを見なければなりません。考えられる理由は次のとおりです。1)まばらにフィルタリングすると削除される用語がまったくない。 2)は、ストップワード、数字、および/または句読点しか持たない。 3)コーパスに正しく読み込まれず、空になった。 – emilliman5

答えて

0

多分その文書は空ですですか?

次にノルム0になり、NaNが得られます。

前処理を確認してください。ただし、不正なドキュメントを削除してください。

関連する問題