2017-03-07 48 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。

检查您的预处理,但也许只是删除坏文档。