Python爬取新型冠状病毒新闻进行LDA主题分析-从概率的角度去看文学

在这里插入图片描述

一、主题介绍

  1. 使用 Python 爬取冠状病毒新闻
  2. 使用 jieba 分词进行词频分析
  3. 使用 LDA 主题模型提取新闻话题
  4. 通过词频分析绘制词云图

二、爬取新闻数据

  • 目标网站:人民新闻网
  • 导入我们需要的库:
import time
import random
import requests
import pandas as pd
from lxml import etree
from newspaper import Article

newspaper 可以直接爬去新闻的框架:pip3 install newspaper3k

  • 设置User-Agent:因为有些网站以 User-Agent 做为反爬多依据所以我们要准备不同电脑型号的 User-Agent 在爬虫过程中随机使用
  • 提取新闻详细页面的链接:
def get_urls(self):
    """
    获取新闻的外部链接
    :return:
    """
    print("正在获取新闻外部链接")
    # 获取外部新闻链接
    urls = []
    for i in range(1, 11):
        print('第%d页爬取' % i)
        url = 'http://search.people.com.cn/cnpeople/search.do?pageNum=' + str(
            i) + '&keyword=%D0%C2%D0%CD%B9%DA%D7%B4%B2%A1%B6%BE&siteName=news&facetFlag=true&nodeType=belongsId&nodeId=0'

        headers = {'User-Agent': random.choice(self.users)}
        data = requests.get(url, headers=headers).text
        html = etree.HTML(data)
        url_ = html.xpath('//div[@class="fr w800"]//ul/li/b/a/@href')
        urls.extend(url_)
        time.sleep(random.uniform(1, 3))
    return list(set(urls))  # 去重
  • 使用 newspaper 爬去详细新闻页面:
def spider_deep(self):
    """
    深度爬取数据
    :return:
    """
    titles, times, texts, new_urls = list(), list(), list(), list()
    for url in self.get_urls():
        news = Article(url, language='zh')
        news.download()
        try:
            news.parse()
        except Exception:
            continue
        print(news.text)
        texts.append(news.text)
        times.append(news.publish_date)
        titles.append(news.title)
        new_urls.append(url)
        time.sleep(random.uniform(1, 3))
    content = pd.DataFrame()
    content['title'] = titles
    content['date'] = times
    content['text'] = texts
    content['url'] = new_urls
    content.to_csv('./新型冠状病毒2.csv', index=None, encoding="utf_8_sig")
    print("爬取完成! 数据已保存")
  • 运行过程展示:
    在这里插入图片描述
  • 完整代码展示:
import time
import random
import requests
import pandas as pd
from lxml import etree
from newspaper import Article


class SpiderNew(object):
    def __init__(self):
        # 模拟多台电脑访问,伪造header
        self.users = [
    'Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24',
    'Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6',
    'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3',
    'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.12) Gecko/20070731 Ubuntu/dapper-security Firefox/1.5.0.12',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20',
    'Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)',
    'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1',
    'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6',
    'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
    'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1',
    'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)',
    'Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3',
    'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
    'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
    'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52',
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3',
    'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)',
    'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.3 Mobile/14E277 Safari/603.1.30',
    'Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)',
    'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3',
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0',
    'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)',
    'Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1',
    'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6',
    'Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5']

    def get_urls(self):
        """
        获取新闻的外部链接
        :return:
        """
        print("正在获取新闻外部链接")
        # 获取外部新闻链接
        urls = []
        for i in range(1, 11):
            print('第%d页爬取' % i)
            url = 'http://search.people.com.cn/cnpeople/search.do?pageNum=' + str(
                i) + '&keyword=%D0%C2%D0%CD%B9%DA%D7%B4%B2%A1%B6%BE&siteName=news&facetFlag=true&nodeType=belongsId&nodeId=0'

            headers = {'User-Agent': random.choice(self.users)}
            data = requests.get(url, headers=headers).text
            html = etree.HTML(data)
            url_ = html.xpath('//div[@class="fr w800"]//ul/li/b/a/@href')
            urls.extend(url_)
            time.sleep(random.uniform(1, 3))
        return list(set(urls))  # 去重

    def spider_deep(self):
        """
        深度爬取数据
        :return:
        """
        titles, times, texts, new_urls = list(), list(), list(), list()
        for url in self.get_urls():
            news = Article(url, language='zh')
            news.download()
            try:
                news.parse()
            except Exception:
                continue
            print(news.text)
            texts.append(news.text)
            times.append(news.publish_date)
            titles.append(news.title)
            new_urls.append(url)
            time.sleep(random.uniform(1, 3))
        content = pd.DataFrame()
        content['title'] = titles
        content['date'] = times
        content['text'] = texts
        content['url'] = new_urls
        content.to_csv('./新型冠状病毒2.csv', index=None, encoding="utf_8_sig")
        print("爬取完成! 数据已保存")


