我有一个这样的数据框,包含以下列 – ["A","B","C","D"]
A --> 分类特征,有2个值,例如Yes或NoB --> 分类特征,有10个唯一值,如"AAXX-10","BBYY-20"等C --> 日期时间字段D --> 基于简短文本描述一个人是否对电影感兴趣的文本列(基本上是他们从剧院出来后的评论)
样本数据框
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"
我有两个问题 –
- 我想基于列”D”创建一个第五列,假设为”兴趣”,它将有4个类别
["喜欢", "不喜欢", "一般", "无法评论"]
。我该怎么做?
–基于”D”,”兴趣”列应该有[“喜欢”, “一般”, “不喜欢”]–.
- 由于大多数列是分类和日期时间类型,还有一列是文本。在这种特定场景下,我应该如何进行特征工程,以便能够将数据输入到Kmeans中?
如何从文本特征列”D”中提取特征?
我应该将列A转换为二进制的0和1吗?
我应该对第二列进行独热编码/标签编码吗?
如何在聚类中利用日期时间特征?
我尝试过的事情 –
我对列A(转换为二进制)、B(标签编码)、C(从日期转换为年和月特征)和D(忽略此特征,因为不知道如何使用它)进行了预处理和特征工程。
基于此,我使用 kmeans.labels_
获得了聚类,但这些聚类是数字的 1,2,3,4。
我如何将这些映射到 ["喜欢", "不喜欢", "一般", "无法评论"]
?如何有效地使用文本列来进行聚类?
我的查询只需要简短的答案。我不需要任何实现。
回答:
首先回答第二个问题:
A: 可以转换为二进制
B: 通过编码从一组唯一字符串中能得到什么信息?编码后你会得到一个单位矩阵(独热编码)或者一组单调递增的整数(标签编码)
C: 如果日期范围允许,你最好转换为时间戳的Unix纪元,这样可以正确计算距离。
D: 这是项目的核心。处理步骤非常复杂,但简短总结如下:
基本配方包括但不限于:
- 文本标准化:
- 转换为小写或大写
- 将数字转换为文字或去除数字,
- 去除标点符号、重音标记和其他变音符号,
- 去除前导或尾随空格
- 语料库分词(将每行分割成单个单词的列表)
- 去除停用词,(如a, the ..)它们包含的信息很少且很常见
- 词干提取或词形还原。这些方法将单词简化为基本形式。词干提取相当粗糙,可能会产生无效单词,但速度快。词形还原基于词典生成有效单词,但速度较慢……还有更多其他步骤。特征提取使用TF-IDF,这是一种编码方法,为每个单词分配一个重要性得分。该方法通过在文档中多次出现时增加单词的权重,并在许多文档中常见时降低其权重来工作。
TF-IDF的示例:
from sklearn.feature_extraction.text import TfidfVectorizercorpus = [ '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)
经过这些步骤后,你将得到第一个问题的答案;输出可能看起来像这样:
你可以在这里找到如何完成所有这些步骤的代码(使用NLTK)。然而,你可能不被允许使用NLTK,在这种情况下,你将很难完成所有这些步骤。