数据分析案例实战:贝叶斯-新闻分类

学习唐宇迪《python数据分析与机器学习实战》视频

一、数据分析

数据分析案例实战:贝叶斯-新闻分类_第1张图片

每一条包括:

        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()

数据分析案例实战:贝叶斯-新闻分类_第2张图片

(二)使用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的该条新闻分词后的结果

数据分析案例实战:贝叶斯-新闻分类_第3张图片
将分词的结果转换成DateFrame表格形式

#将分词结果转换成DataFrame表格,只有content列
df_content=pd.DataFrame({'content_S':content_S})
df_content.head()

数据分析案例实战:贝叶斯-新闻分类_第4张图片

(三)停用词处理

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)

数据分析案例实战:贝叶斯-新闻分类_第5张图片

去除停用词

#去除停用词
def drop_stopwords(contents,stopwords):
    contents_clean=[]
    all_words=[]
    for line in contents:
        line_clean=[]
        for word in line:
            if word in stopwords:
                continue
            line_clean.append(word)
            all_words.append(str(word))
        contents_clean.append(line_clean)
    return contents_clean,all_words

contents=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()
#可以看到一些停用词被去掉了,如果想去掉字母的话,将字母加入停用词文本即可

数据分析案例实战:贝叶斯-新闻分类_第6张图片

df_all_words=pd.DataFrame({'all_words':all_words})
print(len(df_all_words))
df_all_words.head()

数据分析案例实战:贝叶斯-新闻分类_第7张图片

(四)关键词提取

计算所有词语出现的次数

# 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()

数据分析案例实战:贝叶斯-新闻分类_第8张图片

制作词云

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()

数据分析案例实战:贝叶斯-新闻分类_第9张图片

提取关键词

#使用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)))

数据分析案例实战:贝叶斯-新闻分类_第10张图片

(五)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])

数据分析案例实战:贝叶斯-新闻分类_第11张图片

三、用贝叶斯算法进行分类

(一)数据准备

#contents列和category列
df_train=pd.DataFrame({'contents_clean':contents_clean,'label':df_news['category']})
df_train.tail()

数据分析案例实战:贝叶斯-新闻分类_第12张图片

#标签种类
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()

数据分析案例实战:贝叶斯-新闻分类_第13张图片

(二)划分训练集和测试集

#划分训练集和测试集
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]

数据分析案例实战:贝叶斯-新闻分类_第14张图片

(四)使用CountVectorizer转换成向量形式

#使用CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer

vec = 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]

数据分析案例实战:贝叶斯-新闻分类_第15张图片

分类结果准确率

#返回给定测试数据和标签的平均准确度
classifier.score(vec.transform(test_words), y_test)

(六)使用tdidf矢量器转换成向量形式

#使用tdidf矢量器
#TfidfVectorizer:多个词组可以不同組合,词库数量变多
from sklearn.feature_extraction.text import TfidfVectorizer

vectorizer = TfidfVectorizer(analyzer='word', max_features=4000,  lowercase = False)
vectorizer.fit(words)

数据分析案例实战:贝叶斯-新闻分类_第16张图片

from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(vectorizer.transform(words), y_train)

分类结果

classifier.score(vectorizer.transform(test_words), y_test)

你可能感兴趣的:(数据分析)