K означает кластеризацию - обработка нечисловых данных - PullRequest
0 голосов
/ 18 марта 2020

У меня есть данные твиттера, которые я хочу кластеризовать. Это текстовые данные, и я узнал, что 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 голосов
/ 18 марта 2020

Поскольку k-means - это метод векторного квантования, вы должны так или иначе векторизовать свои текстовые данные.

См. Некоторые примеры использования k-средних над текстом: Word2Ve c tf-idf

0 голосов
/ 18 марта 2020

Наиболее типичным способом обработки нечисловых данных является преобразование одного столбца в несколько двоичных столбцов. Это называется «получение фиктивных переменных» или «горячая кодировка» (среди многих других терминов сноба).

Существуют и другие способы преобразования данных в числа, например, анализ настроений (т. Е. Очищать каждый твит в счастливый, грустный, смешной, злой и т. Д. c ...), анализировать твиты, чтобы определить, имеют ли они отношение к определенному предмету или нет (т. Е. Говорит ли этот твит о вирусе? ), количество слов в каждом твите, количество пробелов в твите, если у него хорошая грамматика или нет, и т. д. c. Как видите, вы спрашиваете об очень широкой теме.

При преобразовании данных в двоичные столбцы вы получаете количество уникальных значений в столбце и задаете столько новых столбцов, каждый из которых заполняется нули и единицы.

Давайте сосредоточимся на вашем первом столбце:

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

Это один из многих методов. Вы можете проверить эту статью о одном горячем кодировании здесь .

ПРИМЕЧАНИЕ : если у вас много уникальных значений, это даст вам много столбцов, а некоторые алгоритмы cra sh из-за нехватки степеней свободы (слишком много переменных, недостаточно наблюдений). Наконец, если вы используете регрессию, вы столкнетесь с идеальной мультиколлинеарностью, если не отбросите один из столбцов.

Возвращаясь к вашему примеру, если вы хотите превратить все свои столбцы в данные такого рода попробуйте:

pd.get_dummies(df)

Однако я бы не стал этого делать для столбца tweet, поскольку каждый твит имеет свое уникальное значение.

...