我有要聚类的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:无法将字符串转换为浮点型
答案 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)