在Python中对单词进行聚类的列表

8
我是一名文本挖掘新手,以下是我的情况。假设我有一个单词列表['car', 'dog', 'puppy', 'vehicle'],我想将单词聚类成k个组,期望的输出是[['car', 'vehicle'], ['dog', 'puppy']]。我首先计算每个单词之间相似度得分,得到一个4x4矩阵M,其中Mij是单词i和j之间的相似得分。之后,将单词转化为数字数据,利用不同的聚类库(如sklearn)或自行实现聚类方法以获得单词聚类结果。
我想知道这种方法是否可行?此外,我应该如何确定k的值?更重要的是,我知道存在不同的聚类技术,我在考虑是否应该使用k-means或k-medoids来进行单词聚类?

1
你想要计算什么类型的相似度?是字符序列的相似度(例如,“rock”和“clock”非常相似),还是单词含义的相似度(例如,“dog”和“puppy”非常相似)? - Marcel P
@Marcel P 可能是单词意思的相似性。 - Kevin Lee
那你会如何计算呢?“意义”没有方程式可循。 - Has QUIT--Anony-Mousse
3个回答

8

Brian O'Donnell的回答之后,一旦您使用word2vec(或FastTextGLoVE等)计算了语义相似度,您可以使用sklearn.clustering对矩阵进行聚类。我发现,对于小矩阵,谱聚类效果最好。

值得注意的是,单词向量通常嵌入在高维球面上。使用欧几里得距离矩阵的K-means无法捕捉到这一点,并且可能导致不是直接邻居的单词之间的相似度较差的结果。


4

如果你想通过“语义相似性”(即词汇的相似程度)来对单词进行聚类,可以看一下Word2Vec和GloVe。Gensim提供了Word2Vec的实现。Radim Rehurek的网页“Word2Vec教程”介绍了使用Word2Vec确定相似单词的方法。


0

关于相似度分数,对于聚类应用程序中的k的发现,通常可以通过scree plots(也称为“拐点曲线”)来辅助。在这些图中,您通常会在y轴上看到一些簇之间的离散度测量,而在x轴上则是簇的数量。在拐点图中找到最小值(二阶导数)可以给出更客观的簇“独特性”度量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接