【问题标题】:sklearn decomposition top termssklearn 分解热门词
【发布时间】:2014-12-14 13:14:00
【问题描述】:

有没有一种方法可以在数据分解时确定每个集群的主要特征/术语?

在 sklearn 文档中的示例中,通过对特征进行排序并与矢量化器 feature_names 进行比较来提取最重要的术语,两者具有相同数量的特征。

http://scikit-learn.org/stable/auto_examples/document_classification_20newsgroups.html

我想知道如何实现get_top_terms_per_cluster():

X = vectorizer.fit_transform(dataset)  # with m features
X = lsa.fit_transform(X)  # reduce number of features to m'
k_means.fit(X)
get_top_terms_per_cluster()  # out of m features

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    假设lsa = TruncatedSVD(n_components=k) 对一些k,获得术语权重的明显方法是利用LSA/SVD 是线性变换这一事实,即lsa.components_ 的每一行是输入术语的加权和,您可以将其与 k-means 中的聚类质心相乘。

    让我们设置一些东西并训练一些模型:

    >>> from sklearn.datasets import fetch_20newsgroups
    >>> from sklearn.feature_extraction.text import TfidfVectorizer
    >>> from sklearn.cluster import KMeans
    >>> from sklearn.decomposition import TruncatedSVD
    >>> data = fetch_20newsgroups()
    >>> vectorizer = TfidfVectorizer(min_df=3, max_df=.95, stop_words='english')
    >>> lsa = TruncatedSVD(n_components=10)
    >>> km = KMeans(n_clusters=3)
    >>> X = vectorizer.fit_transform(data.data)
    >>> X_lsa = lsa.fit_transform(X)
    >>> km.fit(X_lsa)
    

    现在将 LSA 分量和 k-means 质心相乘:

    >>> X.shape
    (11314, 38865)
    >>> lsa.components_.shape
    (10, 38865)
    >>> km.cluster_centers_.shape
    (3, 10)
    >>> weights = np.dot(km.cluster_centers_, lsa.components_)
    >>> weights.shape
    (3, 38865)
    

    然后打印;由于 LSA 中的符号不​​确定性,我们需要权重的绝对值:

    >>> features = vectorizer.get_feature_names()
    >>> weights = np.abs(weights)
    >>> for i in range(km.n_clusters):
    ...     top5 = np.argsort(weights[i])[-5:]
    ...     print(zip([features[j] for j in top5], weights[i, top5]))
    ...     
    [(u'escrow', 0.042965734662740895), (u'chip', 0.07227072329320372), (u'encryption', 0.074855609122467345), (u'clipper', 0.075661844826553887), (u'key', 0.095064798549230306)]
    [(u'posting', 0.012893125486957332), (u'article', 0.013105911161236845), (u'university', 0.0131617377000081), (u'com', 0.023016036009601809), (u'edu', 0.034532489348082958)]
    [(u'don', 0.02087448155525683), (u'com', 0.024327099321009758), (u'people', 0.033365757270264217), (u'edu', 0.036318114826463417), (u'god', 0.042203130080860719)]
    

    请注意,您确实需要一个停用词过滤器才能使其正常工作。停用词往往会出现在每个单独的组件中,并在每个聚类质心中获得很高的权重。

    【讨论】:

    • 非常感谢您的回答,您能解释一下为什么这是正确的直觉吗?
    • @OferHelman:LSA 组件是术语的线性组合。 k-means 质心是 LSA 分量的线性组合。基本线性代数告诉我们,我们可以将两者相乘,将它们组合成一组单项线性组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多