由于看了多篇文章还是对处理流程迷迷糊糊,所以自己重新整理了分类流程:
参考博客

一.新闻文本进行分类预测。流程如下:



二.代码部分:

1. 文本分词

就是将获取到的新闻数据,转化成有一个个词语组成的样式。新闻的数据是由搜狗实验室提供,可以根据链接进行获取,这里使用的数据是已经经过清洗后的数据,直接进行加载(关于文章中使用的数据,包括处理后的新闻数据和停用词数据,已经上传至资源,可以自行下载)

1.1 数据加载

import pandas as pd
import jieba #既然涉及到分词,最常用,也是最成熟的一个包就是jieba了
#pip install jiebadf_news = pd.read_table('./data/val.txt',names=['category','theme','URL','content'],encoding='utf-8')
df_news = df_news.dropna()#默认删除any带nan的数据行
df_news.head()#默认读取前5行


输出的结果为:(Category:当前新闻所属的类别,一会我们要进行分别任务,这就是标签了。Theme:新闻的主题,这个咱们先暂时不用,大家在练习的时候也可以把它当作特征。URL:爬取的界面的链接,方便检验爬取数据是不是完整的,这个咱们暂时也不需要。Content:新闻的内容,这些就是一篇文章了,里面的内容还是很丰富的。)

1.2分词:使用结吧分词器

next:根据文章的内容来进行类别的划分,先把文章进行分词,把它转换成向量。

#df_news的content列中,用.values拿到该列值,.tolist代表转换成list格式。
content = df_news.content.values.tolist()#将每一篇文章转换成一个lis
print (content[4999])#选择最后一篇文章看看

[out]全球最美女人合成图::国整形外科教授李承哲,在国际学术杂志美容整形外科学会学报发表了考虑种族和民族脸型多样性的黑人、白人、中国人、日本人女性“最具魅力的脸型”的论文。李承哲合成这些脸型时采用的演艺人脸型有,黑人13名、白人16名、中国人20名、日本人14名等共63名的脸型。M贾凶宰笙蛴乙来挝:黑人美女、白人美女、中国美女、日本美女和韩国美女。

1.3 jieba分词基本步骤

使用jieba分词筛选结果的五步骤:

  • 在遍历数据之前创建一个空列表,用于存放数据,
  • 然后在依次遍历存放新闻数据的列表,获取每一篇新闻数据,
  • 使用jieba.lcut()方法对文本进行分词,
  • 接着就是剔除掉字符个数小于等于1个的词语,还有顺带去掉换行符(也可以按照自己的格式要求进行剔除)
  • 最后就是将满足的结果添加到最初创建的空列表中
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[4999]#分词之后的结果可以进行查看,也可以将其转换为DataFrame数据


因为分词后的内容是列表,可以直接使用字典套列表的形式创建DataFrame,而字典的键就是分词的结果的列名

#df_content=pd.DataFrame({'content_S':content_S[4999]})#专门展示分词后的结果
df_content=pd.DataFrame({'content_S':content_S})
df_content.head()


创建的DataFrame数据可以用于绘制词云图,从分词后的结果可以看出,虽然剔除了部分数据,但是还是有很多不是我们想看到的内容,比如冒号空格,句号空格等。因此绘制词云图之前需要先剔除一些常见的不是很重要的词语,前面的是初加工筛选,这里就要精加工筛选了,为了避免一个个手动剔除常见的一些不重要的词汇,所以就有了停用词字典这个概念,凡是分词结果后的词语在这个停用词范围中的,都将被舍弃

1.4加载停用词字典数据进行数据清洗

#不设置quoting,默认会去除英文双引号,只留下英文双引号内的内容,设置quoting = 3,会如实读取内容。
stopwords=pd.read_csv("stopwords.txt",index_col=False,sep="\t",quoting=3,names=['stopword'], encoding='utf-8')#index_col=False——重新设置一列成为index值
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_words#print (contents_clean)contents = df_content.content_S.values.tolist()#.values.tolist()--pandas DataFrame数据转为list
stopwords = stopwords.stopword.values.tolist()
contents_clean,all_words = drop_stopwords(contents,stopwords)#df_content.content_S.isin(stopwords.stopword)
#df_content=df_content[~df_content.content_S.isin(stopwords.stopword)]
#df_content.head()
#将处理后的结果转化为DataFrame数据
df_content=pd.DataFrame({'contents_clean':contents_clean})
df_content.tail()

