从文本到 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 中文本的分数。通过将每个样本分配给具有最大分数的维度,这也可以解释为聚类。
我刚刚开始研究机器学习,特别是聚类。 (我正在使用 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 中文本的分数。通过将每个样本分配给具有最大分数的维度,这也可以解释为聚类。