【问题标题】:From text to K-Means Vectors input从文本到 K-Means 向量输入
【发布时间】:2016-08-25 02:20:09
【问题描述】:

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

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

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

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

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

这个scikit article 很笼统,我不明白整个事情。

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

【问题讨论】:

    标签: machine-learning scikit-learn data-mining k-means feature-extraction


    【解决方案1】:

    这个other sklearn page 包含一个k-means 文本聚类的例子。

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

    我最初的想法是使用前 n(1K) 项作为特征,为每个推文创建一个固定大小 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))
    

    将基于二元组而不是单个单词(一元组)构建特征。用于混合一元和二元

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

    然后您可以将 CountVectorizer 替换为 TfIdfVectorizer,它将字数转换为信息量更大的单词。

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

    简短的回答,这取决于您的目的。我上面提到的链接中的示例确实首先应用了 LSA。而且,根据我的经验,像 LSA 或 NMF 这样的“主题模型”方法已经可以被认为是聚类到潜在语义主题中。例如,

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-14
      • 2019-04-06
      • 2014-09-30
      • 2018-04-06
      • 2015-04-07
      • 2013-06-23
      • 2018-01-18
      • 2017-03-16
      相关资源
      最近更新 更多