如何将自定义文本数据加载到scikit进行均值漂移聚类?
我打算加载我自己的非结构化文本数据,数据大致可以是这样的:
64.242.88.10 - - [07/Mar/2004:16:05:49 -0800] "GET /twiki/bin/edit/Main/Double_bounce_sender?topicparent=Main.ConfigurationVariables HTTP/1.1" 401 12846
或者也可以是以下这种形式:
/usr/local/etc/snmp/snmpd.conf: line 68: Error: Blank line following agentaddress token.
NET-SNMP version 5.3.1
总的来说,程序并不关心给定数据的结构。
我已经修改了scikit中MeanShift示例的代码,以便我的代码可以加载我自己的数据。在这个例子中,输入文件被命名为input。
for idx, line in enumerate(input):
if(len(line) == ''):
continue;
line = line.strip()
tmpNumPy = np.array([line])
print tmpNumPy
example = np.append(example, tmpNumPy)
# Compute clustering with MeanShift
# The following bandwidth can be automatically detected using
bandwidth = estimate_bandwidth(example, quantile=0.2, n_samples=500)
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
ms.fit(X)
labels = ms.labels_
cluster_centers = ms.cluster_centers_
labels_unique = np.unique(labels)
n_clusters_ = len(labels_unique)
print(labels_unique)
print("number of estimated clusters : %d" % n_clusters_)
但是,当我运行这段代码时,它给了我以下错误:
ValueError: data type not understood
我想知道如何将一组文本数据加载到MeanShift聚类中,而不是数字值,或者有没有其他方法可以尝试?
注意:我已经查看了以下链接,但没有找到解决办法:
1 个回答
3
如果你想把一堆文本分成不同的组,首先需要把这些文本数据转化成一种叫做“向量空间”的形式。通常我们用的方法叫做 潜在语义分析(LSA)。简单来说,就是你要计算一个矩阵,这个矩阵的每一行代表一篇文档,每一列代表一个词。矩阵里的每个元素是“词频-逆文档频率”(tfidf)值,表示每个词在每篇文档中出现的情况。这个矩阵会非常大,而且大部分地方都是空的。接下来,你会用一种叫做“奇异值分解”(SVD)的方法,把这个矩阵的维度减少到你选择的几个“主题”,通常这个主题的数量在200到500之间。
一个非常好用的Python库来做LSA叫做 Gensim。
一旦你把文本转化成向量,就可以根据它们之间的余弦距离来进行分组,这个距离可以告诉你两篇文档在语义上有多相似。虽然sklearn的MeanShift实现不允许你直接指定余弦距离,但如果你在分组之前先对向量进行归一化处理,依然可以得到一个不错的语义相似度测量。