df_all_words=pd.DataFrame({'all_words':all_words})#all_words将所有分词的结果以单个数据的形式都保存起来了
df_all_words.tail()


import numpy
words_count=df_all_words.groupby(by=['all_words'])['all_words'].agg([('counts','count')])
#words_count=df_all_words.groupby(by=['all_words'])['all_words'].agg({"count":numpy.size})
#pandas引入了agg函数,它提供基于列的聚合操作。而groupby可以看做是基于行,或者说index的聚合操作
#通过这里介绍我们可以交接 groupby函数是基于行操作的 而agg是基于列操作的
words_count=words_count.reset_index().sort_values(by=["counts"],ascending=False)#对索引进行排序
words_count.head()

1.5词云图绘制

那么接下来就可以使用数据绘制词云图,既可以选择按照每篇新闻分词的数据,也可以使用全部词语的数据,下面就使用所有词语的数据进行绘制,基本步骤就是四步:

  • 首先截取要呈现的目标数据(一般20,50或者100,根据需要选定)
  • 词云图对象初始化(这里可以对词云图的参数进行设置)
  • 将选取的数据传入到fit.words()方法中
  • 最后就是将词云图展示出来
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}
wordcloud=wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)

1.6 提取关键词

import jieba.analyse#工具包
index = 2400#根据索引值随便找一篇文章就行
print (df_news['content'][index])
content_S_str = "".join(content_S[index]) #把分词的结果组合在一起,形成一个句子
print ("  ".join(jieba.analyse.extract_tags(content_S_str, topK=5, withWeight=False)))#选出来5个核心词

[out]法国VS西班牙、里贝里VS哈维,北京时间6月24日凌晨一场的大战举世瞩目,而这场胜利不仅仅关乎两支顶级强队的命运,同时也是他们背后的球衣赞助商耐克和阿迪达斯之间的一次角逐。T谌胙”窘炫分薇的16支球队之中,阿迪达斯和耐克的势力范围也是几乎旗鼓相当:其中有5家球衣由耐克提供,而阿迪达斯则赞助了6家,此外茵宝有3家,而剩下的两家则由彪马赞助。而当比赛进行到现在,率先挺进四强的两支球队分别被耐克支持的葡萄牙和阿迪达斯支持的德国占据,而由于最后一场1…
耐克 阿迪达斯 欧洲杯 球衣 西班牙

1.7 词袋模型LDA

由上面的分类看出,通过jieba可以直接提取文本的特征,但是要进行文本的分类,对于计算机来讲的话,它并不认识这些汉字,它只认识数值,有没有可能性将汉字都转化为数字,用数字进行表示呢?那么词袋模型就可以解决这个问题

from gensim import corpora, models, similarities
import gensim
#http://radimrehurek.com/gensim/#做映射,相当于词袋
dictionary = corpora.Dictionary(contents_clean)
##输出:[(词ID,词频)..],对该文本进行词袋格式的转换,查找词典在文档出现的词和次数进行输出
corpus = [dictionary.doc2bow(sentence) for sentence in contents_clean]# 在 DT 矩阵上运行和训练 LDA 模型 #指定主题数为20
lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20) #类似Kmeans自己指定K值#一号分类结果
# .print_topic(1, topn=5) 获取单个主题及主题下的单词 topn为显示的单词数
print (lda.print_topic(1, topn=5))##第一类主题,显示频率最高的5个

Doc2Bow是Gensim中封装的一个方法,主要用于实现Bow模型,下面主要介绍下Bow模型。

1、BoW模型原理
Bag-of-words model (BoW model) 最早出现在自然语言处理(Natural Language Processing)和信息检索(Information Retrieval)领域.。该模型忽略掉文本的语法和语序等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的。BoW使用一组无序的单词(words)来表达一段文字或一个文档.。近年来,BoW模型被广泛应用于计算机视觉中。
基于文本的BoW模型的一个简单例子如下:
首先给出两个简单的文本文档如下:

