数据分析案例实战:贝叶斯-新闻分类
学习唐宇迪《python数据分析与机器学习实战》视频
一、数据分析
每一条包括:
theme:新闻关键内容
category:新闻种类
URL:链接
content:新闻内容
额,看着很不舒适……
二、数据预处理
(一)读入数据
import pandas as pd
import jieba#结巴分词模块
import numpy
df_news=pd.read_table('./data/val.txt',names=['category','theme','URL','content'],encoding='utf-8')
df_news=df_news.dropna()
print(df_news.shape)
df_news.head()
(二)使用jieba分词器进行分词
content=df_news.content.values.tolist()
#df_news的content列中,用.values拿到该列值,.tolist代表转换成list格式。
print(content[1000])
content_S=[]
#对每条新闻进行分词
for line in content:current_segment=jieba.lcut(line)if len(current_segment)>1 and current_segment!='\r\n':content_S.append(current_segment)
content_S[1000]
输出索引为1000的该条新闻
输出索引为1000的该条新闻分词后的结果
将分词的结果转换成DateFrame表格形式
#将分词结果转换成DataFrame表格,只有content列
df_content=pd.DataFrame({'content_S':content_S})
df_content.head()
(三)停用词处理
pandas.read_csv(...)
·filepath_or_buffer : str,path对象或类文件对象
·sep : str,默认','分隔符使用。
·index_col : int,sequence或bool,可选。用作DataFrame的行标签的列。
·names : 类似数组,可选。要使用的列名列表。
·quoting : int或csv.QUOTE_ *实例,默认为0。当文本文件中带有英文双引号时,直接用pd.read_csv进行读取会导致行数减少,此时应该对read_csv设置参数quoting=3或者quoting=csv.QUOTE_NONE
·encoding : str,可选。编码以在读/写时使用UTF(例如'utf-8')。
读入停用词文本
#读入停用词文本
stopwords=pd.read_csv('stopwords.txt',index_col=False,sep='\t',quoting=3,names=['stopwords'],encoding='utf-8')
stopwords.head(20)
去除停用词
#去除停用词
def drop_stopwords(contents,stopwords):contents_clean=[]all_words=[]for line in contents:line_clean=[]for word in line:if word in stopwords:continueline_clean.append(word)all_words.append(str(word))contents_clean.append(line_clean)return contents_clean,all_wordscontents=df_content.content_S.values.tolist()
stopwords=stopwords.stopwords.values.tolist()
contents_clean,all_words=drop_stopwords(contents,stopwords)
df_content=pd.DataFrame({'contents_clean':contents_clean})
df_content.head()
#可以看到一些停用词被去掉了,如果想去掉字母的话,将字母加入停用词文本即可
df_all_words=pd.DataFrame({'all_words':all_words})
print(len(df_all_words))
df_all_words.head()
(四)关键词提取
计算所有词语出现的次数
# groupby 以什么为基本。agg() 可以加函数,字符串,字典或字符串/函数列表
# words_count = df_all_words['all_words'].groupby(by=df_all_words['all_words']).agg({'count': numpy.size})
words_count=df_all_words.groupby(by=['all_words'])['all_words'].agg({'count':numpy.size})
# 重置索引,旧索引将作为列添加,可以使用drop参数来避免将旧索引添加为列
words_count=words_count.reset_index().sort_values(by=['count'],ascending=False)
words_count.head()
制作词云
from wordcloud import WordCloud
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib
matplotlib.rcParams['figure.figsize'] = (10.0, 5.0)wordcloud=WordCloud(font_path="./data/simhei.ttf",background_color="white",max_font_size=80)
#字体和颜色
word_frequence = {x[0]:x[1] for x in words_count.head(100).values} #前100个词
wordcloud=wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)
plt.show()
提取关键词
#使用jieba 和 sklearn都可以进行关键词提取
import jieba.analyse
index=2400
print(df_news['content'][index])
# str.join(sequence) sequence中用str连接
content_S_str=''.join(content_S[index])
#jieba.analyse.extract_tags 找出关键词。
print(' '.join(jieba.analyse.extract_tags(content_S_str,topK=5,withWeight=False)))
(五)LDA主题模型
from gensim import corpora,models,similarities
import gensim
# 做映射,相当于词袋 输入为ist of list形式
# 单词及其整数id之间的映射。可以理解为python中的字典对象,
# 其Key是字典中的词,其Val是词对应的唯一数值型ID
dictionary=corpora.Dictionary(contents_clean)
# 将文档转换为词袋(BoW)格式= (token_id,token_count)元组的列表。
# doc2bow(document,allow_update = False,return_missing = False )
# 输入为list of str
corpus=[dictionary.doc2bow(sentence) for sentence in contents_clean]
#类似Kmeans自己指定K值
lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)
#第一类主题,显示频率最高的5个
#print(lda.print_topic(1,topn=5))
#20个分类结果
for topic in lda.print_topics(num_topics=20,num_words=5):print(topic[1])
三、用贝叶斯算法进行分类
(一)数据准备
#contents列和category列
df_train=pd.DataFrame({'contents_clean':contents_clean,'label':df_news['category']})
df_train.tail()
#标签种类
df_train.label.unique()
#将标签转换成数值
label_mapping = {"汽车": 1, "财经": 2, "科技": 3, "健康": 4, "体育":5, "教育": 6,"文化": 7,"军事": 8,"娱乐": 9,"时尚": 0}
df_train['label'] = df_train['label'].map(label_mapping)
df_train.head()
(二)划分训练集和测试集
#划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(df_train['contents_clean'].values,df_train['label'].values,random_state=1)
x_train[0][1]
(三)list文本转换成string格式(训练集)
#将list文本转换成string格式
words=[]
for line_index in range(len(x_train)):try:words.append(' '.join(x_train[line_index]))except:print(line_index,word_index)
words[0]
(四)使用CountVectorizer转换成向量形式
#使用CountVectorizer
from sklearn.feature_extraction.text import CountVectorizervec = CountVectorizer(analyzer='word', max_features=4000, lowercase = False)
vec.fit(words)
(五)贝叶斯分类器进行分类
#用于多项式模型的朴素贝叶斯分类器
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(vec.transform(words), y_train)
'''
transform(raw_documents )
将文档转换为文档术语矩阵,使用符合fit的词汇表或提供给构造函数的词汇表,从原始文本文档中提取令牌计数。
返回为:文档术语矩阵
'''
测试集数据处理
test_words = []
for line_index in range(len(x_test)):try:#x_train[line_index][word_index] = str(x_train[line_index][word_index])test_words.append(' '.join(x_test[line_index]))except:print (line_index,word_index)
test_words[0]
分类结果准确率
#返回给定测试数据和标签的平均准确度
classifier.score(vec.transform(test_words), y_test)
(六)使用tdidf矢量器转换成向量形式
#使用tdidf矢量器
#TfidfVectorizer:多个词组可以不同組合,词库数量变多
from sklearn.feature_extraction.text import TfidfVectorizervectorizer = TfidfVectorizer(analyzer='word', max_features=4000, lowercase = False)
vectorizer.fit(words)
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(vectorizer.transform(words), y_train)
分类结果
classifier.score(vectorizer.transform(test_words), y_test)
数据分析案例实战:贝叶斯-新闻分类相关推荐
- 新闻数据分析:jieba关键词提取、LDA主题生成、贝叶斯新闻分类
news_analysis.ipynb import pandas as pd import jieba import numpy #pip install jieba 数据源:http://www. ...
- 机器学习实战-贝叶斯算法-24
贝叶斯-新闻分类 from sklearn.datasets import fetch_20newsgroups from sklearn.model_selection import train_t ...
- 八、朴素贝叶斯中文分类实战
1.朴素贝叶斯中文分类实战 文本分类的流程如下图所示: 朴素贝叶斯中文分类的目录结构 中文分类的目录机构包括停用词文件.训练集文件和和测试集文件,具体内容如下图所示: 2 数据准备与处理 2.1 数据 ...
- 朴素贝叶斯实现分类_关于朴素贝叶斯分类及其实现的简短教程
朴素贝叶斯实现分类 Naive Bayes classification is one of the most simple and popular algorithms in data mining ...
- 朴素贝叶斯算法-分类算法
朴素贝叶斯算法-分类算法 1 概率基础 概率定义为一件事情发生的可能性 联合概率:包含多个条件,且所有条件同时成立的概率,记作P(A,B) 条件概率:事件A在另一个事件B已经发生条件下的发送概率,记作 ...
- 视频教程-Python数据分析案例实战 视频课程-Python
Python数据分析案例实战 视频课程 计算机硕士,多年工作经验,技术和产品负责人. 多年推荐系统/NLP/大数据工作经验. 负责公司多个AI项目产品落地,包括文本分类.关键词抽取.命名实体识别.对话 ...
- python数据分析实战案例-Python数据分析案例实战
原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...
- python 数据分析 实际案例-Python数据分析案例实战
原标题:Python数据分析案例实战 至今我们网站已经开设了多个数据分析系列的课程,大部分都是基于算法思路来开展的,课程中着重点在于算法的讲授.软件的使用,案例只是辅助学习.然而很多学员反映,希望可以 ...
- 【海量数据挖掘/数据分析】之 贝叶斯信念网络(贝叶斯信念网络、有向无环图、贝叶斯公式、贝叶斯信念网络计算实例)
[海量数据挖掘/数据分析]之 贝叶斯信念网络(贝叶斯信念网络.有向无环图.贝叶斯公式.贝叶斯信念网络计算实例) 目录 [海量数据挖掘/数据分析]之 贝叶斯信念网络(贝叶斯信念网络.有向无环图.贝叶斯公 ...
最新文章
- 企业数字化转型,AI平台能力建设是关键
- 1、SpringBoot------表单校验
- 【算法】梯度消失与梯度爆炸
- boost::msm::mpl_graph::adjacency_list_graph相关的测试程序
- java 数组用字符做下表_JAVA字符串json数组使用Formatter格式化成表格形式
- [渝粤教育] 中国地质大学 大学英语(6) 复习题
- ueditor工具栏弹出html,UEditor工具栏上自定义按钮、图标、事件、窗口页面
- matlab在activex中读取视频,[转载]matlab读取excel数据并显示在excel(activex控件)中
- 反射可以使用lambda吗_必读干货帖|车载对讲机使用地网天线可以降低驻波吗?...
- 49 字符大小写排序
- [基础篇]PHP引用变量
- css中字体的大小怎么设置,css样式中怎么设置字体大小
- ureport2项目使用
- 常微分方程的解析解(方法归纳)以及基于Python的二阶微分方程边值问题的数值算例实现
- 国开大学c语言程序设计形考任务1,国开电大《数控编程技术》形考任务1-4答案...
- 机器学习方法的基本分类
- C语言写的一个贪吃蛇小游戏(windows系统)
- asp.net体育用品销售系统
- 这15部评分9.0以上纪录片,让你放假后足不出户就可以看遍世界!(附链接)
- 利用Javascript制作宾果(BINGO)游戏
热门文章
- Android中Textview文字设置不同颜色、下划线、加粗、超链接
- 奔跑吧Caffe(在MNIST手写体数字集上用Caffe框架训练LeNet模型)
- linux查询数据库oracle端口,Oracle数据库常用命令、Linux监听配置、oracle linux下开放1521端口...
- 流量暴增基建告急 网络重构需二次投资
- 二手小米价格一览表2022.2.21
- Anaconda安装keras简记
- 科研项目研究报告文本内容格式
- 直播预告 | IAST安装与使用,今晚8点,不见不散~
- 系统移植1------U-Boot
- 属牛的女孩起名:高贵有气质的女孩名字怎么取