从文本到 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中给定向量的集群细节