John likes to watch movies. Mary likes too.
John also likes to watch football games.

1
2
基于上述两个文档中出现的单词,构建如下一个词典 (dictionary):

{“John”: 1, “likes”: 2,“to”: 3, “watch”: 4, “movies”: 5,“also”: 6, “football”: 7, “games”: 8,“Mary”: 9, “too”: 10}
1
上面的词典中包含10个单词, 每个单词有唯一的索引, 那么每个文本我们可以使用一个10维的向量来表示。如下:

 [1, 2, 1, 1, 1, 0, 0, 0, 1, 1][1, 1,1, 1, 0, 1, 1, 1, 0, 0]

1
2
该向量与原来文本中单词出现的顺序没有关系,而是词典中每个单词在文本中出现的频率。
也是通过余弦定理计算两个句子的相似度。

for topic in lda.print_topics(num_topics=20, num_words=5):print (topic[1])


既然是进行文本分类,首先要做的就是进行标签制作,这里就按照常见的是个新闻标签进行对应新闻的匹配

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_splitx_train, x_test, y_train, y_test = train_test_split(df_train['contents_clean'].values, df_train['label'].values, random_state=1)words = []
for line_index in range(len(x_train)):try:#x_train[line_index][word_index] = str(x_train[line_index][word_index])words.append(' '.join(x_train[line_index]))except:print (line_index,word_index)
words[0]


标签处理好了之后就是进行数据特征的处理,那么就有个问题,每篇的新闻的字数是不一样的,有的是200词,有的是300词,有的甚至更多,但是在机器学习中要求输入的数据的维度是统一的,因此就得把数据的维度化为统一,那么就需要找一个可以进行衡量的支点,而这个支点就是语料库,即使每篇文章的数据的长短不一样,但是由所有文章组成的语料库的容量是一定了,所以判断每篇文章中数据是否在语料库中既可以对应上,也就转化为同一维度了,为了方便理解还是进行举例说明

1.8使用CountVectorizer转换成向量形式

from sklearn.feature_extraction.text import CountVectorizer
#lowercase=True 将所有字符变成小写
vec = CountVectorizer(analyzer='word', max_features=4000,  lowercase = False)
vec.fit(words)

2.贝叶斯分类器进行分类

#用于多项式模型的朴素贝叶斯分类器
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)

3.使用tdidf矢量器转换成向量形式

解释一下TF-IDF是一个什么东西,还是进行举例子,假设一篇文章为《中国的蜜蜂养殖》当我进行词频统计的时候,发现这篇文章中,‘中国’,‘蜜蜂’,‘养殖’这三个词出现的次数(TF就代表这出现的词频)是一样的,比如都是10次,那这个时候如果判断其重要性呢?这一篇文章应该讲述的是都跟蜜蜂和养殖相关的技术,所以这俩词应当是重点了。而中国这个词,我们既可以说中国的蜜蜂,还可以说中国的篮球,中国的大熊猫,能派上用场的地方简直太多了,没有那么专一,所以在这篇文章中它应当不是那么重要的。 这里我们就可以给出一个合理的定义了,如果一个词在整个语料库中(可以当作是在所有文章中)出现的次数都很高(这篇也有它,另一片还有这个词),那么这个词的重要程度就不高,因为它更像一个通用词。如果另一个词在整体的语料库中的词频很低,但是在这一篇文章中的词频却很高(这个就是IDF逆文本频率),我们就有理由认为它在这篇文章中就很重要了。比如蜜蜂这个词,在篮球,大熊猫相关的文章中基本不可能出现,这里却大量出现了。因此就可以使用TF-IDF进行文本关键词的提取

#使用tdidf矢量器
#TfidfVectorizer:多个词组可以不同組合,词库数量变多
from sklearn.feature_extraction.text import TfidfVectorizer
#analyzer='word'定义特征为词(word)或n-gram字符,如果传递给它的调用被用于抽取未处理输入源文件的特征序列
vectorizer = 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)

