2017-03-07 71 views
0

我有使用tm包創建的文檔的語料庫,並且我使用相同的包製作了文檔術語矩陣。我想用k-means聚類來聚集文檔。我使用歐幾里德距離,所以我首先對矢量進行歸一化處理,以使歐幾里得變得有意義。但是,規範化時,它會爲一個特定文檔創建'NaN'值,我不知道爲什麼。該代碼使用:R中的K均值聚類:規範化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中, '男' 值。當然,當我嘗試使用k-means時,會拋出以下錯誤:

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

因爲它無法處理'NaN'值。但是,我不明白爲什麼這些'NaN'值是首先創建的?

編輯: 當我看apply(m, MARGIN=1, FUN=function(x) sum(x^2)^.5)norm_eucl功能的上方,用於文檔3的值是零。所以它試圖用零除,這當然是不可能的。但有誰知道爲什麼這是零和如何解決這個問題,所以kmeans仍然有可能?

+1

如果文檔3中沒有條款,那就刪除它。至於爲什麼它沒有條款,我們必須看看你如何處理你的語料庫和數據。可能的原因:1)只有稀疏條款會被刪除,如果您按稀疏過濾。 2)只有停用詞,數字和/或標點符號。 3)沒有正確讀入語料庫,最後空了。 – emilliman5

回答

0

也許這個文件是

然後它會有0規範,你會得到一個NaN。

檢查您的預處理,但也許只是刪除壞文檔。