0

我有一组数据,其中有一个文本字段,我试图根据文本字段自动将其标记为相关或不相关。我已经手动标记了数据,但正在尝试将自动标签与手动标签进行比较以计算自动标签的准确性。我正在使用 K 均值聚类将数据聚类到 2 个聚类中。我苦苦挣扎的地方是用我的原始数据和它们所在的集群创建一个 csv 文件。我的想法是我将有一个 csv 文件显示哪一行在哪个集群中,这样我就可以查看每个集群的大多数标签拥有该标签并将其分配给该集群中的每一行。然后我可以用它来做进一步的分析。

这是我拥有的数据的一个示例(非常简化)。相关性是我的手动标签。

Id <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

Relevance <- c("Relevant", "Not Relevant", "Relevant", "Relevant", "Relevant", "Not Relevant", "Not Relevant", "Not Relevant", "Relevant", "Relevant")

Text <- c("Cat", "Dog", "Fish", "Cow", "Horse", "Fox", "Rat", "Bird", "Tiger", "Elephant")

Data <- cbind(Id, Relevance, Text)

这是我用于创建集群的代码:

Data<- read.csv("Desktop\\Data.csv", header=TRUE)
#creating a corpus using the text field of my data
corpus<-Corpus(VectorSource(Data$text))

#I did some pre-processing of the texts here eg remove punctuation

dtm <- DocumentTermMatrix(Data)
newdtm <- removeSparseTerms(dtm, 0.99)

#perform the k means clustering
d <- dist(t(newdtm), method="euclidian")
kfit<-kmeans(d, 2)

那么如何创建一个 csv 文件来显示我的原始数据以及显示每行所在的集群的附加列?

我正在寻找的输出看起来像这样的结果:

Id <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Relevance <- c("Relevant", "Not Relevant", "Relevant", "Relevant", "Relevant", "Not Relevant", "Not Relevant", "Not Relevant", "Relevant", "Relevant")
Text <- c("Cat", "Dog", "Fish", "Cow", "Horse", "Fox", "Rat", "Bird", "Tiger", "Elephant")
Cluster <- c(1, 2, 2, 2, 1, 1, 2, 2, 1, 1)

cbind(Id, Relevance, Text, Cluster)
4

1 回答 1

0

您不能使用 k-means 对此类数据进行聚类。

仅对连续数值属性使用 k-means

顾名思义,该方法需要平均值才能对数据有意义。但是“猫”和“狗”是什么意思?

Document-term-matrix 仅适用于loooooong文本。根据经验,每个文本最少 100 个单词。

在您的示例中,每条记录都与其他记录完全不同。查看您的矩阵,您正在尝试“聚类”这些数据:

1 0 0 0 0 0 
0 1 0 0 0 0
0 0 1 0 0 0
0 0 0 1 0 0
0 0 0 0 1 0
0 0 0 0 0 1

不出所料,这些数据的结果几乎是随机的。此外,您正在使用 k-means wearg - 它使用原始数据矩阵,而不是距离矩阵。

于 2016-08-21T14:55:44.883 回答