新闻分类实战-贝叶斯相关推荐

  1. 16Python文本数据分析:新闻分类任务 (贝叶斯算法应用实例)

    唐宇迪<python数据分析与机器学习实战>学习笔记 16Python文本数据分析:新闻分类任务 (贝叶斯算法应用实例) ** 一.流程分析 ** 数据如下图:content为主体内容, ...

  2. 【阿旭机器学习实战】【27】贝叶斯模型:新闻分类实战----CounterVecorizer与TfidVectorizer构建特征向量对比

    [阿旭机器学习实战]系列文章主要介绍机器学习的各种算法模型及其实战案例,欢迎点赞,关注共同学习交流. 本文介绍了新闻分类实战案例,并通过两种方法CounterVecorizer与TfidVectori ...

  3. 机器学习实战-贝叶斯算法-24

    贝叶斯-新闻分类 from sklearn.datasets import fetch_20newsgroups from sklearn.model_selection import train_t ...

  4. 垃圾邮件分类-朴素贝叶斯算法

    目录 一.贝叶斯公式原理 二.使用朴素贝叶斯进行文档分类 三.Python代码实现 一.贝叶斯公式原理 在基础的概率学中,经典的有求独立事件的概率以及求关联时间的概率,贝叶斯所要解决的问题就是在有条件 ...

  5. 机器学习之短信、邮件、新闻分类实战学习

    文章目录 1.导入数据 1.1.读取数据"SMSSpamCollection" 1.2.确定研究对象 2.统计词频 2.1.文本向量化处理 2.2.查看词频 3.建模与评估 3.1 ...

  6. R语言垃圾邮件分类--朴素贝叶斯(机器学习)

    邮件分类练习–朴素贝叶斯 思路 数据导入 数据处理 构建训练集和测试集 词云展示 数据降维 训练模型 模型测试 提升模型 一.数据导入 文件目录为:C:\Users\kelanj\Documents\ ...

  7. 机器学习实战----贝叶斯之概览篇

    一介绍 贝叶斯(约1701年至1761年)托马斯贝叶斯,英国数学家.约1701年出生于伦敦,做过神父.1742年成为英国皇家学会会员.1761年4月7日逝世.贝叶斯在数学方面主要研究概率论.他首先将归 ...

  8. 中文文本分类-朴素贝叶斯

    原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不 ...

  9. 模式识别之分类---数学贝叶斯方法

    http://blog.sina.com.cn/s/blog_6163bdeb0102ehh1.html http://www.zdh1909.com/html/Verilog/29941.html

最新文章

  1. 计算机英语缩写AGP,IT行业常用计算机缩略语
  2. CCD工业相机、镜头倍率及相关参数计算方法
  3. 做好面试前的准备工作
  4. Caffe学习系列(1):安装配置ubuntu14.04+cuda7.5+caffe+cudnn
  5. boost::hana::symmetric_difference用法的测试程序
  6. 使用36-pin的STM32输出VGA, VGA output using a 36-pin STM32
  7. s6730堆叠_不再只是堆叠硬件 ivvi S6全方位评测
  8. 计算机中丢失了ll是什么意思,丢失了ntoskrnl.exe和hal.ll
  9. 如何在Ubuntu 16.04上创建多节点MySQL集群(MySQL-Cluster)
  10. java 获取注解_java 注解annotation的使用,以及反射如何获取注解
  11. java工程师试卷,Java工程师试卷A
  12. 微信小程序uni.getImageInfo踩坑大计划
  13. android流量显示插件,[android]仿360状态,种流量监控桌面浮动显示
  14. Ubuntu18.04配置Jupyter
  15. SCE2007 –安装配置指南
  16. Delphi第三方控件安装卸载指南
  17. 海思Hi3798处理器参数,Hi3798芯片详细信息介绍
  18. php网站鼠标美化,几款耐用的鼠标指针皮肤,简约清新
  19. beautify插件实现.wxml文件属性自动换行
  20. java 农历_java怎么取得农历的节日

热门文章

  1. zyt-Linux云计算
  2. 斯隆论社会责任:德鲁克日志之四月二十五日
  3. FlashFXP,怎么使用flashfxp
  4. springboot 官网首页
  5. c语言str系列函数
  6. 智库大会 | 高端对话:智能科技推动管理学变革...
  7. 全局函数声明和静态函数声明
  8. 公众号、小程序、短信消息推送的区别
  9. Win10安全证书过期怎么办
  10. Swift Archiving序列化