if __name__ == '__main__':
    spider = SpiderNew()
    spider.spider_deep()

运行过程大概需要 8 分钟左右~

三、使用LDA主题模型算法提取新闻话题

  1. 使用 jieba 进行分词并过滤常用停用词:
def get_key_words(self, digest):
    """
    对新闻进行分词处理
    :param digest: str
    :return: list
    """
    stop_words_list = self.get_stop_words()  # 加载停用词表
    keywords = jieba.cut(digest, cut_all=True)
    kws = list()
    for kw in keywords:
        if kw not in stop_words_list and kw != " " and kw != " ":
            kws.append(kw)
    return kws

get_stop_words() 是一个加载停用词的方法

  1. 使用 LDA主题模型算法 提取新闻主题:
def data_analysis(self):
    """
    进行LDA建模处理
    :return:
    """
    words_list = pd.Series(self.words_num)
    new_dict = corpora.Dictionary(words_list)
    new_corpus = [new_dict.doc2bow(i) for i in words_list]  # 建立语料库
    new_lda = models.LdaModel(new_corpus, num_topics=10, id2word=new_dict, passes=30)  # LDA模型训练

    for x in new_lda.show_topics(num_words=6):
        print(x[1])

在这里插入图片描述
程序会输出新闻中的主题话题,因为 LDA主题模型 是一种从 概率的角度看文学 的算法,所以每次的运行结果不同,随着收敛次数不同,效果也会不同,可以多运行几次,选择效果比较好的几次作为参考

  1. 完整源码展示
import jieba
import pandas as pd
from gensim import corpora, models


