如何对标记化文档进行聚类

时间:2018-04-11 03:16:40

标签: python-3.x machine-learning scikit-learn cluster-analysis unsupervised-learning

我有一份文件清单,我想知道它们在相似性方面与单个文件有多接近。我只是弄清楚如何聚集标记化文档,但我不知道如何检查它们与目标文档的距离。

我实现聚类的方式是,我首先获取了文档列表......

text = [
    "This is a test",
    "This is something else",
    "This is also a test"
]

然后我使用以下函数对它们进行了标记......

def word_tokenizer(sentences):
    tokens = word_tokenize(sentences)
    stemmer = PorterStemmer()
    tokens = [stemmer.stem(t) for t in tokens if t not in stopwords.words('english')]
    return tokens

我将此功能传递给TfidfVectorizer ...

tfidf_vect = TfidfVectorizer(
        tokenizer=word_tokenizer,
        max_df=0.9,
        min_df=0.1,
        lowercase=True
    )

tfidf_matrix = tfidf_vect.fit_transform(text)

然后我使用Kmeans来聚类矩阵......

kmeans = KMeans(n_clusters=3)
kmeans.fit(tfidf_matrix)

然后我保存了每个群集并打印出结果......

for i, label in enumerate(kmeans.labels_):
    clusters[label].append(i)
res = dict(clusters)

for cluster in range(3):
    print("cluster ", cluster, ":")
    for i, sentence in enumerate(res[cluster]):
        print("\tsentence ", i, ": ", text[sentence])

结果如下......

cluster  0 :
    sentence  0 :  This is also a test
cluster  1 :
    sentence  0 :  This is something else
cluster  2 :
    sentence  0 :  This is a test

这是有用的信息,但是假设我有一个目标文档,我想看看这些文档与目标有多相似,我该怎么做?

例如,假设我有以下目标......

target = ["This is target"]

如何查看text中每个文档与此目标的相似程度?

3 个答案:

答案 0 :(得分:2)

对于您的问题,群集并非真正有用。集群可以让您大致了解数据属于哪些组,但您无法使用它来比较两个单独的数据点。

此时您必须实施损失功能。我建议使用像欧几里德距离或均方误差这样简单的东西。

对您的目标文档进行矢量化,并遍历您的tfidf_matrix。对于矩阵中的每个值,使用目标文档计算其损失。从这里您可以找到最相似/不同的文档。

答案 1 :(得分:1)

您想要相似性搜索,而不是群集。

问题的错误工具,你不需要购买整个超市只是为了喝啤酒。

事实上,你现在回到了原先遇到的同样的问题......你把所有文档都放到了一个集群中,现在需要找到最近的集群。只需立即找到最近的文件...或者回到超市比喻:你买了整个超市,但是现在你仍然需要到那里去买啤酒。

答案 2 :(得分:0)

您只需使用KMeans.predict()

即可
  

预测X中每个样本所属的最近集群。

     

在矢量量化文献中,cluster_centers_被称为   代码簿和predict返回的每个值都是索引   代码簿中最接近的代码。

这将返回新句子所属的集群的索引。

对目标句子应用相同的预处理并调用predict()。确保使用相同的tfidfvectorizer来转换句子。

类似的东西:

target_tfidf_matrix = tfidf_vect.transform(target)
results = kmeans.predict(target_tfidf_matrix)