从文本到 K-Means 向量输入

Posted

技术标签:

【中文标题】从文本到 K-Means 向量输入【英文标题】:From text to K-Means Vectors input 【发布时间】:2016-08-25 02:20:09 【问题描述】:

我刚刚开始深入研究机器学习,特别是聚类。 (我正在使用 Python,但这无关紧要) 我的目标是,从一组关于时尚界的推文 (100K) 开始,对他们的文本执行 KMeans。

到目前为止,我已经过滤了文本、截断停用词、无用的术语、标点符号;完成词形还原(利用词性标记以获得更好的结果)。

我向用户展示最常用的术语、主题标签、二元组、三元组、..9 元组,以便他可以改进预处理,将单词添加到无用的术语中。

我最初的想法是使用前 n(1K) 个术语作为特征, 创建 foreach 推文一个固定大小 n(1K) 的向量 如果(此单元格的)最上面的术语出现在此推文中,则将单元格设置为一个值(可能使用 TFIDF 计算单元格的值)。

我是否遗漏了什么(将考虑 0 值)?我可以以某种方式利用 n-gram 吗?

这个scikit article 很笼统,我不明白整个事情。

(LSA降维有用还是手动减少特征数量(所以向量维度)更好?)

【问题讨论】:

【参考方案1】:

这个other sklearn page 包含一个k-means 文本聚类的例子。

但要解决您的一些具体问题:

我最初的想法是使用前 n(1K) 项作为特征,为每个推文创建一个固定大小 n(1K) 的向量,如果(该单元的)顶部出现在此单元格中,则单元格设置为一个值推文(也许用 TFIDF 计算单元格的值)。

实现这一目标的标准方法是使用 sklearn 的 CountVectorizer 并使用参数 min_df

from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(min_df=10)
X = cv.fit_transform(texts)

上述代码将文本数组转换为特征 X。设置min_df=10 将忽略所有出现次数少于 10 次的单词(据我了解,没有直接的方法可以说“取前 1000 个”,但是这个是等价的)。

我可以以某种方式利用 n-gram 吗?

是的,CountVectorizer 可以处理 n-gram。 ngram_range 参数指定要考虑的 ngram 范围(以“n”开头,以“n”结尾)。例如,

cv = CountVectorizer(min_df=10, ngram_range=(2,2))

将基于二元组而不是单个单词(一元组)构建特征。用于混合一元和二元

cv = CountVectorizer(min_df=10, ngram_range=(2,2))

然后您可以将 CountVectorizer 替换为 TfIdfVectorizer,它将字数转换为信息量更大的单词。

LSA 降维有用还是手动减少特征数量(所以向量维度)更好?

简短的回答,这取决于您的目的。我上面提到的链接中的示例确实首先应用了 LSA。而且,根据我的经验,像 LSA 或 NMF 这样的“主题模型”方法已经可以被认为是聚类到潜在语义主题中。例如,

from sklearn.decomposition import NMF
nmf = NMF(n_components=20)
mu = nmf.fit_transform(X)

这会将特征 X 转换为 20 维的投影特征向量 mu。每个维度 d 可以解释为主题 d 中文本的分数。通过将每个样本分配给得分最高的维度,这也可以解释为聚类。

【讨论】:

以上是关于从文本到 K-Means 向量输入的主要内容,如果未能解决你的问题,请参考以下文章

如何在sklearn中检查k-means中给定向量的集群细节

使用 Mahout 向量训练 Spark k-means

使用 TF-IDF 在 K-Means 中绘制质心

对 TF-IDF 特征向量中的特定特征进行加权,用于 k-means 聚类和余弦相似度

0A04 无监督学习:聚类 k-means

K-means Clustering of text data : 获取文本属于哪个簇