如何对标记化文档进行聚类
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)
您想要相似性搜索,而不是聚类。
问题的工具错误,你不需要为了买一瓶啤酒而买下整个超市。
事实上,您现在又回到了最初遇到的相同问题...您将所有文档放入一个簇中,现在需要找到最近的簇。马上找到最近的文件...或者回到超市的比喻:你买了整个超市,但现在你仍然需要去那里才能真正买到啤酒。
我有一个文档列表,我想了解它们与某个文档的相似度有多接近。我刚刚想出了如何对标记化文档进行聚类,但我不知道如何检查它们与 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)
您想要相似性搜索,而不是聚类。
问题的工具错误,你不需要为了买一瓶啤酒而买下整个超市。
事实上,您现在又回到了最初遇到的相同问题...您将所有文档放入一个簇中,现在需要找到最近的簇。马上找到最近的文件...或者回到超市的比喻:你买了整个超市,但现在你仍然需要去那里才能真正买到啤酒。