美文网首页
机器学习实战-新闻分类

机器学习实战-新闻分类

作者: ai李晶 | 来源:发表于2020-01-29 15:36 被阅读0次

    一、基础知识

    假设有一份文本数据如下,数据量很大,现在要对整个语料库进行文本分析,category代表新闻种类,theme代表新闻主题,URL代表新闻链接地址,content代表新闻主题内容

    image

    停用词:在content这一列,在数据量很大的情况,很容易发现某些似乎与新闻本身意义不大的词大量出现,而我们就把这些在语料库中大量出现但是又没啥大用的词叫做停用词,在数据集链接中包含一份常见的停用词,如下所示:

    image

    TF-IDF:用于关键词提取。比如在一篇名叫《中国的蜜蜂养殖》这篇文章中进行词频(Term Frequency,缩写为TF)统计出现次数最多的词是“的”、“是”、“在”等这一类最常用的词(停用词,一般来说是要去掉的),在删除掉停用词过后我们发现“中国”、“蜜蜂”、“养殖”这三个词的出现次数一样多,那么这三个词的重要性是一样的吗?一般来说"中国"是很常见的词,相对而言,"蜜蜂"和"养殖"不那么常见。这时就需要引入一个叫做逆文档频率来进行衡量。"逆文档频率"(Inverse Document Frequency,缩写为IDF)如果某个词相比较于整个语料库来说比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,那它正是我们所需要的关键词。

    计算公式

    image

    TF-IDF = 词频(TF) * 逆文档频率(IDF)。还是在《中国的蜜蜂养殖》这篇文章中:假定该文长度为1000个词,"中国"、"蜜蜂"、"养殖"各出现20次,则这三个词的"词频"(TF)都为0.02。搜索Google发现,包含"的"字的网页共有250亿张,假定这就是中文网页总数(也就是语料库)。包含"中国"的网页共有62.3亿张,包含"蜜蜂"的网页为0.484亿张,包含"养殖"的网页为0.973亿张。

    image

    可以看出蜜蜂和养殖的TF-IDF值比中国这个词大,那么这篇文章的关键词重要性依次为蜜蜂、养殖和中国。

    文本相似度:假设有如下两个句子A、B,我们该怎么判断这两个句子的相似度呢

    句子A:我喜欢看电视,不喜欢看电影。
     句子B:我不喜欢看电视,也不喜欢看电影。
    先进行分词来看一下。

    句子A:我/喜欢/看/电视,不/喜欢/看/电影。
     句子B:我/不/喜欢/看/电视,也/不/喜欢/看/电影。
    可以得到整个语料库:我,喜欢,看,电视,电影,不,也。
    然后进行词频的统计

    句子A:我 1,喜欢 2,看 2,电视 1,电影 1,不 1,也 0。
     句子B:我 1,喜欢 2,看 2,电视 1,电影 1,不 2,也 1。
    这样就可以得出词频向量
     句子A:[1, 2, 2, 1, 1, 1, 0]
     句子B:[1, 2, 2, 1, 1, 2, 1]

    相似度计算方法:最常用通过余弦进行计算

    image image

    二、任务简介与数据预处理

    现在我们手里一份新闻数据,数据里面包含新闻的内容以及新闻的种类等等,我们要做的就是对新闻进行一个分类任务,比如说汽车类时尚类等等。

    数据集链接:https://pan.baidu.com/s/1fG_oagJT69bIgCZgasn_Ig 提取码:yzd0

    导入相关的python库

    import pandas as pd

    import jieba # 如果没有这个库可能需要手动安装

    读取数据集并删除缺失的数据集(缺失的数据很少,所以可以删除) 
    # read_table()读取以‘/t’分割的文件到DataFrame

    # 在实际使用中可以通过对sep参数的控制来对任何文本文件读取

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

    df_news = df_news.dropna() # 删除缺失数据

    df_news.head()

    content为新闻的主体内容

    image

    查看数据集维度

    df_news.shape

    得到的结果

    <pre>(5000, 4)</pre>

    将新闻内容转换为list方便进行分词并查看第1000条数据内容

    content = df_news.content.values.tolist() # 转换为list 实际上是二维list

    print``(content[``1000``])

    内容为:

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

    下面使用python中的jieba库进行分词

    content_S = []

    for line in content:

    # jieba分词 精确模式。返回一个列表类型,建议使用

    current_segment = jieba.lcut(line)

    if len``(current_segment) > 1 and current_segment !``= '\r\n'``:

    content_S.append(current_segment)

    |
    查看第1000条数据分词后的内容

    content_S[``1000``]

    image

    转为pandas支持的DataFrame格式
    df_content = pd.DataFrame({``'content_S'``:content_S}) # 转换为DataFrame

    df_content.head()

    分完词后的结果为:

    image

    可以发现数据里面包含很多无用的词汇,所以我们需要对这些数据进行清洗,就是删除掉里面包含的停用词

    三、 删除停用词

    读取停用词表
    # 读取停词表

    stopwords = pd.read_csv(``'./data/stopwords.txt'``,index_col``=``False``,sep``=``'\t'``,quoting``=``3``,names``=``[``'stopword'``],encoding``=``'utf-8'``)

    stopwords.head()

    结果为:

    image

    删除语料库中的停用词,这里面的all_words是为了后面的词云展示。

    # 删除新闻中的停用词

    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_content.content_S.isin(stopwords.stopword)

    # df_content=df_content[~df_content.content_S.isin(stopwords.stopword)]

    # df_content.head()

    |

    查看删除停用词后的新闻内容
    df_content = pd.DataFrame({``'contents_clean'``:contents_clean})

    df_content.head()

    |

    从结果可以看出,这次的数据对比上面的数据来说质量提高了很多。

    image

    查看一下出现的所有的词汇,也就是删除停用词后的all_words。

    df_all_words = pd.DataFrame({``'all_words'``:all_words})

    df_all_words.head()

    结果为:

    image

    统计all_words每个词的词频,统计这个词频也是为了方便后面的词云展示。
    import numpy

    # 分组统计

    words_count = df_all_words.groupby(by``=``[``'all_words'``])[``'all_words'``].agg({``'count'``:numpy.size})

    # 根据count排序

    words_count = words_count.reset_index().sort_values(by``=``[``'count'``],ascending``=``False``)

    words_count.head()

    |

    结果为:

    image

    四、词云展示

    导入wordcloud库以及画图展示
    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)

    |

    可视化结果为:

    image

    五、TF-IDF以及LDA主题模型

    TF-IDF关键词提取
    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``)))

    可以得到第2400条数据以及关键词

    [[图片上传失败...(image-f8426a-1580283113449)]](javascript:void(0); "复制代码")

    <pre>法国VS西班牙、里贝里VS哈维,北京时间6月24日凌晨一场的大战举世瞩目,而这场胜利不仅仅关乎两支顶级强队的命运,同时也是他们背后
    的球衣赞助商耐克和阿迪达斯之间的一次角逐。T谌胙”窘炫分薇的16支球队之中,阿迪达斯和耐克的势力范围也是几乎旗鼓相当:其中有5家球
    衣由耐克提供,而阿迪达斯则赞助了6家,此外茵宝有3家,而剩下的两家则由彪马赞助。而当比赛进行到现在,率先挺进四强的两支球队分别被耐
    克支持的葡萄牙和阿迪达斯支持的德国占据,而由于最后一场1/4决赛是茵宝(英格兰)和彪马(意大利)的对决,这也意味着明天凌晨西班牙同
    法国这场阿迪达斯和耐克在1/4决赛的唯一一次直接交手将直接决定两家体育巨头在此次欧洲杯上的胜负。8据评估,在2012年足球商品的销
    售额能总共超过40亿欧元,而单单是不足一个月的欧洲杯就有高达5亿的销售额,也就是说在欧洲杯期间将有700万件球衣被抢购一空。根据市
    场评估,两大巨头阿迪达斯和耐克的市场占有率也是并驾齐驱,其中前者占据38%,而后者占据36%。体育权利顾问奥利弗-米歇尔在接受《队
    报》采访时说:“欧洲杯是耐克通过法国翻身的一个绝佳机会!”C仔尔接着谈到两大赞助商的经营策略:“竞技体育的成功会燃起球衣购买的热情,
    不过即便是水平相当,不同国家之间的欧洲杯效应却存在不同。在德国就很出色,大约1/4的德国人通过电视观看了比赛,而在西班牙效果则差很
    多,由于民族主义高涨的加泰罗尼亚地区只关注巴萨和巴萨的球衣,他们对西班牙国家队根本没什么兴趣。”因此尽管西班牙接连拿下欧洲杯和世界
    杯,但是阿迪达斯只为西班牙足协支付每年2600万的赞助费#相比之下尽管最近两届大赛表现糟糕法国足协将从耐克手中每年可以得到4000
    万欧元。米歇尔解释道:“法国创纪录的4000万欧元赞助费得益于阿迪达斯和耐克竞逐未来15年欧洲市场的竞争。耐克需要笼络一个大国来打
    赢这场欧洲大陆的战争,而尽管德国拿到的赞助费并不太高,但是他们却显然牢牢掌握在民族品牌阿迪达斯手中。从长期投资来看,耐克给法国的
    赞助并不算过高。”
    耐克 阿迪达斯 欧洲杯 球衣 西班牙</pre>

    [[图片上传失败...(image-45ca34-1580283113449)]](javascript:void(0); "复制代码")

    从最后一句话就可以大致得到这段文章的大致意思,那这些词就是这段文章的关键词。

    LDA(Latent Dirichlet Allocation)是一种文档主题生成模型,它是一种主题模型,它包含文章,主题和词三个部分,它可以将文档集中每篇文档的主题以概率分布的形式给出,从而通过分析一些文档抽取出它们的主题(分布)出来后,便可以根据主题(分布)进行主题聚类或文本分类。同时,它是一种典型的词袋模型,即一篇文档是由一组词构成,词与词之间没有先后顺序的关系。此外,一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。LDA就是要干的事就是根据给定的一篇文档,推测其主题分布。它是一个无监督学习,类似于聚类。

    导入gensim库,需要自己手动安装

    # pip install gensim

    from gensim import corpora,models,similarities

    import gensim # 自然语言处理库

    #http://radimrehurek.com/gensim/ # 需要用时可以自行查阅官方文档

    进行词映射,相当于一个大的字典,每一个词汇进行一个映射。

    # 做映射,相当于词袋 格式要求:list of list

    dictionary = corpora.Dictionary(contents_clean) # 字典

    corpus = [dictionary.doc2bow(sentence) for sentence in contents_clean] # 语料

    |

    进行LDA建模,将整个语料库划分为20个主题

    # num_topics=20 类似Kmeans自己指定K值

    lda = gensim.models.ldamodel.LdaModel(corpus``=``corpus,id2word``=``dictionary,num_topics``=``20``)

    |

    查看第1号主题的结果,然后选出这个主题中权重值最高的5个关键词。

    # 一号分类结果

    print``(lda.print_topic(``1``, topn``=``5``))

    |

    分类后结果为:

    <pre>0.008"说" + 0.007"男人" + 0.005"爱情" + 0.005"中" + 0.004*"离婚"</pre>

    查看这20个主题的关键词
    for topic in lda.print_topics(num_topics``=``20``,num_words``=``5``):

    print``(topic[``1``])

    |

    结果为:

    [[图片上传失败...(image-6d21e9-1580283113449)]](javascript:void(0); "复制代码")

    <pre>0.007"孩子" + 0.004"P" + 0.003"高校" + 0.003"a" + 0.003"说"
    0.008
    "说" + 0.007"男人" + 0.005"爱情" + 0.005"中" + 0.004"离婚"
    0.008"中" + 0.007"说" + 0.005"观众" + 0.005"a" + 0.004"男人"
    0.020
    "男人" + 0.014"女人" + 0.008"说" + 0.005"中" + 0.005"孩子"
    0.018"e" + 0.015"a" + 0.012"i" + 0.010"o" + 0.008"l"
    0.021
    "电影" + 0.018"导演" + 0.010"影片" + 0.008"中" + 0.006"主演"
    0.009"节目" + 0.007"中" + 0.006"说" + 0.004"主持人" + 0.004"吃"
    0.006
    "学校" + 0.004"工作" + 0.004"学生" + 0.004"高考" + 0.004"中"
    0.012"a" + 0.012"n" + 0.010"中" + 0.010"e" + 0.010"o"
    0.008
    "中国" + 0.005"中" + 0.004"创作" + 0.004"西班牙" + 0.004"说"
    0.013"官兵" + 0.007"部队" + 0.006"武警" + 0.004"万" + 0.003"中"
    0.005
    "中" + 0.005"S" + 0.004"V" + 0.004"L" + 0.004"N"
    0.010"M" + 0.005"P" + 0.005"张绍" + 0.005"I" + 0.004"S"
    0.008
    "中" + 0.006"中国" + 0.006"观众" + 0.005"说" + 0.004"比赛"
    0.005"万" + 0.003"号" + 0.003"公司" + 0.002"T" + 0.002"壮阳"
    0.007
    "S" + 0.006"号" + 0.004"万" + 0.004"a" + 0.004"中"
    0.004"中国" + 0.004"产品" + 0.003"欧洲杯" + 0.003"中" + 0.003"化妆水"
    0.005
    "中" + 0.005"万" + 0.004"排毒" + 0.003"纹身" + 0.003"号"
    0.005"中" + 0.005"比赛" + 0.004"食物" + 0.003"香港" + 0.003"营养"
    0.010
    "考生" + 0.008"中" + 0.004"发展" + 0.004"文化" + 0.003"中国"</pre>

    [[图片上传失败...(image-7c23de-1580283113449)]](javascript:void(0); "复制代码")

    六、使用贝叶斯进行分类

    先将清洗好的数据转换为pandas支持的DataFrame格式

    df_train``=``pd.DataFrame({``'contents_clean'``:contents_clean,``'label'``:df_news[``'category'``]})

    df_train.tail()

    得到的结果为:

    image

    查看数据集所有类别
    df_train.label.unique()

    结果:

    <pre>array(['汽车', '财经', '科技', '健康', '体育', '教育', '文化', '军事', '娱乐', '时尚'],
    dtype=object)</pre>

    使用pandas对类别进行映
    label_mapping = {``"汽车"``: 1``, "财经"``: 2``, "科技"``: 3``, "健康"``: 4``, "体育"``:``5``, "教育"``: 6``,``"文化"``: 7``,``"军事"``: 8``,``"娱乐"``: 9``,``"时尚"``: 0``}

    df_train[``'label'``] = df_train[``'label'``].``map``(label_mapping)

    df_train.head()

    |

    得到的结果是

    image

    下面开始常规的机器学习套路进行分类,首先划分训练集与测试集

    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 = x_train.flatten()

    x_train[``0``][``1``]

    |

    结果:

    <pre>'上海'</pre>

    训练集数据转为字符串数据,为了符合下面输入数据的格式。

    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``]

    |

    得到的第0条数据

    [[图片上传失败...(image-e81138-1580283113447)]](javascript:void(0); "复制代码")

    <pre>'中新网 上海 日电 于俊 父亲节 网络 吃 一顿 电影 快餐 微 电影 爸 对不起 我爱你 定于 本月 父亲节 当天 各大 视频 网站
    首映 葜 谱 鞣 剑 保慈 障蚣 钦 呓 樯 埽 ⒌ 缬 埃 ǎ 停 椋 悖 颍 铩 妫 椋 恚 称 微型 电影 新 媒体 平台 播放 状态
    短时 休闲 状态 观看 完整 策划 系统 制作 体系 支持 显示 较完整 故事情节 电影 微 超短 放映 微 周期 制作 天 数周 微
    规模 投资 人民币 几千 数万元 每部 内容 融合 幽默 搞怪 时尚 潮流 人文 言情 公益 教育 商业 定制 主题 单独 成篇 系列
    成剧 唇 开播 微 电影 爸 对不起 我爱你 讲述 一对 父子 观念 缺少 沟通 导致 关系 父亲 传统 固执 钟情 传统 生活 方式
    儿子 新派 音乐 达 习惯 晚出 早 生活 性格 张扬 叛逆 两种 截然不同 生活 方式 理念 差异 一场 父子 间 拉开序幕 子 失
    手 打破 父亲 心爱 物品 父亲 赶出 家门 剧情 演绎 父亲节 妹妹 哥哥 化解 父亲 这场 矛盾 映逋坏 嚼 斫 狻 ⒍ 粤 ⒌ 桨
    容 争执 退让 传统 尴尬 父子 尴尬 情 男人 表达 心中 那份 感恩 一杯 滤挂 咖啡 父亲节 变得 温馨 镁 缬 缮 虾 N 逄 煳
    幕 传播 迪欧 咖啡 联合 出品 出品人 希望 观摩 扪心自问 父亲节 父亲 记得 父亲 生日 哪一天 父亲 爱喝 跨出 家门 那一
    刻 感觉 一颗 颤动 心 操劳 天下 儿女 父亲节 大声 喊出 父亲 家人 爱 完'</pre>

    [[图片上传失败...(image-29c304-1580283113447)]](javascript:void(0); "复制代码")

    打印word的长度
    print``(``len``(words))

    |

    word长度为

    <pre>3750</pre>

    使用一个小例子用sklearn将词转换为词频向量

    from sklearn.feature_extraction.text import CountVectorizer

    texts``=``[``'dog cat fish'``,``'dog cat cat'``,``'fish bird'``,``'bird'``] # 注意text格式

    cv = CountVectorizer()

    cv_fit = cv.fit_transform(texts)

    print``(cv.get_feature_names())

    print``(cv_fit.toarray())

    print``(cv_fit.toarray().``sum``(axis``=``0``))

    |

    结果是

    [[图片上传失败...(image-35649a-1580283113447)]](javascript:void(0); "复制代码")

    <pre>['bird', 'cat', 'dog', 'fish']
    [[0 1 1 1]
    [0 2 1 0]
    [1 0 0 1]
    [1 0 0 0]]
    [2 3 2 2]</pre>

    [[图片上传失败...(image-35bf8e-1580283113447)]](javascript:void(0); "复制代码")

    改变参数试一下,ngram_range表示1到4个词进行组合,让向量更加复杂

    |

    from sklearn.feature_extraction.text import CountVectorizer

    texts``=``[``"dog cat fish"``,``"dog cat cat"``,``"fish bird"``, 'bird'``]

    cv = CountVectorizer(ngram_range``=``(``1``,``4``))

    cv_fit``=``cv.fit_transform(texts)

    print``(cv.get_feature_names())

    print``(cv_fit.toarray())

    print``(cv_fit.toarray().``sum``(axis``=``0``))

    |

    得到的向量为:

    image

    现在使用sklearn对上面构造的数据(也就是特定格式的数据)转换为词频向量

    from sklearn.feature_extraction.text import CountVectorizer

    vec = CountVectorizer(analyzer``=``'word'``, max_features``=``4000``, lowercase = False``)

    vec.fit(words)

    |

    构造的模型为

    [[图片上传失败...(image-2978ce-1580283113447)]](javascript:void(0); "复制代码")

    <pre>CountVectorizer(analyzer='word', binary=False, decode_error='strict',
    dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
    lowercase=False, max_df=1.0, max_features=4000, min_df=1,
    ngram_range=(1, 1), preprocessor=None, stop_words=None,
    strip_accents=None, token_pattern='(?u)\b\w\w+\b',
    tokenizer=None, vocabulary=None)</pre>

    [[图片上传失败...(image-189410-1580283113447)]](javascript:void(0); "复制代码")

    然后使用贝叶斯算法完成结果分类,传入的参数是刚才的词频向量

    from sklearn.naive_bayes import MultinomialNB

    classifier = MultinomialNB()

    classifier.fit(vec.transform(words), y_train)

    |

    构造的模型为

    <pre>MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)</pre>

    还是将数据转换为字符串,使用测试集来进行测试

    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``]

    |

    查看得到的测试集(也要符合输入的格式)

    [[图片上传失败...(image-867212-1580283113447)]](javascript:void(0); "复制代码")

    <pre>'国家 公务员 考试 申论 应用文 类 试题 实质 一道 集 概括 分析 提出 解决问题 一体 综合性 试题 说 一道 客观
    凝练 申发 论述 文章 题目 分析 历年 国考 申论 真题 公文 类 试题 类型 多样 包括 公文 类 事务性 文书 类 题
    材 从题 干 作答 材料 内容 整合 分析 无需 太 创造性 发挥 纵观 历年 申论 真题 作答 应用文 类 试题 文种 格
    式 作出 特别 重在 内容 考查 行文 格式 考生 平常心 面对 应用文 类 试题 准确 把握 作答 领会 内在 含义 把
    握 题材 主旨 材料 结构 轻松 应对 应用文 类 试题 R 弧 ⒆ 钒 盐 展文 写作 原则 T 材料 中来 应用文 类 试
    题 材料 总体 把握 客观 考生 材料 中来 材料 中 把握 材料 准确 理解 题材 主旨 T 政府 角度 作答 应用文 类
    试题 更应 注重 政府 角度 观点 政府 角度 出发 原则 表述 观点 提出 解决 之策 考生 作答 站 政府 人员 角度
    看待 提出 解决问题 T 文体 结构 形式 考查 重点 文体 结构 大部分 评分 关键点 解答 方法 薄 ⒆ ス 丶 词
    明 方向 作答 题目 题干 作答 作答 方向 作答 角度 关键 向导 考生 仔细阅读 题干 作答 抓住 关键词 作答 方向
    相关 要点 整理 作答 思路 年国考 地市级 真 题为 例 潦惺姓 府 宣传 推进 近海 水域 污染 整治 工作 请 给定
    资料 市政府 工作人员 身份 草拟 一份 宣传 纲要 R 求 保对 宣传 内容 要点 提纲挈领 陈述 玻 体现 政府 精
    神 全市 各界 关心 支持 污染 整治 工作 通俗易懂 超过 字 肮 丶 词 近海 水域 污染 整治 工作 市政府 工作人
    员 身份 宣传 纲要 提纲挈领 陈述 体现 政府 精神 全市 各界 关心 支持 污染 整治 工作 通俗易懂 提示 归结
    作答 要点 包括 污染 情况 原因 解决 对策 作答 思路 情况 原因 对策 意义 逻辑 顺序 安排 文章 结构 病 ⒋
    缶殖 龇 ⅲ 明 结构 解答 应用文 类 试题 考生 材料 整体 出发 大局 出发 高屋建瓴 把握 材料 主题 思想 事件
    起因 解决 对策 阅读文章 构建 文章 结构 直至 快速 解答 场 ⒗ 硭 乘悸 罚明 逻辑 应用文 类 试题 严密 逻
    辑思维 情况 原因 对策 意义 考生 作答 先 弄清楚 解答 思路 统筹安排 脉络 清晰 逻辑 表达 内容 表述 础
    把握 明 详略 考生 仔细阅读 分析 揣摩 应用文 类 试题 内容 答题 时要 详略 得当 主次 分明 安排 内容 增加
    文章 层次感 阅卷 老师 阅卷 时能 明白 清晰 一目了然 玻埃 保蹦旯 考 考试 申论 试卷 分为 省级 地市级 两套
    试卷 能力 大有 省级 申论 试题 考生 宏观 角度看 注重 深度 广度 考生 深谋远虑 地市级 试题 考生 微观 视角
    观察 侧重 考查 解决 能力 考生 贯彻执行 作答 区别对待'</pre>

    [[图片上传失败...(image-688ea6-1580283113447)]](javascript:void(0); "复制代码")

    查看预测准确率为

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

    |

    准确率为:

    <pre>0.804</pre>

    现在可以使用另外一种方式来构造TF-IDF向量

    from sklearn.feature_extraction.text import TfidfVectorizer

    vectorizer = TfidfVectorizer(analyzer``=``'word'``, max_features``=``4000``, lowercase = False``)

    vectorizer.fit(words)

    |

    构造的模型

    [[图片上传失败...(image-813b5b-1580283113447)]](javascript:void(0); "复制代码")

    <pre>TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
    dtype=<class 'numpy.float64'>, encoding='utf-8',
    input='content', lowercase=False, max_df=1.0, max_features=4000,
    min_df=1, ngram_range=(1, 1), norm='l2', preprocessor=None,
    smooth_idf=True, stop_words=None, strip_accents=None,
    sublinear_tf=False, token_pattern='(?u)\b\w\w+\b',
    tokenizer=None, use_idf=True, vocabulary=None)</pre>

    [[图片上传失败...(image-a72dd8-1580283113446)]](javascript:void(0); "复制代码")

    继续贝叶斯算法来建模

    from sklearn.naive_bayes import MultinomialNB

    classifier = MultinomialNB()

    classifier.fit(vectorizer.transform(words), y_train)

    |

    得到的模型为

    <pre>MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)</pre>

    查看预测准确率

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

    |

    得到的结果为:

    <pre>0.8152</pre>

    可以看出通过TF-IDF向量得到的结果更好一些,我们也可以更改上面的ngram_range的值来使结果更好,一般来说值为2就足够了。

    七、总结

    在这个新闻分类的案例中,我们了解了文本分析一般的处理步骤分词、词频统计、词频向量或者TF-IDF向量、最后相似度的计算。还学习了jieba分词库的使用,还有停用词表的使用,还有TF-IDF关键词提取以及LDA主题模型,后面还使用到了词云来进行词频的可视化展示,最后还使用到了自然语言处理库gensim,然后使用机器学习中的贝叶斯算法进行最终的分类。

    还有就是最重要的一点就是学习使用陌生的python库最好是找官方教程进行模仿学习,先把结果进行跑通然后再进行深入的学习。

    参考链接:
    https://www.cnblogs.com/xiaoyh/p/11453364.html

    相关文章

      网友评论

          本文标题:机器学习实战-新闻分类

          本文链接:https://www.haomeiwen.com/subject/fwnvthtx.html