class NewsAnalysis(object):
    def __init__(self):
    	# 爬取新闻的路径
        self.data = pd.read_csv("新型冠状病毒.csv")
        self.words_num = list()
        self.get_words()

    @staticmethod
    def get_stop_words():
        """
        返回常用停用词
        :return: list
        """
        stop_words = ["\n\n", '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '--', '.', '..', '...',
                           '......', '...................', './', '.一', '.数', '.日', '/', '//', '0', '1', '2', '3', '4',
                           '5',
                           '6', '7', '8', '9', ':', '://', '::', ';', '<', '=', '>', '>>', '?', '@', 'A', 'Lex', '[',
                           '\\',
                           ']', '^', '_', '`', 'exp', 'sub', 'sup', '|', '}', '~', '~~~~', '·', '×', '×××', 'Δ', 'Ψ',
                           'γ',
                           'μ', 'φ', 'φ.', 'В', '—', '——', '———', '‘', '’', '’‘', '“', '”', '”,', '…', '……',
                           '…………………………………………………③', '′∈', '′|', '℃', 'Ⅲ', '↑', '→', '∈[', '∪φ∈', '≈', '①', '②', '②c',
                           '③',
                           '③]', '④', '⑤', '⑥', '⑦', '⑧', '⑨', '⑩', '──', '■', '▲', '', '、', '。', '〈', '〉', '《', '》',
                           '》),',
                           '」', '『', '』', '【', '】', '〔', '〕', '〕〔', '㈧', '一', '一.', '一一', '一下', '一个', '一些', '一何', '一切',
                           '一则', '一则通过', '一天', '一定', '一方面', '一旦', '一时', '一来', '一样', '一次', '一片', '一番', '一直', '一致', '一般',
                           '一起', '一转眼', '一边', '一面', '七', '万一', '三', '三天两头', '三番两次', '三番五次', '上', '上下', '上升', '上去', '上来',
                           '上述', '上面', '下', '下列', '下去', '下来', '下面', '不', '不一', '不下', '不久', '不了', '不亦乐乎', '不仅',
                           '不仅...而且',
                           '不仅仅', '不仅仅是', '不会', '不但', '不但...而且', '不光', '不免', '不再', '不力', '不单', '不变', '不只', '不可', '不可开交',
                           '不可抗拒', '不同', '不外', '不外乎', '不够', '不大', '不如', '不妨', '不定', '不对', '不少', '不尽', '不尽然', '不巧', '不已',
                           '不常', '不得', '不得不', '不得了', '不得已', '不必', '不怎么', '不怕', '不惟', '不成', '不拘', '不择手段', '不敢', '不料',
                           '不断',
                           '不日', '不时', '不是', '不曾', '不止', '不止一次', '不比', '不消', '不满', '不然', '不然的话', '不特', '不独', '不由得',
                           '不知不觉',
                           '不管', '不管怎样', '不经意', '不胜', '不能', '不能不', '不至于', '不若', '不要', '不论', '不起', '不足', '不过', '不迭',
                           '不问',
                           '不限', '与', '与其', '与其说', '与否', '与此同时', '专门', '且', '且不说', '且说', '两者', '严格', '严重', '个', '个人',
                           '个别',
                           '中小', '中间', '丰富', '串行', '临', '临到', '为', '为主', '为了', '为什么', '为什麽', '为何', '为止', '为此', '为着',
                           '主张',
                           '主要', '举凡', '举行', '乃', '乃至', '乃至于', '么', '之', '之一', '之前', '之后', '之後', '之所以', '之类', '乌乎', '乎',
                           '乒', '乘', '乘势', '乘机', '乘胜', '乘虚', '乘隙', '九', '也', '也好', '也就是说', '也是', '也罢', '了', '了解', '争取',
                           '二',
                           '二来', '二话不说', '二话没说', '于', '于是', '于是乎', '云云', '云尔', '互', '互相', '五', '些', '交口', '亦', '产生',
                           '亲口',
                           '亲手', '亲眼', '亲自', '亲身', '人', '人人', '人们', '人家', '人民', '什么', '什么样', '什麽', '仅', '仅仅', '今', '今后',
                           '今天', '今年', '今後', '介于', '仍', '仍旧', '仍然', '从', '从不', '从严', '从中', '从事', '从今以后', '从优', '从古到今',
                           '从古至今', '从头', '从宽', '从小', '从新', '从无到有', '从早到晚', '从未', '从来', '从此', '从此以后', '从而', '从轻', '从速',
                           '从重',
                           '他', '他人', '他们', '他是', '他的', '代替', '以', '以上', '以下', '以为', '以便', '以免', '以前', '以及', '以后', '以外',
                           '以後', '以故', '以期', '以来', '以至', '以至于', '以致', '们', '任', '任何', '任凭', '任务', '企图', '伙同', '会', '伟大',
                           '传', '传说', '传闻', '似乎', '似的', '但', '但凡', '但愿', '但是', '何', '何乐而不为', '何以', '何况', '何处', '何妨',
                           '何尝',
                           '何必', '何时', '何止', '何苦', '何须', '余外', '作为', '你', '你们', '你是', '你的', '使', '使得', '使用', '例如', '依',
                           '依据', '依照', '依靠', '便', '便于', '促进', '保持', '保管', '保险', '俺', '俺们', '倍加', '倍感', '倒不如', '倒不如说',
                           '倒是',
                           '倘', '倘使', '倘或', '倘然', '倘若', '借', '借以', '借此', '假使', '假如', '假若', '偏偏', '做到', '偶尔', '偶而', '傥然',
                           '像', '儿', '允许', '元/吨', '充其极', '充其量', '充分', '先不先', '先后', '先後', '先生', '光', '光是', '全体', '全力',
                           '全年',
                           '全然', '全身心', '全部', '全都', '全面', '八', '八成', '公然', '六', '兮', '共', '共同', '共总', '关于', '其', '其一',
                           '其中',
                           '其二', '其他', '其余', '其后', '其它', '其实', '其次', '具体', '具体地说', '具体来说', '具体说来', '具有', '兼之', '内', '再',
                           '再其次', '再则', '再有', '再次', '再者', '再者说', '再说', '冒', '冲', '决不', '决定', '决非', '况且', '准备', '凑巧',
                           '凝神',
                           '几', '几乎', '几度', '几时', '几番', '几经', '凡', '凡是', '凭', '凭借', '出', '出于', '出去', '出来', '出现', '分别',
                           '分头',
                           '分期', '分期分批', '切', '切不可', '切切', '切勿', '切莫', '则', '则甚', '刚', '刚好', '刚巧', '刚才', '初', '别', '别人',
                           '别处', '别是', '别的', '别管', '别说', '到', '到了儿', '到处', '到头', '到头来', '到底', '到目前为止', '前后', '前此', '前者',
                           '前进', '前面', '加上', '加之', '加以', '加入', '加强', '动不动', '动辄', '勃然', '匆匆', '十分', '千', '千万', '千万千万',
                           '半',
                           '单', '单单', '单纯', '即', '即令', '即使', '即便', '即刻', '即如', '即将', '即或', '即是说', '即若', '却', '却不', '历',
                           '原来', '去', '又', '又及', '及', '及其', '及时', '及至', '双方', '反之', '反之亦然', '反之则', '反倒', '反倒是', '反应',
                           '反手',
                           '反映', '反而', '反过来', '反过来说', '取得', '取道', '受到', '变成', '古来', '另', '另一个', '另一方面', '另外', '另悉',
                           '另方面',
                           '另行', '只', '只当', '只怕', '只是', '只有', '只消', '只要', '只限', '叫', '叫做', '召开', '叮咚', '叮当', '可', '可以',
                           '可好', '可是', '可能', '可见', '各', '各个', '各人', '各位', '各地', '各式', '各种', '各级', '各自', '合理', '同', '同一',
                           '同时', '同样', '后', '后来', '后者', '后面', '向', '向使', '向着', '吓', '吗', '否则', '吧', '吧哒', '吱', '呀', '呃',
                           '呆呆地', '呐', '呕', '呗', '呜', '呜呼', '呢', '周围', '呵', '呵呵', '呸', '呼哧', '呼啦', '咋', '和', '咚', '咦',
                           '咧',
                           '咱', '咱们', '咳', '哇', '哈', '哈哈', '哉', '哎', '哎呀', '哎哟', '哗', '哗啦', '哟', '哦', '哩', '哪', '哪个',
                           '哪些',
                           '哪儿', '哪天', '哪年', '哪怕', '哪样', '哪边', '哪里', '哼', '哼唷', '唉', '唯有', '啊', '啊呀', '啊哈', '啊哟', '啐',
                           '啥',
                           '啦', '啪达', '啷当', '喀', '喂', '喏', '喔唷', '喽', '嗡', '嗡嗡', '嗬', '嗯', '嗳', '嘎', '嘎嘎', '嘎登', '嘘',
                           '嘛',
                           '嘻', '嘿', '嘿嘿', '四', '因', '因为', '因了', '因此', '因着', '因而', '固', '固然', '在', '在下', '在于', '地', '均',
                           '坚决', '坚持', '基于', '基本', '基本上', '处在', '处处', '处理', '复杂', '多', '多么', '多亏', '多多', '多多少少', '多多益善',
                           '多少', '多年前', '多年来', '多数', '多次', '够瞧的', '大', '大不了', '大举', '大事', '大体', '大体上', '大凡', '大力', '大多',
                           '大多数', '大大', '大家', '大张旗鼓', '大批', '大抵', '大概', '大略', '大约', '大致', '大都', '大量', '大面儿上', '失去', '奇',
                           '奈', '奋勇', '她', '她们', '她是', '她的', '好', '好在', '好的', '好象', '如', '如上', '如上所述', '如下', '如今', '如何',
                           '如其', '如前所述', '如同', '如常', '如是', '如期', '如果', '如次', '如此', '如此等等', '如若', '始而', '姑且', '存在', '存心',
                           '孰料', '孰知', '宁', '宁可', '宁愿', '宁肯', '它', '它们', '它们的', '它是', '它的', '安全', '完全', '完成', '定', '实现',
                           '实际', '宣布', '容易', '密切', '对', '对于', '对应', '对待', '对方', '对比', '将', '将才', '将要', '将近', '小', '少数',
                           '尔',
                           '尔后', '尔尔', '尔等', '尚且', '尤其', '就', '就地', '就是', '就是了', '就是说', '就此', '就算', '就要', '尽', '尽可能',
                           '尽如人意', '尽心尽力', '尽心竭力', '尽快', '尽早', '尽然', '尽管', '尽管如此', '尽量', '局外', '居然', '届时', '属于', '屡',
                           '屡屡',
                           '屡次', '屡次三番', '岂', '岂但', '岂止', '岂非', '川流不息', '左右', '巨大', '巩固', '差一点', '差不多', '己', '已', '已矣',
                           '已经', '巴', '巴巴', '带', '帮助', '常', '常常', '常言说', '常言说得好', '常言道', '平素', '年复一年', '并', '并不', '并不是',
                           '并且', '并排', '并无', '并没', '并没有', '并肩', '并非', '广大', '广泛', '应当', '应用', '应该', '庶乎', '庶几', '开外',
                           '开始',
                           '开展', '引起', '弗', '弹指之间', '强烈', '强调', '归', '归根到底', '归根结底', '归齐', '当', '当下', '当中', '当儿', '当前',
                           '当即', '当口儿', '当地', '当场', '当头', '当庭', '当时', '当然', '当真', '当着', '形成', '彻夜', '彻底', '彼', '彼时',
                           '彼此',
                           '往', '往往', '待', '待到', '很', '很多', '很少', '後来', '後面', '得', '得了', '得出', '得到', '得天独厚', '得起', '心里',
                           '必', '必定', '必将', '必然', '必要', '必须', '快', '快要', '忽地', '忽然', '怎', '怎么', '怎么办', '怎么样', '怎奈',
                           '怎样',
                           '怎麽', '怕', '急匆匆', '怪', '怪不得', '总之', '总是', '总的来看', '总的来说', '总的说来', '总结', '总而言之', '恍然', '恐怕',
                           '恰似',
                           '恰好', '恰如', '恰巧', '恰恰', '恰恰相反', '恰逢', '您', '您们', '您是', '惟其', '惯常', '意思', '愤然', '愿意', '慢说',
                           '成为',
                           '成年', '成年累月', '成心', '我', '我们', '我是', '我的', '或', '或则', '或多或少', '或是', '或曰', '或者', '或许', '战斗',
                           '截然',
                           '截至', '所', '所以', '所在', '所幸', '所有', '所谓', '才', '才能', '扑通', '打', '打从', '打开天窗说亮话', '扩大', '把',
                           '抑或',
                           '抽冷子', '拦腰', '拿', '按', '按时', '按期', '按照', '按理', '按说', '挨个', '挨家挨户', '挨次', '挨着', '挨门挨户',
                           '挨门逐户',
                           '换句话说', '换言之', '据', '据实', '据悉', '据我所知', '据此', '据称', '据说', '掌握', '接下来', '接着', '接著', '接连不断',
                           '放量',
                           '故', '故意', '故此', '故而', '敞开儿', '敢', '敢于', '敢情', '数/', '整个', '断然', '方', '方便', '方才', '方能', '方面',
                           '旁人', '无', '无宁', '无法', '无论', '既', '既...又', '既往', '既是', '既然', '日复一日', '日渐', '日益', '日臻', '日见',
                           '时候', '昂然', '明显', '明确', '是', '是不是', '是以', '是否', '是的', '显然', '显著', '普通', '普遍', '暗中', '暗地里',
                           '暗自',
                           '更', '更为', '更加', '更进一步', '曾', '曾经', '替', '替代', '最', '最后', '最大', '最好', '最後', '最近', '最高', '有',
                           '有些', '有关', '有利', '有力', '有及', '有所', '有效', '有时', '有点', '有的', '有的是', '有着', '有著', '望', '朝',
                           '朝着',
                           '末##末', '本', '本人', '本地', '本着', '本身', '权时', '来', '来不及', '来得及', '来看', '来着', '来自', '来讲', '来说',
                           '极',
                           '极为', '极了', '极其', '极力', '极大', '极度', '极端', '构成', '果然', '果真', '某', '某个', '某些', '某某', '根据',
                           '根本',
                           '格外', '梆', '概', '次第', '欢迎', '欤', '正值', '正在', '正如', '正巧', '正常', '正是', '此', '此中', '此后', '此地',
                           '此处',
                           '此外', '此时', '此次', '此间', '殆', '毋宁', '每', '每个', '每天', '每年', '每当', '每时每刻', '每每', '每逢', '比',
                           '比及',
                           '比如', '比如说', '比方', '比照', '比起', '比较', '毕竟', '毫不', '毫无', '毫无例外', '毫无保留地', '汝', '沙沙', '没',
                           '没奈何',
                           '没有', '沿', '沿着', '注意', '活', '深入', '清楚', '满', '满足', '漫说', '焉', '然', '然则', '然后', '然後', '然而',
                           '照',
                           '照着', '牢牢', '特别是', '特殊', '特点', '犹且', '犹自', '独', '独自', '猛然', '猛然间', '率尔', '率然', '现代', '现在',
                           '理应',
                           '理当', '理该', '瑟瑟', '甚且', '甚么', '甚或', '甚而', '甚至', '甚至于', '用', '用来', '甫', '甭', '由', '由于', '由是',
                           '由此', '由此可见', '略', '略为', '略加', '略微', '白', '白白', '的', '的确', '的话', '皆可', '目前', '直到', '直接',
                           '相似',
                           '相信', '相反', '相同', '相对', '相对而言', '相应', '相当', '相等', '省得', '看', '看上去', '看出', '看到', '看来', '看样子',
                           '看看', '看见', '看起来', '真是', '真正', '眨眼', '着', '着呢', '矣', '矣乎', '矣哉', '知道', '砰', '确定', '碰巧',
                           '社会主义',
                           '离', '种', '积极', '移动', '究竟', '穷年累月', '突出', '突然', '窃', '立', '立刻', '立即', '立地', '立时', '立马', '竟',
                           '竟然', '竟而', '第', '第二', '等', '等到', '等等', '策略地', '简直', '简而言之', '简言之', '管', '类如', '粗', '精光',
                           '紧接着',
                           '累年', '累次', '纯', '纯粹', '纵', '纵令', '纵使', '纵然', '练习', '组成', '经', '经常', '经过', '结合', '结果', '给',
                           '绝',
                           '绝不', '绝对', '绝非', '绝顶', '继之', '继后', '继续', '继而', '维持', '综上所述', '缕缕', '罢了', '老', '老大', '老是',
                           '老老实实', '考虑', '者', '而', '而且', '而况', '而又', '而后', '而外', '而已', '而是', '而言', '而论', '联系', '联袂',
                           '背地里',
                           '背靠背', '能', '能否', '能够', '腾', '自', '自个儿', '自从', '自各儿', '自后', '自家', '自己', '自打', '自身', '臭', '至',
                           '至于', '至今', '至若', '致', '般的', '良好', '若', '若夫', '若是', '若果', '若非', '范围', '莫', '莫不', '莫不然', '莫如',
                           '莫若', '莫非', '获得', '藉以', '虽', '虽则', '虽然', '虽说', '蛮', '行为', '行动', '表明', '表示', '被', '要', '要不',
                           '要不是', '要不然', '要么', '要是', '要求', '见', '规定', '觉得', '譬喻', '譬如', '认为', '认真', '认识', '让', '许多',
                           '论',
                           '论说', '设使', '设或', '设若', '诚如', '诚然', '话说', '该', '该当', '说明', '说来', '说说', '请勿', '诸', '诸位', '诸如',
                           '谁', '谁人', '谁料', '谁知', '谨', '豁然', '贼死', '赖以', '赶', '赶快', '赶早不赶晚', '起', '起先', '起初', '起头',
                           '起来',
                           '起见', '起首', '趁', '趁便', '趁势', '趁早', '趁机', '趁热', '趁着', '越是', '距', '跟', '路经', '转动', '转变', '转贴',
                           '轰然', '较', '较为', '较之', '较比', '边', '达到', '达旦', '迄', '迅速', '过', '过于', '过去', '过来', '运用', '近',
                           '近几年来', '近年来', '近来', '还', '还是', '还有', '还要', '这', '这一来', '这个', '这么', '这么些', '这么样', '这么点儿',
                           '这些',
                           '这会儿', '这儿', '这就是说', '这时', '这样', '这次', '这点', '这种', '这般', '这边', '这里', '这麽', '进入', '进去', '进来',
                           '进步', '进而', '进行', '连', '连同', '连声', '连日', '连日来', '连袂', '连连', '迟早', '迫于', '适应', '适当', '适用',
                           '逐步',
                           '逐渐', '通常', '通过', '造成', '逢', '遇到', '遭到', '遵循', '遵照', '避免', '那', '那个', '那么', '那么些', '那么样',
                           '那些',
                           '那会儿', '那儿', '那时', '那末', '那样', '那般', '那边', '那里', '那麽', '部分', '都', '鄙人', '采取', '里面', '重大',
                           '重新',
                           '重要', '鉴于', '针对', '长期以来', '长此下去', '长线', '长话短说', '问题', '间或', '防止', '阿', '附近', '陈年', '限制',
                           '陡然',
                           '除', '除了', '除却', '除去', '除外', '除开', '除此', '除此之外', '除此以外', '除此而外', '除非', '随', '随后', '随时', '随着',
                           '随著', '隔夜', '隔日', '难得', '难怪', '难说', '难道', '难道说', '集中', '零', '需要', '非但', '非常', '非徒', '非得',
                           '非特',
                           '非独', '靠', '顶多', '顷', '顷刻', '顷刻之间', '顷刻间', '顺', '顺着', '顿时', '颇', '风雨无阻', '饱', '首先', '马上',
                           '高低',
                           '高兴', '默然', '默默地', '齐', '︿', '!', '#', '$', '%', '&', ''', '(', ')', ')÷(1-', ')、', '*', '+',
                           '+ξ', '++', ',', ',也', '-', '-β', '--', '-[*]-', '.', '/', '0', '0:2', '1', '1.', '12%', '2',
                           '2.3%', '3', '4', '5', '5:0', '6', '7', '8', '9', ':', ';', '<', '<±', '<Δ', '<λ', '<φ',
                           '<<',
                           '=', '=″', '=☆', '=(', '=-', '=[', '={', '>', '>λ', '?', '@', 'A', 'LI', 'R.L.', 'ZXFITL',
                           '[',
                           '[①①]', '[①②]', '[①③]', '[①④]', '[①⑤]', '[①⑥]', '[①⑦]', '[①⑧]', '[①⑨]', '[①A]', '[①B]',
                           '[①C]',
                           '[①D]', '[①E]', '[①]', '[①a]', '[①c]', '[①d]', '[①e]', '[①f]', '[①g]', '[①h]', '[①i]',
                           '[①o]',
                           '[②', '[②①]', '[②②]', '[②③]', '[②④', '[②⑤]', '[②⑥]', '[②⑦]', '[②⑧]', '[②⑩]', '[②B]', '[②G]',
                           '[②]', '[②a]', '[②b]', '[②c]', '[②d]', '[②e]', '[②f]', '[②g]', '[②h]', '[②i]', '[②j]',
                           '[③①]',
                           '[③⑩]', '[③F]', '[③]', '[③a]', '[③b]', '[③c]', '[③d]', '[③e]', '[③g]', '[③h]', '[④]', '[④a]',
                           '[④b]', '[④c]', '[④d]', '[④e]', '[⑤]', '[⑤]]', '[⑤a]', '[⑤b]', '[⑤d]', '[⑤e]', '[⑤f]', '[⑥]',
                           '[⑦]', '[⑧]', '[⑨]', '[⑩]', '[*]', '[-', '[]', ']', ']∧′=[', '][', '_', 'a]', 'b]', 'c]',
                           'e]',
                           'f]', 'ng昉', '{', '{-', '|', '}', '}>', '~', '~±', '~+', '¥', '岗位']
        return stop_words

    def get_key_words(self, digest):
        """
        对新闻进行分词处理
        :param digest: str
        :return: list
        """
        stop_words_list = self.get_stop_words()  # 加载停用词表
        keywords = jieba.cut(digest, cut_all=True)
        kws = list()
        for kw in keywords:
            if kw not in stop_words_list and kw != " " and kw != " ":
                kws.append(kw)
        return kws

    def get_words(self):
        for _word in self.data["text"]:
            self.words_num.append(self.get_key_words(_word))

    def data_analysis(self):
        """
        进行LDA建模处理
        :return:
        """
        print("正在构建LDA模型")
        words_list = pd.Series(self.words_num)
        new_dict = corpora.Dictionary(words_list)
        new_corpus = [new_dict.doc2bow(i) for i in words_list]  # 建立语料库
        new_lda = models.LdaModel(new_corpus, num_topics=10, id2word=new_dict, passes=30)  # LDA模型训练

        for x in new_lda.show_topics(num_words=6):
            print(x[1])

    def get_words_num(self):
        """
        词频统计
        :return:
        """
        word_series = pd.Series([temp_list for temp_list in self.words_num for temp_list in temp_list]).value_counts()[0:100]
        word_series.to_csv("词频.csv", encoding="utf_8_sig")
        print("词频统计文件生成完成!")


if __name__ == '__main__':
    ana = NewsAnalysis()
    ana.data_analysis()  # 建模
    ana.get_words_num()  # 生成词频文件

四、词频统计做词云图

  • 使用 pandas 进行词频统计:
def get_words_num(self):
    """
    词频统计
    :return:
    """
    word_series = pd.Series([temp_list for temp_list in self.words_num for temp_list in temp_list]).value_counts()[
                  0:100]
    word_series.to_csv("词频.csv", encoding="utf_8_sig")

self.wods_num 是分词列表数据

  • 绘制词云图:
import matplotlib.pyplot as plt  # 数学绘图库
from PIL import Image
import numpy as np  # 科学数值计算包,可用来存储和处理大型矩阵
import pandas as pd
from wordcloud import WordCloud, ImageColorGenerator  # 词云库

# 1.读取数据分析得到的词频文件
data = pd.read_csv("词频.csv")["title"]
result = "/".join(data)  # 2.必须给个符号分隔开分词结果,否则不能绘制词云

# 3、初始化自定义背景图片
image = Image.open("2.jpg")
graph = np.array(image)

# 4、产生词云图
# 有自定义背景图:生成词云图由自定义背景图像素大小决定
wc = WordCloud(font_path=r"字体.ttc", background_color='white', max_font_size=50,
               mask=graph)
wc.generate(result)

# 5、绘制文字的颜色以背景图颜色为参考
image_color = ImageColorGenerator(graph)  # 从背景图片生成颜色值
wc.recolor(color_func=image_color)
wc.to_file(r"wordcloud5.png")  # 按照背景图大小保存绘制好的词云图,比下面程序显示更清晰

# 6、显示图片
plt.figure("词云图")  # 指定所绘图名称
plt.imshow(wc)  # 以图片的形式显示词云
plt.axis("off")  # 关闭图像坐标系
plt.show()

在这里插入图片描述
注意在系统添加自己字体路径
image = Image.open(“2.jpg”) 需要加载一张背景图片
在这里插入图片描述

发布了18 篇原创文章 · 获赞 15 · 访问量 2764

猜你喜欢

转载自blog.csdn.net/qq_42768234/article/details/104219671