我刚刚开始深入了解机器学习,特别是进入群集。 (我正在使用Python,但这是无关紧要的) 我的目标是,从一系列关于时尚界的推文(100K)开始,在他们的文本上表演KMeans。
直到现在我已经过滤了文本,截断了停用词,无用的术语,标点符号;完成词形还原(利用词性标注以获得更好的结果)。
我向用户展示最常用的术语,主题标签,双字母组,三元组,... 9格,以便他可以优化预处理,将单词添加到无用的术语中。
我最初的想法是使用前n(1K)项作为功能, 创建foreach tweet一个固定大小的矢量n(1K) 将一个单元格设置为一个值,如果这个推文中出现了这个单元格的顶部术语(可能用TFIDF计算单元格的值)。
我错过了什么(会考虑0值)吗?我可以用某种方式利用n-gram吗?
这scikit article很普遍,我不了解整个事情。
(LSA降维是否有用还是更好地手动减少特征数量(因此向量维度)?)
答案 0 :(得分:3)
此other sklearn page包含k-means文本聚类的示例。
但要解决一些具体问题:
我最初的想法是使用前n(1K)项作为特征,创建foreach tweet一个固定大小为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))
将基于双字母而不是单个单词(unigrams)构建功能。混合unigrams和bigrams
cv = CountVectorizer(min_df=10, ngram_range=(2,2))
然后你可以用TfIdfVectorizer替换一个CountVectorizer,它可以转换单词计数以加权更多信息单词。
LSA维数降低是否有用还是更好地手动减少要素数量(因此向量维度)?
简短回答,这取决于你的目的。我上面提到的链接中的示例首先应用LSA。而且,根据我的经验,"主题模型"像LSA或NMF这样的方法可以被认为是潜在语义主题的聚类。例如,
from sklearn.decomposition import NMF
nmf = NMF(n_components=20)
mu = nmf.fit_transform(X)
这会将特征X转换为20维的投影特征向量mu。每个维度d可以被解释为主题d中的文本的分数。通过将每个样本分配给具有最大分数的维度,这也可以解释为群集。