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

K Means Clustering - Handling Non-Numerical Data

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

我发现这段代码可以将文本转换为数值数据。

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: 无法将字符串转换为浮点数

处理非数值数据最典型的方法是将单个列转换为多个二进制列。这称为 "getting dummy variables" 或 "one hot encoding"(在许多其他势利的术语中)。

还有其他方法可以将数据转换为数字,例如 sentiment analysis(即将每条推文分类为快乐、悲伤、有趣、愤怒等...),分析推文以确定它们是否与某个主题有关(即这条推文是否谈论病毒?),每条推文中的单词数,每条推文的空格数,它是否具有良好的语法等。你可以看,你问的是一个非常广泛的主题。

将数据转换为二进制列时,您会得到列中唯一值的数量,并创建那么多新列,每个列都用 0 和 1 填充。

让我们关注您的第一列:

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 列执行此操作,因为每条推文都有其独特的价值。

由于 k-means 是一种矢量量化方法,您应该以某种方式对文本数据进行矢量化。

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