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