首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中使用Scipy层次聚类进行文本聚类

在Python中使用Scipy层次聚类进行文本聚类
EN

Stack Overflow用户
提问于 2017-04-30 21:42:11
回答 2查看 3.4K关注 0票数 2

我有一个文本语料库,其中的每一行都包含1000+文章。我正在尝试使用python中的Scipy来使用层次聚类来生成相关文章的集群。这是我用来进行聚类的代码

代码语言:javascript
复制
# Agglomerative Clustering
import matplotlib.pyplot as plt
import scipy.cluster.hierarchy as hac
tree = hac.linkage(X.toarray(), method="complete",metric="euclidean")
plt.clf()
hac.dendrogram(tree)
plt.show() 

我得到了这张图

然后我用fcluster()在第三层砍掉了树。

代码语言:javascript
复制
from scipy.cluster.hierarchy import fcluster
clustering = fcluster(tree,3,'maxclust')
print(clustering)

我得到了这个输出:2 2 2 ...,2 2 2

我的问题是,如何找到每个集群中最常见的前10个单词,以便为每个集群建议一个主题?

EN

回答 2

Stack Overflow用户

发布于 2017-05-31 13:43:47

您可以执行以下操作:

  1. 将您的结果( clustering变量)与您的输入( 1000+ articles).
  2. Using pandas库)对齐,您可以使用以集群#作为其键的
  3. 。对于每个组(使用get_group function),为您的每个单词填充整数defaultdict现在可以按降序对单词统计字典进行排序,并获得所需的最常用单词数。

<clustering>G213defaultdict>

祝你所做的一切顺利,如果这是你想要的,请接受我的回答。

票数 0
EN

Stack Overflow用户

发布于 2021-04-04 06:02:35

我会这么做的。给定一个带有文章名称和文章文本的df,如下所示

代码语言:javascript
复制
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 2 columns):
 #   Column    Non-Null Count  Dtype 
---  ------    --------------  ----- 
 0   Argument  6 non-null      object
 1   Article   6 non-null      object
dtypes: object(2)
memory usage: 224.0+ bytes

创建文章矩阵

代码语言:javascript
复制
from scipy.cluster.hierarchy import linkage, fcluster
from sklearn.feature_extraction.text import CountVectorizer

# initialize
cv = CountVectorizer(stop_words='english') 
cv_matrix = cv.fit_transform(df['Article']) 
# create document term matrix
df_dtm = pd.DataFrame(
    cv_matrix.toarray(), 
    index=df['Argument'].values, 
    columns=cv.get_feature_names()
)
tree = hierarchy.linkage(df_dtm, method="complete", metric="euclidean")

然后获取所选的聚类

代码语言:javascript
复制
clustering = fcluster(tree, 2, 'maxclust')

并将群集添加到df_dtm

代码语言:javascript
复制
df_dtm['_cluster_'] = clustering
df_dtm.index.name = '_article_'
df_word_count = df_dtm.groupby('_cluster_').sum().reset_index().melt(
    id_vars=['_cluster_'], var_name='_word_', value_name='_count_'
)

最后,取最常用的第一个单词

代码语言:javascript
复制
words_1 = df_word_count[df_word_count._cluster_==1].sort_values(
    by=['_count_'], ascending=False).head(3)
words_2 = df_word_count[df_word_count._cluster_==2].sort_values(
    by=['_count_'], ascending=False).head(3)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43707062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档