K均值聚类-处理非数值数据

时间:2020-03-18 13:08:39

标签: python k-means

我有要聚类的twitter数据。它是文本数据,我了解到K表示无法处理非数值数据。我只想根据推文对数据进行聚类。数据看起来像这样。

enter image description here

我找到了可以将文本转换为数字数据的代码。

def handle_non_numerical_data(df):
    columns = df.columns.values

    for column in columns:
        text_digit_vals = {}
        def convert_to_int(val):
            return text_digit_vals[val]

        if df[column].dtype != np.int64 and df[column].dtype != np.float64:
            column_contents = df[column].values.tolist()
            unique_elements = set(column_contents)
            x = 0
            for unique in unique_elements:
                if unique not in text_digit_vals:
                    text_digit_vals[unique] = x
                    x += 1

            df[column] = list(map(convert_to_int, df[column]))

    return df

df  = handle_non_numerical_data(data)
print(df.head())

输出

   label  tweet
0      9     24
1      5     11
2     17     45
3     14    138
4     18    112

我对此很陌生,我认为这不是我需要的数据。处理这种性质的非数值数据(文本)的更好方法是什么?

编辑:当运行K表示对原始文本数据进行聚类算法时,会出现此错误。

ValueError:无法将字符串转换为浮点型

2 个答案:

答案 0 :(得分:0)

处理非数字数据的最典型方法是将单个列转换为多个二进制列。这称为“获取虚拟变量”或“一种热编码”(在许多其他卑鄙的术语中)。

您还可以执行其他操作来将数据转换为数字,例如sentiment analysis(即,将每条推文分类为快乐,悲伤,有趣,生气等),分析这些推文以确定是否它们是关于某个主题的(例如,此推文是否谈论病毒?),每个推文中的单词数,每个推文中的空格数(如果它具有良好的语法)等。如您所见,您正在询问一个非常广泛的主题。

将数据转换为二进制列时,您将获得列中唯一值的数量,并创建许多新列,每个新列都填充零和一。

让我们专注于您的第一列:

import pandas as pd
df = pd.DataFrame({'account':['realdonaldtrump','naredramodi','pontifex','pmoindia','potus']})

    account
0   realdonaldtrump
1   narendramodi
2   pontifex
3   pmoindia
4   potus

这等效于:

pd.get_dummies(df, columns=['account'], prefix='account')

   account_naredramodi  account_pmoindia  account_pontifex  account_potus  \
0                    0                 0                 0              0   
1                    1                 0                 0              0   
2                    0                 0                 1              0   
3                    0                 1                 0              0   
4                    0                 0                 0              1   

   account_realdonaldtrump  
0                        1  
1                        0  
2                        0  
3                        0  
4                        0

这是许多方法之一。您可以查看有关one hot encoding here的这篇文章。

注意:当您有许多唯一值时,这样做将为您提供许多列,并且由于没有足够的自由度(变量太多,观察值不足),某些算法也会崩溃。最后,如果您进行回归分析,那么如果不删除任何一列,就会遇到完美的多重共线性。

回到您的示例,如果您想将所有列都转换为此类数据,请尝试:

pd.get_dummies(df)

但是,我不会在tweet列中执行此操作,因为每个tweet都是其自己的唯一值。

答案 1 :(得分:0)

由于k均值是矢量量化的一种方法,因此您应该以一种或另一种方式对文本数据进行矢量化。

查看在文本上使用k均值的一些示例: Word2Vec tf-idf