python数据分析:新闻⽂本聚类
⽂本聚类
⽂本聚类就是要在⼀堆⽂档中,出哪些⽂档具有较⾼的相似性,然后可以针对这些相似性⽂档的聚合进⾏类别划分。⽂本聚类应⽤场景:提供⼤规模⽂档集进⾏类别划分并提取公共内容的概括和总览;到潜在的各个⽂档间的相似度以进⾏相似度判别、类别修正,以减少浏览相似⽂档和信息的时间和精⼒。
通常,聚类分析(也包括其他算法)⼤多是针对数值型做计算的,K均值这类基于聚类的算法要求只有数值型变量才能得到距离相似度。对于⽂本聚类⽽⾔,由于不同⽂本集出现的全部都是⽂字内容,因此⽆法直接针对这些⽂本进⾏聚类。
使⽤TF-IDF⽅法做word to vector
word to vector(⽂本转向量或词语转向量)。先定义⼀批要去除的词语列表,定义列表时使⽤u来表⽰是unicode字符串;然后使⽤sklearn.的TfidfVectorizer⽅法创建词语转向量的对象,使⽤fit_transform⽅法将评论关键字列表转换为词向量空间模型。TfidfVectorizer⽅法参数如下:
stop_words:指定为⾃定义的去除词的列表,不指定默认会使⽤英⽂的停⽤词列表。
tokenizer:⽤来设置定义的分词器,这⾥是在上⾯⾃定义的结巴分词。默认的分词器对于英⽂下⼯作良好,但对于中⽂来讲效果不佳。
use_idf:设置为True指定TF-IDF⽅法做词频转向量。
实现
获取新浪财经⾸页当天新闻,做分词和词向量化,通过关键词进⾏kmeans聚类,对新闻进⾏分类:
# 导⼊库
import numpy as np
import pandas as pd
from sklearn. import TfidfVectorizer # 基于TF-IDF的词频转向量库
from sklearn.cluster import KMeans
import jieba.posseg as pseg
import newspaper
import requests # 导⼊爬⾍库
from bs4 import BeautifulSoup
import datetime as dt
today = day().strftime("%Y-%m-%d")# 过去今天时间
# 中⽂分词
def jieba_cut(comment):
word_list =[]# 建⽴空列表⽤于存储分词结果
seg_list = pseg.cut(comment)# 精确模式分词[默认模式]
for word in seg_list:
if word.flag in['ns','n','vn','v','nr']:# 选择属性
word_list.append(word.word)# 分词追加到列表
return word_list
# 获取新闻内容
def get_news():
response = ('finance.sina')
html = t.decode('utf-8')
soup = BeautifulSoup(html,'lxml')
all_a = soup.find_all('a')
comment_list =[]# 建⽴空列表⽤于存储分词结果
for a in all_a:
try:
url = a['href']
if('finance.sina'in url)&(today in url):
article = newspaper.Article(url, language='zh')
# 下载⽂章
article.download()
# 解析⽂章
article.parse()
# 对⽂章进⾏nlp处理
article.nlp()
# 获取⽂章的内容
article_words ="".join(article.keywords)
comment_list.append(article_words)
except:pass
return comment_list
comment_list = get_news()
# print(comment_list)
# word to vector
# 加载停⽤词
stop_words =[line.strip()for line in open('', encoding='gbk').readlines()]
vectorizer = TfidfVectorizer(stop_words=stop_words, tokenizer=jieba_cut, use_idf=True)# 创建词向量模型
X = vectorizer.fit_transform(comment_list)# 将评论关键字列表转换为词向量空间模型
# K均值聚类
model_kmeans = KMeans(n_clusters=3)# 创建聚类模型对象
model_kmeans.fit(X)# 训练模型
# 聚类结果汇总
cluster_labels = model_kmeans.labels_ # 聚类标签结果
word_vectors = _feature_names()# 词向量
word_values = X.toarray()# 向量值
comment_matrix = np.hstack((word_values, shape(word_values.
shape[0],1)))# 将向量值和标签值合并为新的矩阵
word_vectors.append('cluster_labels')# 将新的聚类标签列表追加到词向量后⾯
comment_pd = pd.DataFrame(comment_matrix, columns=word_vectors)# 创建包含词向量和聚类标签的数据框
_csv('comment.csv')
print(comment_pd.head(1))# 打印输出数据框第1条数据
# 聚类结果分析
comment_cluster1 = comment_pd[comment_pd['cluster_labels']==1].drop('cluster_labels', axis=1)# 选择聚类标签值为1的数据,并删除最后⼀列word_importance = np.sum(comment_cluster1, axis=0)# 按照词向量做汇总统计
print(word_importance.sort_values(ascending=False)[:5])# 按汇总统计的值做逆序排序并打印输出前5个词
结果如下:
4s店⼀事⼀体⼀况⼀分钱...龙庆龙虎榜龚宇龚梦泽 cluster_labels
python中文文档00.00.00.00.0.00.00.00.00.0
[1 rows x 9359 columns]
市场 6.062049
基⾦ 5.774565
经济 4.110287
银⾏ 3.512937
企业 3.502570
dtype: float64
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论