我有一份文件清单,我想知道它们在相似性方面与单个文件有多接近。我只是弄清楚如何聚集标记化文档,但我不知道如何检查它们与目标文档的距离。
我实现聚类的方式是,我首先获取了文档列表......
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
中每个文档与此目标的相似程度?
答案 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)