我刚刚开始深入学习机器学习,特别是聚类分析。(我使用的是Python,但这并不重要)我的目标是从关于时尚界的10万条推文集合开始,对它们的文本进行KMeans聚类分析。
到目前为止,我已经过滤了文本,删除了停用词、无用词和标点符号;进行了词形还原(利用词性标注以获得更好的结果)。
我向用户展示最常见的术语、标签、二元组、三元组…九元组,以便用户可以通过添加词汇到无用词列表中来改进预处理过程。
我的初步想法是使用前n(1000)个术语作为特征,为每条推文创建一个固定大小为n(1000)的向量,如果推文中出现了该单元格的顶级术语,则该单元格设置为一个值(可能使用TFIDF计算单元格的值)。
我是否遗漏了什么(零值会被考虑吗)?我能以某种方式利用n-gram吗?
这篇scikit文章非常概括,我没有完全理解整个内容。
(LSA降维有用吗,还是手动减少特征数量(因此向量的维度)更好?)
回答:
这个其他的sklearn页面包含了文本的k-means聚类分析示例。
但为了回答你的一些具体问题:
我的初步想法是使用前n(1000)个术语作为特征,为每条推文创建一个固定大小为n(1000)的向量,如果推文中出现了该单元格的顶级术语,则该单元格设置为一个值(可能使用TFIDF计算单元格的值)。
实现这一目标的标准方法是使用sklearn的CountVectorizer,并调整参数min_df
。
from sklearn.feature_extraction.text import CountVectorizercv = 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))
然后你可以用TfIdfVectorizer替换CountVectorizer,后者将词计数转换为更突出信息丰富词的权重。
LSA降维有用吗,还是手动减少特征数量(因此向量的维度)更好?
简短回答是,这取决于你的目的。我上面提到的链接中的示例确实首先应用了LSA。但是,在我的经验中,像LSA或NMF这样的“主题模型”方法已经可以被视为对潜在语义主题的聚类。例如,
from sklearn.decomposition import NMFnmf = NMF(n_components=20)mu = nmf.fit_transform(X)
这将把特征X转换为20维的投影特征向量mu。每个维度d可以被解释为文本在主题d上的得分。通过将每个样本分配给得分最高的维度,这也可以被解释为一种聚类方式。