使用 Python 进行无监督文本分类:Kmeans

数据挖掘 机器学习 Python nlp k-均值 文本分类
2022-02-27 03:12:15

我正在做一个项目来构建一个被问问题的文本分类器。我的数据中没有提供任何标签,所以我选择了无监督的方法。此解决方案需要阅读一个新问题,并确定它属于哪个分类类别

我一直在研究 KMeans 模型,但尽管我尝试了一切,但还是无法获得任何体面的结果。我什至手动选择了一个数据集,手动对其进行了进一步清理以使其尽可能简单,并且我的集群仍然重叠,并且我得到了 0.26015371238537227 的低轮廓分数(这是我能够做到的最高得到)。我的原始数据不是很好,但我仍然不明白当我手动选择/清理最佳示例以用作测试时它的表现如何。我在下面包含了我的 kmeans 部分的代码。

有没有人有什么建议?我在这里有点不知所措。有没有其他好的方法来分类未标记的文本?我对这类工作也比较陌生,这也是我的第一个基于 ML 的项目,所以我确信也存在一些知识差距。我准备放弃无监督的方法并做一些手动工作来自己标记数据并建立一个有监督的模型。想我会先检查这里,看看是否所有的希望都失去了。任何帮助是极大的赞赏!

    data = pd.DataFrame(text)
    data.columns = ['KM']
    tfidf = TfidfVectorizer(max_df=0.80, min_df=5, max_features=10000)
    text = tfidf.fit_transform(data['KM'].values.astype('U'))

    kmeans = KMeans(n_clusters=8, init='k-means++', max_iter=300, n_init=10, 
    random_state=20)
    kmeans.fit(text)

    clusters = kmeans.predict(text)

    pca = PCA(n_components=2)
    two_dim = pca.fit_transform(text.todense())

    scatter_x = two_dim[:, 0]
    scatter_y = two_dim[:, 1]

    plt.style.use('ggplot')

    fig, ax = plt.subplots()
    fig.set_size_inches(20,10)

    cmap = {0: 'green', 1: 'blue', 2: 'red', 3: 'orange', 4: 'black', 5: 'purple', 6: 
    'yellow', 7: 'pink'}

    for group in np.unique(clusters):
        ix = np.where(clusters == group)
        ax.scatter(scatter_x[ix], scatter_y[ix], c=cmap[group], label=group)

    ax.legend()
    plt.xlabel('PCA 0')
    plt.ylabel('PCA 1')
    plt.show()

    order_centroids = kmeans.cluster_centers_.argsort()[:, ::-1]

    terms = tfidf.get_feature_names()
    for i in range(8):
        print("Cluster %d:" % i, end='')
        for ind in order_centroids[i, :10]:
            print(' %s' % terms[ind], end='')
        print()


    score = silhouette_score(text, labels=kmeans.predict(text))
    print(score)  
1个回答

如果您的问题相对较短且标签数量不多,我强烈建议您看一下零样本分类,它可用于将数据分类到类别而无需训练模型。多类和多标签分类都是可能的。

具体来说,我建议使用预训练的语言模型,例如BART MNLI

您可以使用一些问题和标签开箱即用地试用它,看看它是如何工作的:试试

根据我的经验,我认为无监督的方法不会产生预期的结果。因此,如果由于某种原因无法进行零样本分类,我建议您尝试使用类似snorkel的方法以编程方式构建一些训练数据。