基于Python是疫情期间教育领域新闻知识图谱分析

发布于:2022-12-25 ⋅ 阅读:(360) ⋅ 点赞:(0)

目录
第一章 数据抓取与文本提取 1
1.1数据抓取 1
1.1.1网页链接定位 1
1.1.2 获取新闻信息 1
1.1.3 文件写入 1
1.1.4 爬取结果展示 2
1.2 分词 3
1.3 小结 3
第二章 共现矩阵与主题词分析 3
2.1 原理 3
2.1.1 简例 3
2.1.2 文本共现矩阵 4
2.2 核心代码 4
2.3 主题词分析 5
2.4 共现矩阵分析的优势与不足 5
第三章 Gephi绘制关键词图谱 6
3.1 数据初始化 6
3.1.1 构造顶点数组 6
3.1.2 构造边集数组 6
3.2 导入数据 7
3.2.1 导入顶点数组 7
3.2.2 导入边集数组 7
3.3 图谱绘制 8
3.4 最终效果 8
第四章 数据分析 9
第五章 总结 9
参考文献 10
本文着眼于对疫情期间教育领域新闻的分析,基于python语言,利用爬虫获取教育领域的最新新闻,并将其内容进行分词,抓取关键词。在此基础上,根据关键词进行共现分析,并利用Gephi软件绘制主题知识图谱,以分析在疫情之下教育行业的关注重点,并以此为鉴,分析未来教育行业的变化动向。
从主题词图谱可以看出来,前十大关键词为学生、教育、疫情、学校、工作、毕业生、学习、发展、线上、要求。其中有八个词汇为蓝色,词汇“疫情”为红色,词汇“毕业生”为浅绿色。从中可以发现,深蓝色区域对应主要话题为学校教育、社会热点话题以及与国家宏观政策相关的关键词,浅绿色区域对应主要话题为毕业求职相关的关键词,红色区域对应主要话题为与疫情影响相关的关键词,蓝绿色区域对应主要话题为与青少年发展相关的关键词。
因此,对近期教育新闻的分析如下,本文转载自http://www.biyezuopin.vip/onews.asp?id=15223毕业季到来,数以百万计的大学生和研究生将走上职场,招聘、求职相关的新闻自是不绝于耳。在面临疫情的冲击下,求职也愈发困难,国家对各单位提出的扩招等宏观调控政策也十分必要。同时,对于尚未毕业的大、中、小学生和职业学校的学生而言,由于疫情尚未完全控制,在家听网课、参加考试的状态仍需要保持一段时间。在宏观层面,国家也在积极建设,新闻发布会等多种形式进行及时的传播信息很重要。而对于广大青少年儿童而言,保护视力、身心健康、合理上网等老生常谈的话题依然不过时,尤其是当大家都只能待在家中的时候,家长更要注重孩子的健康发展。

import requests
from bs4 import BeautifulSoup as bs
import urllib.request
import time
import csv
import jieba
import re
from collections import Counter
from snownlp import SnowNLP


def fetchUrl(url):
    '''
    功能:访问 url 的网页,获取网页内容并返回
    参数:目标网页的 url
    返回:目标网页的 html 内容
    '''
    
    headers = {
        'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
    }
    r = requests.get('http://edu.gmw.cn/node_10602.htm',headers=headers)
    content = r.content.decode('UTF-8')
    soup = bs(content, 'html5lib')
    return soup

def getPageList():
    soup = fetchUrl('http://edu.gmw.cn/node_10602.htm')
    myList = soup.find_all(name = "span", attrs = {'class': 'channel-newsTitle'})#得到新闻标题链接后缀
    #myNews存储新闻链接
    myNews = {}
    j = 0
    for i in myList:
        j += 1
        if j > 50:
            break
        #生成新闻链接
        if i.find('a').get('href')[0] == '2':
            myNews[j] = 'http://edu.gmw.cn/' + i.find('a').get('href')
        else:
            myNews[j] = i.find('a').get('href')
        print(myNews)
    return myNews

def getContent():
    urlList = getPageList()
    resp = {}
    for key in urlList:
        page=urllib.request.urlopen(urlList[key])
        contents = page.read()
        bsobj = bs(contents,'html5lib')
    
        # 获取文章 标题
        title = bsobj.title.text + '\n'
        print(title)
        
        
        # 获取文章 内容
        pList = bsobj.find(name = 'div' , attrs = {'class' : 'u-mainText'}).find_all('p')
        content = ''
        for p in pList:
            content += p.text + '\n'      
        print(content)
        time.sleep(1)
        # 返回结果 标题+内容
        resp[title] = content
    return resp

def saveFile():
    resp = getContent()
    with open('D:/data.txt' , 'a' , encoding = 'gb18030') as fp:
        for title in resp:
            fp.write(resp[title])
    with open('D:/data.csv' , 'a' , newline = '' , encoding = 'gb18030') as f:
        write=csv.writer(f)
        write.writerow(['文章标题', '内容'])
        a=1  #记录写入多少条数据
        for title in resp:
            write.writerow([title,resp[title]])
            print("已写入%d条信息"%a)
            a+=1

def division():
    cut_words = ""
    all_words = ""
    f = open('D:/all-data-key.txt', 'a', encoding='utf-8')
    for line in open('D:/data.txt', encoding='gb18030'):
        line = line.strip('\n')
        #停用词过滤
        line = re.sub('[0-9’!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?“”‘’![\\]^_`{|}~\s]+', "", line)
        seg_list = jieba.cut(line, cut_all=False)
        cut_words = (" ".join(seg_list))
    
        #计算关键词
        all_words = cut_words.split()
        c = Counter()
        for x in all_words:
            if len(x)>1 and x != '\r\n':
                c[x] += 1
        #Top50
        output = ""
        #print('\n词频统计结果:')
        for (k,v) in c.most_common(50):
            #print("%s:%d"%(k,v))
            output += k + " "
        
        f.write(output+"\n")
    else:
        f.close()

getPageList()
division()







在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看