通过 Python 对具有相似描述的列进行聚类

Posted

技术标签:

【中文标题】通过 Python 对具有相似描述的列进行聚类【英文标题】:Clustering a Column with Similar Descriptions via Python 【发布时间】:2018-02-15 11:34:36 【问题描述】:

我的数据集中有一列包含车祸描述。许多描述不一致,但意思相同。例如,如果我考虑标记为Descriptions 的变量的前 7 行(我的实际数据集是 17,000+ 行):

Descriptions
CLMT REAR ENDED IV
claimant REAR ENDED IV
CLM'R EAR ENDED IV
4 way stop sgn
CLM'T  rear-ended IV
IV STOPPED AT RED LIGHT WAS REAR ENDED BY CLM'T
IV Stopped at red light when IV was R/E by OV

其中CLMT REAR ENDED IVclaimant REAR ENDED IV 表示相同的意思,但它们的拼写略有不同。我想生成一个变量,将它们分组到同一类别中。最终目标是这样的:

Descriptions                                    clusterGroup
CLMT REAR ENDED IV                                cluster1
claimant REAR ENDED IV                            cluster1
CLM'R EAR ENDED IV                                cluster1
4 way stop sgn                                    cluster2
CLM'T  rear-ended IV                              cluster1
IV STOPPED AT RED LIGHT WAS REAR ENDED BY CLM'T   cluster3
IV Stopped at red light when IV was R/E by OV     cluster3

我知道这是错误的,我不知道如何让每一行成为一个 nltk 句子,然后使用 scikit 学习 kmean 进行聚类:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import pandas as pd
import nltk

df = pd.read_csv('dataset.csv')
documents = df['Descriptions'].apply(nltk.sent_tokenize)    

vectorizer = TfidfVectorizer(stop_words='english')
X = vectorizer.fit_transform(documents)
true_k = 50
model = KMeans(n_clusters=true_k, init='k-means++', max_iter=100, n_init=1)
model.fit(X)
predict=model.predict(X)   
df['clusterGroup'] = Series(predict, index=X.index)

当我运行上面的脚本时,出现以下错误:

AttributeError: 'list' object has no attribute 'lower'

考虑到Descriptions pandas 列中的每一行都是一个句子,我怎么可能使用 nltk 将它们分解成可以运行 kmeans 或其他聚类算法的句子?任何帮助或指导将不胜感激

【问题讨论】:

您可以按照本教程进行操作:nlpforhackers.io/recipe-text-clustering 您是否只想按相似性对描述进行聚类,而不考虑主题,或者您是否拥有(或可以制作)应分配描述的特定类别列表?如果是第二个,请查看分类器。 我的最终目标是产生类似于他们在github.com/smilli/clust 中所做的事情,但理想情况下为每个集群添加标签。我并不是真的想把更多的东西分类成组 执行此任务的简单方法是使用 OpenRefine github.com/OpenRefine/OpenRefine/wiki/Clustering 【参考方案1】:

像 k-means 这样的无监督方法在这项任务上总是表现不佳。

因为这完全是关于理解语言,而这不会仅仅从这一小段数据中发生。您可以通过语言的统计分析来完成令人印象深刻的事情(请参阅 Google 助理),但您需要数十亿个文档来训练。即便如此,它也可能涉及大量带标签的训练数据。

【讨论】:

感谢您的回复,有什么建议吗?我想保留这个变量,我认为它可以让我们深入了解我们的数据集 我没有任何建议,因为我认为这无法完全自动化。【参考方案2】:

您可以参考以下链接之一:

roup-thousands-of-similar-spreadsheet-text-cells-in-seconds

clustering-product-names-with-python

【讨论】:

以上是关于通过 Python 对具有相似描述的列进行聚类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用聚类对具有相似意图的句子进行分组?

如何在 Python 中对包含 TRUE/FALSE 值的数据集执行聚类?

Python - 使用 K-means 进行聚类。一些方差为零的列

余弦相似度聚类

如何使用 k-means (Flann with python) 对文档进行聚类?

机器学习——谱聚类