对数据进行聚类后如何根据其他列生成新列?

问题描述

我有一个像这样带有列的数据框 - ["A","B","C",D"]

A --> Categorical feature with 2 values,say Yes or No
B --> Categorical feature with 10 unique values,like "AAXX-10","BBYY-20" etc
C --> A date-time field
D --> Text-based column,describing if a person was interested in the movie or not based on short text(basically their comments after coming out of theatre)

示例 df

A  | B | C | D
------------------------------------------------------------------------------
Yes|AAXX-10|8/10/2018|"Yes I liked the movie,it was great"
------------------------------------------------------------------------------
Yes|BBYY-20|8/10/2017|"I liked the performance of the cast in the movie but as a whole,It was just average"
------------------------------------------------------------------------------
No |AANN-88|8/10/2013|"Never seen a ridiculous movie like this"

我有两个问题 -

  1. 我想根据包含 4 个类别 ["Liked","Didn't like","Average","Cannot comment"] 的列“D”创建第五列,比如“兴趣”。我怎么能这样做?

--在“D”的基础上,“兴趣”栏应该有[“喜欢”、“一般”、“不喜欢”]--。

  1. 因为大多数列是分类和日期时间,而一列是文本。在这个特定场景中,我应该如何继续进行特征工程才能提供给 Kmeans?

如何从作为文本特征的“D”列中获取特征?

我应该将 A 列转换为二进制 0 和 1 吗?

我应该对第二列进行一次热编码/标签编码吗?

如何在聚类中利用日期时间特性?

我尝试过的东西 -

我对 A 列(转换为二进制)、B(标签编码)、C(从日期转换为年月特征)和 D(忽略了这个特征,因为不知道如何使用它)做了预处理和特征工程).

基于此,我使用 kmeans.labels_ 获得集群,但这些集群是数字 1,2,3,4

我如何才能真正将它们映射到 ["Liked","Cannot comment"]? 如何有效地使用文本列来制作集群?

只需简短回答我的查询即可。我不需要任何实现。

解决方法

首先回答第二个问题:

A: 可以转成二进制

B:通过编码可以从唯一字符串列表中获得哪些信息?编码后,您将获得单位矩阵(One-Hot)或单调递增整数列表(标签编码)

C:如果日期范围允许,您最好转换为 Timestamp unix epoch,这可以让您正确计算距离。

D:这是该项目的基础。处理步骤非常复杂,但总结如下:

基本配方包括但不限于:

  1. 文本规范化:
    • 转换为小写或大写
    • 将数字转换为单词或删除数字,
    • 删除标点符号、重音符号和其他变音符号,
    • 删除前导或尾随空格
  2. Corupus 标记化(将每一行拆分为单个单词列表)
    • 删除停用词,(a,the ..)它们包含的信息很少并且很常见
  3. 词干提取或词形还原。 Tese 将单词简化为基本形式。词干提取非常粗糙,可能会产生无意义的词,但速度很快。词形还原根据字典生成有效单词,但速度较慢 .... 更多的东西 n.使用 TF-IDF 进行特征提取,这是一种给每个单词一个重要性分数的编码。这种方法的工作原理是,当一个词在一个文档中出现多次时增加它的权重,当它在许多文档中出现时降低它的权重。

td-idf 示例:

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
    'This is the first document.','This document is the second document.','And this is the third one.','Is this the first document?',]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())

print(X.shape)

经过这 n 个步骤后,您将得到第一个问题的答案;输出可能如下所示:

enter image description here

您可以找到有关如何完成所有这些事情的代码 here(使用 NLTK)。但是,您可能不被允许使用 NLTK,在这种情况下,您将很难完成所有这些步骤。