机器学习聚类分析——k-means文本聚类分析

最近比较喜欢听《认真的老去》这首歌,那就抓这个豆瓣评论做数据集吧,,做个评论的聚类分析。

一、抓到数据

抓出来140条评论~~ 

放代码~~ 

import requests

from bs4 import BeautifulSoup

start_page = 1

end_page = 7

data = []

while start_page <= end_page:

    html = BeautifulSoup(requests.get(url='https://music.douban.com/subject/26979930/comments/hot?p='.format(start_page)).text)

    data += [content.text for content in html.find_all('span',{'class':'short'})]

    start_page +=1

下面开始我们的聚类分析

  1. 文本通过jieba分词,

  2. 传递给CountVectorizer,统计出词频。

  3. 再传递给TfidfTransformer,统计出tf-idf值,

  4. 对tf-idf进行聚类计算。

放代码

from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer

from sklearn.cluster import KMeans

import jieba

vectorizer = CountVectorizer()

X = vectorizer.fit_transform([" ".join([b for b in jieba.cut(a)]) for a in data])

tfid = TfidfTransformer()

X = tfid.fit_transform(X.toarray())

那么我们聚合几类呢?

from sklearn import metrics

def easy_get_parameter_k_means(data):

    test_score = []

    n_clusters_end = 50

    n_clusters_start = 2

    while n_clusters_start <= n_clusters_end:

        km = KMeans(n_clusters=n_clusters_start)

        km.fit(data)

        clusters = km.labels_.tolist()

        score = metrics.silhouette_score(X=X,labels=clusters)

        num = sorted([(np.sum([1 for a in clusters if a==i]),i) for i in set(clusters)])[-1]

        test_score.append([n_clusters_start,score,num[0],num[1]])

        n_clusters_start += 1

    return pd.DataFrame(test_score,columns=['共分了几类','分数','最大类包含的个数','聚类的名称']).sort_values(by ='分数',ascending =False)

easy_get_parameter_k_means(X.toarray()) #得到最佳参数

算出应该分几类

这里用到了“轮廓系数”算法,用户计算聚类的分数。聚类的好不好。

综合考虑, 分成11个簇 是最佳的聚类效果,带入参数。

最后看分类结果:

似乎,还不错噢~ 

原创(AI_大数据)文章,公众号首发,欢迎您的关注

打赏作者(下图),未来写出更好的文章及教程

猜你喜欢

转载自blog.csdn.net/CreateABetter/article/details/81634397
今日推荐