从文本到K-Means向量输入

我刚刚开始深入学习机器学习,特别是聚类分析。(我使用的是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上的得分。通过将每个样本分配给得分最高的维度,这也可以被解释为一种聚类方式。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注