新闻案例 贝叶斯文本分类 5-24

基于python的 新闻分类案例 贝叶斯文本分类 5-24

import pandas as pd
import jieba
import numpy

padas读取TXT文档的方式

df_news=pd.read_table('./sougou_news_data/val.txt',names=['category','theme','URL','content'],encoding='utf-8')


df_news=df_news.dropna()
df_news.head()
![png](https://my-picture-bed-1256685253.cos.ap-shanghai.myqcloud.com/201805/24/1.PNG)
categorythemeURLcontent
0汽车新辉腾 4.2 V8 4座加长Individual版2011款 最新报价http://auto.data.people.com.cn/model_15782/经销商 电话 试驾/订车U憬杭州滨江区江陵路1780号4008-112233转5864#保常…
1汽车918 Spyder概念车http://auto.data.people.com.cn/prdview_165423….呼叫热线 4008-100-300 服务邮箱 kf@peopledaily.com.cn
2汽车日内瓦亮相 MINI性能版/概念车-1.6T引擎http://auto.data.people.com.cn/news/story_5249…MINI品牌在二月曾经公布了最新的MINI新概念车Clubvan效果图,不过现在在日内瓦车展…
3汽车清仓大甩卖一汽夏利N5威志V2低至3.39万http://auto.data.people.com.cn/news/story_6144…清仓大甩卖!一汽夏利N5、威志V2低至3.39万=日,启新中国一汽强势推出一汽夏利N5、威志…
4汽车大众敞篷家族新成员 高尔夫敞篷版实拍http://auto.data.people.com.cn/news/story_5686…在今年3月的日内瓦车展上,我们见到了高尔夫家族的新成员,高尔夫敞篷版,这款全新敞篷车受到了众…

将content转换为list

content=df_news.content.values.tolist()
print(content[1000])
阿里巴巴集团昨日宣布,将在集团管理层面设立首席数据官岗位(Chief Data Officer),阿里巴巴B2B公司CEO陆兆禧将会出任上述职务,向集团CEO马云直接汇报。>菹ぃ和6月初的首席风险官职务任命相同,首席数据官亦为阿里巴巴集团在完成与雅虎股权谈判,推进“one company”目标后,在集团决策层面新增的管理岗位。0⒗锛团昨日表示,“变成一家真正意义上的数据公司”已是战略共识。记者刘夏

使用结巴分词器进行分词

content_S=[]
for line in content:
    current_segment=jieba.lcut(line)
    if len(line)>1 and current_segment != '\r\n':
        content_S.append(current_segment)

将分好词后的list加入到最初的数据集上

df_content=pd.DataFrame({'content_S':content_S})
df_content.head()
content_S
0[经销商,  , 电话,  , 试驾, /, 订车, U, 憬, 杭州, 滨江区, 江陵, …
1[呼叫, 热线,  , 4, 0, 0, 8, -, 1, 0, 0, -, 3, 0, 0…
2[M, I, N, I, 品牌, 在, 二月, 曾经, 公布, 了, 最新, 的, M, I…
3[清仓, 大, 甩卖, !, 一汽, 夏利, N, 5, 、, 威志, V, 2, 低至, …
4[在, 今年, 3, 月, 的, 日内瓦, 车展, 上, ,, 我们, 见到, 了, 高尔夫…

停用词的读取

stopwords=pd.read_csv('stopwords.txt',index_col=False,sep='\t',quoting=3,names=['stopword'],encoding='utf-8')
stopwords.head()
stopword
0!
1
2#
3$
4%

pandas.read_csv参数详解

pandas.read_csv参数整理

读取CSV(逗号分割)文件到DataFrame
也支持文件的部分导入和选择迭代
更多帮助参见:http://pandas.pydata.org/pandas-docs/stable/io.html

参数:
filepath_or_buffer : str,pathlib。str, pathlib.Path, py._path.local.LocalPath or any object with a read() method (such as a file handle or StringIO)
可以是URL,可用URL类型包括:http, ftp, s3和文件。对于多文件正在准备中
本地文件读取实例:://localhost/path/to/table.csv

sep : str, default ‘,’
指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’\r\t’

delimiter : str, default None
定界符,备选分隔符(如果指定该参数,则sep参数失效)

delim_whitespace : boolean, default False.
指定空格(例如’ ‘或者’ ‘)是否作为分隔符使用,等效于设定sep=’\s+’。如果这个参数设定为Ture那么delimiter 参数失效。
在新版本0.18.1支持

header : int or list of ints, default ‘infer’
指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。header参数可以是一个list例如:[0,1,3],这个list表示将文件中的这些行作为列标题(意味着每一列有多个标题),介于中间的行将被忽略掉(例如本例中的2;本例中的数据1,2,4行将被作为多级标题出现,第3行数据将被丢弃,dataframe的数据从第5行开始。)。
注意:如果skip_blank_lines=True 那么header参数忽略注释行和空行,所以header=0表示第一行数据而不是文件的第一行。

names : array-like, default None
用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。默认列表中不能出现重复,除非设定参数mangle_dupe_cols=True。

index_col : int or sequence or False, default None
用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。
如果文件不规则,行尾有分隔符,则可以设定index_col=False 来是的pandas不适用第一列作为行索引。

usecols : array-like, default None
返回一个数据子集,该列表中的值必须可以对应到文件中的位置(数字可以对应到指定的列)或者是字符传为文件中的列名。例如:usecols有效参数可能是 [0,1,2]或者是 [‘foo’, ‘bar’, ‘baz’]。使用这个参数可以加快加载速度并降低内存消耗。

as_recarray : boolean, default False
不赞成使用:该参数会在未来版本移除。请使用pd.read_csv(…).to_records()替代。
返回一个Numpy的recarray来替代DataFrame。如果该参数设定为True。将会优先squeeze参数使用。并且行索引将不再可用,索引列也将被忽略。

squeeze : boolean, default False
如果文件值包含一列,则返回一个Series

prefix : str, default None
在没有列标题时,给列添加前缀。例如:添加‘X’ 成为 X0, X1, …

mangle_dupe_cols : boolean, default True
重复的列,将‘X’…’X’表示为‘X.0’…’X.N’。如果设定为false则会将所有重名列覆盖。

dtype : Type name or dict of column -> type, default None
每列数据的数据类型。例如 {‘a’: np.float64, ‘b’: np.int32}

engine : {‘c’, ‘python’}, optional
Parser engine to use. The C engine is faster while the python engine is currently more feature-complete.
使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。

converters : dict, default None
列转换函数的字典。key可以是列名或者列的序号。

true_values : list, default None
Values to consider as True

false_values : list, default None
Values to consider as False

skipinitialspace : boolean, default False
忽略分隔符后的空白(默认为False,即不忽略).

skiprows : list-like or integer, default None
需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。

skipfooter : int, default 0
从文件尾部开始忽略。 (c引擎不支持)

skip_footer : int, default 0
不推荐使用:建议使用skipfooter ,功能一样。

nrows : int, default None
需要读取的行数(从文件头开始算起)。

na_values : scalar, str, list-like, or dict, default None
一组用于替换NA/NaN的值。如果传参,需要制定特定列的空值。默认为‘1.#IND’, ‘1.#QNAN’, ‘N/A’, ‘NA’, ‘NULL’, ‘NaN’, ‘nan’`.

keep_default_na : bool, default True
如果指定na_values参数,并且keep_default_na=False,那么默认的NaN将被覆盖,否则添加。

na_filter : boolean, default True
是否检查丢失值(空字符串或者是空值)。对于大文件来说数据集中没有空值,设定na_filter=False可以提升读取速度。

verbose : boolean, default False
是否打印各种解析器的输出信息,例如:“非数值列中缺失值的数量”等。

skip_blank_lines : boolean, default True
如果为True,则跳过空行;否则记为NaN。

parse_dates : boolean or list of ints or names or list of lists or dict, default False
boolean. True -> 解析索引
list of ints or names. e.g. If [1, 2, 3] -> 解析1,2,3列的值作为独立的日期列;
list of lists. e.g. If [[1, 3]] -> 合并1,3列作为一个日期列使用
dict, e.g. {‘foo’ : [1, 3]} -> 将1,3列合并,并给合并后的列起名为”foo”

infer_datetime_format : boolean, default False
如果设定为True并且parse_dates 可用,那么pandas将尝试转换为日期类型,如果可以转换,转换方法并解析。在某些情况下会快5~10倍。

keep_date_col : boolean, default False
如果连接多列解析日期,则保持参与连接的列。默认为False。

date_parser : function, default None
用于解析日期的函数,默认使用dateutil.parser.parser来做转换。Pandas尝试使用三种不同的方式解析,如果遇到问题则使用下一种方式。
1.使用一个或者多个arrays(由parse_dates指定)作为参数;
2.连接指定多列字符串作为一个列作为参数;
3.每行调用一次date_parser函数来解析一个或者多个字符串(由parse_dates指定)作为参数。

dayfirst : boolean, default False
DD/MM格式的日期类型

iterator : boolean, default False
返回一个TextFileReader 对象,以便逐块处理文件。

chunksize : int, default None
文件块的大小, See IO Tools docs for more informationon iterator and chunksize.

compression : {‘infer’, ‘gzip’, ‘bz2’, ‘zip’, ‘xz’, None}, default ‘infer’
直接使用磁盘上的压缩文件。如果使用infer参数,则使用 gzip, bz2, zip或者解压文件名中以‘.gz’, ‘.bz2’, ‘.zip’, or ‘xz’这些为后缀的文件,否则不解压。如果使用zip,那么ZIP包中国必须只包含一个文件。设置为None则不解压。
新版本0.18.1版本支持zip和xz解压

thousands : str, default None
千分位分割符,如“,”或者“.”

decimal : str, default ‘.’
字符中的小数点 (例如:欧洲数据使用’,‘).

float_precision : string, default None
Specifies which converter the C engine should use for floating-point values. The options are None for the ordinary converter, high for the high-precision converter, and round_trip for the round-trip converter.
指定

lineterminator : str (length 1), default None
行分割符,只在C解析器下使用。

quotechar : str (length 1), optional
引号,用作标识开始和解释的字符,引号内的分割符将被忽略。

quoting : int or csv.QUOTE_* instance, default 0
控制csv中的引号常量。可选 QUOTE_MINIMAL (0), QUOTE_ALL (1), QUOTE_NONNUMERIC (2) or QUOTE_NONE (3)

doublequote : boolean, default True
双引号,当单引号已经被定义,并且quoting 参数不是QUOTE_NONE的时候,使用双引号表示引号内的元素作为一个元素使用。

escapechar : str (length 1), default None
当quoting 为QUOTE_NONE时,指定一个字符使的不受分隔符限值。

comment : str, default None
标识着多余的行不被解析。如果该字符出现在行首,这一行将被全部忽略。这个参数只能是一个字符,空行(就像skip_blank_lines=True)注释行被header和skiprows忽略一样。例如如果指定comment=’#’ 解析‘#empty\na,b,c\n1,2,3’ 以header=0 那么返回结果将是以’a,b,c’作为header。

encoding : str, default None
指定字符集类型,通常指定为’utf-8’. List of Python standard encodings

dialect : str or csv.Dialect instance, default None
如果没有指定特定的语言,如果sep大于一个字符则忽略。具体查看csv.Dialect 文档

tupleize_cols : boolean, default False
Leave a list of tuples on columns as is (default is to convert to a Multi Index on the columns)

error_bad_lines : boolean, default True
如果一行包含太多的列,那么默认不会返回DataFrame ,如果设置成false,那么会将改行剔除(只能在C解析器下使用)。

warn_bad_lines : boolean, default True
如果error_bad_lines =False,并且warn_bad_lines =True 那么所有的“bad lines”将会被输出(只能在C解析器下使用)。

low_memory : boolean, default True
分块加载到内存,再低内存消耗中解析。但是可能出现类型混淆。确保类型不被混淆需要设置为False。或者使用dtype 参数指定类型。注意使用chunksize 或者iterator 参数分块读入会将整个文件读入到一个Dataframe,而忽略类型(只能在C解析器中有效)

buffer_lines : int, default None
不推荐使用,这个参数将会在未来版本移除,因为他的值在解析器中不推荐使用

compact_ints : boolean, default False
不推荐使用,这个参数将会在未来版本移除
如果设置compact_ints=True ,那么任何有整数类型构成的列将被按照最小的整数类型存储,是否有符号将取决于use_unsigned 参数

use_unsigned : boolean, default False
不推荐使用:这个参数将会在未来版本移除
如果整数列被压缩(i.e. compact_ints=True),指定被压缩的列是有符号还是无符号的。
memory_map : boolean, default False
如果使用的文件在内存内,那么直接map文件使用。使用这种方式可以避免文件再次进行IO操作。

去除停用词

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.stopword.values.tolist()  
contents_clean,all_words=drop_stopwords(contents,stopwords)

打印所有词组

df_all_words=pd.DataFrame({'all_words':all_words})
df_all_words.head()
all_words
0经销商
1电话
2试驾
3订车
4

所有词组的词频统计

words_count=df_all_words.groupby(by=['all_words'])['all_words'].agg({'count':numpy.size})
words_count=words_count.reset_index().sort_values(by=['count'],ascending=False)
words_count.head()
all_wordscount
40775199
4209中国3115
882553055
1047472646
13732390

词云的用法:

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='郭小语钢笔楷体.ttf',background_color='white',max_font_size=80)
word_frequence={x[0]:x[1] for x in words_count.head(1000).values}
wordcloud=wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)

利用结巴分词提取特征词(使用tfidf值作为评价标准)

import jieba.analyse
index = 1000
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)))
阿里巴巴集团昨日宣布,将在集团管理层面设立首席数据官岗位(Chief Data Officer),阿里巴巴B2B公司CEO陆兆禧将会出任上述职务,向集团CEO马云直接汇报。>菹ぃ和6月初的首席风险官职务任命相同,首席数据官亦为阿里巴巴集团在完成与雅虎股权谈判,推进“one company”目标后,在集团决策层面新增的管理岗位。0⒗锛团昨日表示,“变成一家真正意义上的数据公司”已是战略共识。记者刘夏 阿里巴巴 集团 首席 岗位 数据

使用gensim进行LDA聚类

from gensim import corpora,models,similarities
import gensim

dictionary=corpora.Dictionary(contents_clean)
corpus=[dictionary.doc2bow(sentence) for sentence in contents_clean]

lda=gensim.models.ldamodel.LdaModel(corpus=corpus,id2word=dictionary,num_topics=20)
print(lda.print_topic(1,topn=5))
0.007*”剧组” + 0.006*”剧” + 0.005*”招生” + 0.005*”剧中” + 0.005*”万”

贝叶斯分类之前的数据预处理

df_train=pd.DataFrame({'contents_clean':contents_clean,'label':df_news['category']})
df_train.tail()
contents_cleanlabel
4995[天气, 炎热, 补水, 变得, 美国, 跑步, 世界, 杂志, 报道, 喝水, 身体, 补…时尚
4996[不想, 说, 话, 刺激, 说, 做, 只能, 走, 离开, 伤心地, 想起, 一句, 话…时尚
4997[岁, 刘晓庆, 最新, 嫩照, O, 衷, 诘, 牧跸, 庆, 看不出, 岁, 秒杀, 刘…时尚
4998[导语, 做, 爸爸, 一种, 幸福, 无论是, 领养, 亲生, 更何况, 影视剧, 中, …时尚
4999[全球, 最美, 女人, 合成图, 国, 整形外科, 教授, 李承哲, 国际, 学术, 杂志…时尚
df_train.label.unique()
array([‘汽车’, ‘财经’, ‘科技’, ‘健康’, ‘体育’, ‘教育’, ‘文化’, ‘军事’, ‘娱乐’, ‘时尚’], dtype=object)

label的替换(中文—>数字)

label_mapping={'汽车':1, '财经':2, '科技':3, '健康':4, '体育':5, '教育':6, '文化':7, '军事':8, '娱乐':9, '时尚':10}
df_train['label']=df_train['label'].map(label_mapping)
df_train.tail()
contents_cleanlabel
4995[天气, 炎热, 补水, 变得, 美国, 跑步, 世界, 杂志, 报道, 喝水, 身体, 补…10
4996[不想, 说, 话, 刺激, 说, 做, 只能, 走, 离开, 伤心地, 想起, 一句, 话…10
4997[岁, 刘晓庆, 最新, 嫩照, O, 衷, 诘, 牧跸, 庆, 看不出, 岁, 秒杀, 刘…10
4998[导语, 做, 爸爸, 一种, 幸福, 无论是, 领养, 亲生, 更何况, 影视剧, 中, …10
4999[全球, 最美, 女人, 合成图, 国, 整形外科, 教授, 李承哲, 国际, 学术, 杂志…10

sklearn中CountVectorizer用法 主要用来形成词向量

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)
from sklearn.feature_extraction.text import CountVectorizer
text={'aof bsd csads','asads bdsa dsad gasd','dsaa odas fdsa','wdsa tdas ddas'}
cv=CountVectorizer()
cv_fit=cv.fit_transform(text)

print(cv_fit.toarray())
[[0 0 0 0 0 1 0 0 0 0 0 1 1]
 [1 0 0 1 1 0 0 0 0 0 0 0 0]
 [0 1 1 0 0 0 0 1 0 1 0 0 0]
 [0 0 0 0 0 0 1 0 1 0 1 0 0]]

训练数据的数据格式处理(处理成符合CountVectorizer输入的格式)

words=[]
for line_index in range(len(x_train)):
    try:
        words.append(' '.join(x_train[line_index]))
    except:
        print(line_index)
words[0]
'埃及 总统府 提供 照片 显示 埃及 总统 穆尔西 开罗 东郊 军事基地 阅兵 仪式 讲话 发 埃及 总统府 提供'

对处理好的词向量进行训练 训练成词带

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)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)

对验证集进行数据处理

test_words=[]
for line_index in range(len(x_test)):
    try:
        test_words.append(' '.join(x_test[line_index]))
    except:
        print(line_index)
test_words[0]
'出生 一周 小柏希给 家人 带来 希望 杓 朴 ざ 出生 救 姐姐 樱保 哺 鍪 怨 苡 ざ 胚胎 中 挑选 而出 脐带血 姐姐 治病 R 恢 芏 嗲 錾 小柏希 紧闭 双眼 静静地 躺 中山大学 附属 第一 医院 婴儿 床上 出生 岁 姐姐 带来 重生 希望 中山 一院 副 院长 妇产科 生殖 医学 首席 科学家 周灿权 教授 说 该院 双胞胎 诞生 标志 我国 头 两例 治疗 性 试管婴儿 获 成功 造血 干细胞 移植 治疗 患者 带来 希望 V 沃 囟 鹊 仄 痘 几十万 叵 母改杆 壬 马 女士 地贫 基因 携带者 年前 马 女士 自然 妊娠 诞下 一名 女婴 孩子 诊断 患有 重度 地贫 岁 每月 接受 两次 输血 治疗 不久前 并发 糖尿病 家 花费 几十万元 刂 泻 F 堆 我国 长江 以南 各省 发病率 影响 遗传病 α 地中海 贫血 β 地中海 贫血 最为 常见 重度 β 地中海 贫血 长期 输血 生命 造血 干细胞 移植 临床 根治 此病 唯一 方法 K 壬 马 女士 想要 健康 孩子 希望 胎儿 脐带血 救治 患病 女儿 听说 中山 一院 设计 婴儿 技术 接受 植入 前 遗传学 诊断 可惜 两次 试管 技术 成功 妊娠 两次 自然 妊娠 检查 出是 重度 地贫 患胎 终止 妊娠 K 为啥 设计 婴儿 K 到来 医护人员 精心 设计 母亲 试管婴儿 技术 孕育 胚胎 医护人员 遗传学 诊断 技术 挑选出 携带 地贫 基因 前 小孩 造血 功能 系统 匹配 相符 胚胎 植入 母亲 体内 胎儿 诞生 脐带血 供体 姐姐 提供 用于 治疗 重型 地贫 造血 干细胞 H ツ 辏 拢 玻啡 眨 医生 诊断 过程 中 发现 两个 胚胎 基因 表型 配型 女儿 相符 三个 两个 胚胎 移入 马 女士 子宫 对拢 玻谷胀 恚 马 女士 剖腹产 一名 健康 女婴 柏希 医生 采集 柏希 脐带血 这包 脐带血 姐姐 带来 重生 机会 杓 朴 ざ 手续费 万 V 懿 尤 ń 淌 诮 樯 芩 担小柏希是 中国 头 两例 成功 植入 前 遗传学 诊断 技术 俗称 设计 婴儿 诞生 β 地中海 贫血 白细胞 抗原 系统 配型 单胎 柏希 中山 一院 成功 诞生 一对 双胞胎 顺利 出生 技术 成熟 造血 干细胞 移植 生育 意愿 家庭 带来 福音 菹 ぃ 传统 方法 治疗 重症 地中海 贫血 患儿 终生 花费 高 达 几百万元 采用 这项 设计 婴儿 技术 胚胎 植入 子宫 前 三个 手续费 需 万元 孕妇 植入 胚胎 怀孕 期间 孕妇 无异 需 定时 前往 医院 做产检'

使用贝叶斯分类器进行验证

classifier.score(vec.transform(test_words),y_test)
0.78959999999999997
  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值