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

how to cluster tokenized documents

我有一个文档列表,我想了解它们与某个文档的相似度有多接近。我刚刚想出了如何对标记化文档进行聚类,但我不知道如何检查它们与 target 文档的距离。

我实现集群的方式是,我首先获取文档列表...

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 中的每个文档与该目标的相似程度?

对于您的问题,聚类实际上没有用。集群可以让您大致了解数据属于哪些组,但您不能使用它来比较两个单独的数据点。

此时你必须实现一个损失函数。我建议使用像欧氏距离或均方误差这样简单的东西。

矢量化您的目标文档,并遍历您的 tfidf_matrix。对于矩阵中的每个值,计算其与目标文档的损失。从这里您可以找到它与哪个文档最相似 to/different。

您可以简单地使用 KMeans.predict()

Predict the closest cluster each sample in X belongs to.

In the vector quantization literature, cluster_centers_ is called the code book and each value returned by predict is the index of the closest code in the code book.

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

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

类似于:

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

您想要相似性搜索,而不是聚类。

问题的工具错误,你不需要为了买一瓶啤酒而买下整个超市。

事实上,您现在又回到了最初遇到的相同问题...您将所有文档放入一个簇中,现在需要找到最近的簇。马上找到最近的文件...或者回到超市的比喻:你买了整个超市,但现在你仍然需要去那里才能真正买到啤酒。