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仍然有可能?
如果文档3中没有条款,那就删除它。至于为什么它没有条款,我们必须看看你如何处理你的语料库和数据。可能的原因:1)只有稀疏条款会被删除,如果您按稀疏过滤。 2)只有停用词,数字和/或标点符号。 3)没有正确读入语料库,最后空了。 – emilliman5