最近比较喜欢听《认真的老去》这首歌,那就抓这个豆瓣评论做数据集吧,,做个评论的聚类分析。
一、抓到数据
抓出来140条评论~~
放代码~~
import requests
from bs4 import BeautifulSoup
start_page = 1
end_page = 7
data = []
while start_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
下面开始我们的聚类分析
文本通过jieba分词,
传递给CountVectorizer,统计出词频。
再传递给TfidfTransformer,统计出tf-idf值,
对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
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_大数据)文章,公众号首发,欢迎您的关注
打赏作者(下图),未来写出更好的文章及教程
领取专属 10元无门槛券
私享最新 技术干货