从文本到 K-Means 向量输入

From text to K-Means Vectors input

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

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

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

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

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

这个 scikit article 很笼统,我没有完全理解。

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

other sklearn page 包含文本的 k 均值聚类示例。

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

My initial idea was to use the top n(1K) terms as features, creating foreach tweet a vector of fixed size n(1K) having a cell set to a value if the top term (of this cell) appear in this tweet (maybe calculating the cell's value with 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次的单词(据我理解,没有直接的方法说"take the top 1000" 但这是等价的)。

Can I exploit n-grams in some way?

是的,CountVectorizer 可以处理 n-gram。 ngram_range 参数指定要考虑的 ngram 范围(从 "n" 开始到 "n" 结束)。例如,

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

将基于双字母组而不是单个单词 (unigrams) 构建特征。用于混合 unigrams 和 bigrams

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

然后您可以将 CountVectorizer 替换为 TfIdfVectorizer,TfIdfVectorizer 会转换字数以对信息量更大的字进行加权。

Is LSA dimensionality reduction useful or is it better reducing the number of features (so vectors dimension) manually?

简短的回答,这取决于你的目的。我上面提到的 link 中的示例确实首先应用了 LSA。而且,根据我的经验,"topic model" 方法(如 LSA 或 NMF)已经可以被视为潜在语义主题的聚类。例如,

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

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