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