0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

《中国近代史纲要》考试过关?Python帮你划重点

电子工程师 来源:lq 2019-01-28 09:16 次阅读

打开查分界面,我看到我的“中国近现代史纲要”一栏露出了难看的脸色。

这时,一个程序突然自告奋勇:“不就是这种简单的考试吗?让我学一下你们的课本,我也能够上考场! (  ̄ー ̄)”

我把我的课本文本输入给它。不到一分钟以后,它对我说:“我学完了,来考我吧。”

虽然也只是在考前突击了两天,但我对它如此之快的速度还是深感嫉妒。我问:“你知道孙中山先生都干了哪些事情吗?”

“发动护法运动、就任临时大总统、让位于袁世凯”

“不错吗,你是怎么做到的?”

“让我给你细细讲来吧……”

准备工作

程序:“首先引入一些必要的库,然后我加载doc为1840—1919年中国大事的那一段段文本做个简单的示例,这部分代码就不用我列出来了吧。”

旁白:这里使用harvesttext库进行文本挖掘,它的许多功能能够使得文本分析的流程变得更加轻松。前面的“用python分析《三国演义》中的社交网络”一文也使用了这一工具。

ht = HarvestText()sentences = ht.cut_sentences(doc)

有哪些重要对象

“重要对象,一般都是一些专有名词。我可以利用自然语言处理中的命名实体识别技术就能够识别出这样的一些对象,比如:人名、地名、机构名还有其他专有名词等。”

HarvestText中包装精简了pyhanlp中的命名实体识别接口,让我们来使用它找到近代史中的重要对象吧。

entity_type_dict = {}for i, sent in enumerate(sentences): entity_type_dict0 = ht.named_entity_recognition(sent) for entity0, type0 in entity_type_dict0.items(): entity_type_dict[entity0] = type0for entity in list(entity_type_dict.keys())[:10]: print(entity, entity_type_dict[entity])中国 地名鸦片战争 其他专名五四运动 其他专名英国 地名南京 地名望厦 其他专名黄埔 地名不平等条约 其他专名洪秀全 人名金田 地名

把找到的实体登录,我们就可以统计他们出现的次数,通过词频来判断它们的重要性。

ht.add_entities(entity_type_dict = entity_type_dict)inv_index = ht.build_index(sentences)counts = ht.get_entity_counts(sentences,inv_index)print(pd.Series(counts).sort_values(ascending=False).head())中国 21清政府 6日本 5孙中山 4英国 3dtype: int64

我:“这个分析确实有用,看着这些词我就联想到了,在1840—1919年的中国,清政府面对外敌的屈辱,以及孙中山先生为代表的有识之士的努力。但是考试不是单考这些对象,关键要考和它们有关的知识点啊。”

程序:“别着急,对于知识点,我也有办法找到。”

有哪些重要知识点

程序:“你们说的重要知识点,可以认为是包含了那些重要对象的事件或者事实吧。对于你们人类,事实可能就是自然语言描述的一句话。不过对于我们程序,我们要用一种标准清晰的结构来表示它。三元组组成的知识图谱就是一种解决方案。”

三元组就是类似(主语,谓词,宾语)的结构,比如:

[‘清政府’, ‘签订’, ‘天津条约’]

[‘袁世凯’, ‘复辟’, ‘帝制’]

[‘孙中山’, ‘就任’, ‘临时大总统’]

我:“有点意思,三个词基本就能凝练地表达一句话中的主要事实了。但是你只有文本作为输入,你要怎么从中提取出这样的三元组呢?”

程序:“上面已经提到三元组有(主语,谓词,宾语)的结构。你要是英语/语文课学得好的话,应该会联想到主语、谓语、宾语这些语法概念吧?而我就可以使用依存句法分析技术从文本中获得这些句法信息。”

分析大致是这样的:

可以看到,从主谓关系和动宾关系,我们就能够自然地得到我们需要的三元组[‘袁世凯’, ‘复辟’, ‘帝制’]。

保留更多的信息,比如修饰主语的形容词,能够让三元组的意思更加完整。我们可以利用别的关系来扩充事实:

原来我们只会得到[‘孙中山’, ‘就任’, ‘大总统’]。现在利用定中关系,我们就知道“临时”一词修饰“大总统”,我们就能够得到[‘孙中山’, ‘就任’, ‘临时大总统’]这个更完整的事实了。

我:“emmm…我的英语学得不好,这些语法看得有点头晕。”

程序:“好吧 (¬_¬),不过把它包装成接口以后,我们就可以很简单地使用这个技术了。现在让我们用它来找到课本里的重要知识点:”

ht2 = HarvestText()SVOs = []for i, sent in enumerate(sentences): SVOs += ht2.triple_extraction(sent.strip())print(" ".join(" ".join(tri) for tri in SVOs[5:10]))英法联军 发动 侵略中国清政府 签订 天津条约清政府 签订 北京条约慈禧太后 掌握 清王朝政权这是中国半殖民地半封建社会 形成 中国资本主义产生时期

程序:“怎么样?要不考虑下次考试让我帮你划重点?”

我:“有的三元组看起来还挺不错的,但是有的感觉有点奇怪啊。”

程序:“不要在意这些细节……那是因为你们给我写的算法还有很多提升空间吗,但总体质量还是不错的。”

“有了这些结构化的知识,我就可以接着建立知识图谱,‘掌握’这些知识之间的联系。”

知识图谱长什么样呢?它可以理解为实体之间的网络,网络之间的连边就是实体之间的联系,做出一张图来直观地感受下:

fig = plt.figure(figsize=(12,8),dpi=100)g_nx = nx.DiGraph()labels = {}for subj, pred, obj in SVOs: g_nx.add_edge(subj,obj) labels[(subj,obj)] = predpos=nx.spring_layout(g_nx)nx.draw_networkx_nodes(g_nx, pos, node_size=300)nx.draw_networkx_edges(g_nx,pos,width=4)nx.draw_networkx_labels(g_nx,pos,font_size=10,font_family='sans-serif')nx.draw_networkx_edge_labels(g_nx, pos, labels , font_size=10, font_family='sans-serif')plt.axis("off")plt.show()

现在,上考场吧

“现在我学会了这些知识,就可以建立起问答系统,回答一些问题。出几个问题来考考我吧?”

问答系统的具体实现思路可以见我的另一篇博客:https://blog.csdn.net/blmoistawinde/article/details/86556844

QA = NaiveKGQA(SVOs, entity_type_dict=entity_type_dict)questions = ["孙中山干了什么事?","清政府签订了哪些条约?","谁复辟了帝制?"]for question0 in questions: print("问:"+question0) print("答:"+QA.answer(question0))问:孙中山干了什么事?答:让位于袁世凯、发动护法运动、就任临时大总统问:清政府签订了哪些条约?答:天津条约、北京条约问:谁复辟了帝制?答:袁世凯

回答得相当不错。尽管当下这些问题是我特地挑选出来的,确定知识库里有正确的答案。不过当技术发展完善,或许有一天,它真的能够走上考场,取得不错的成绩呢。

本文故事纯属虚构,近纲考砸却是真事。不过我会感谢这门课教给我的历史教训,还有带给我的本文写作灵感。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    51

    文章

    4675

    浏览量

    83467
  • 识别技术
    +关注

    关注

    0

    文章

    190

    浏览量

    19516
  • 自然语言
    +关注

    关注

    1

    文章

    269

    浏览量

    13205

原文标题:《中国近代史纲要》考试过关?Python帮你划重点

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    通信工程师考试培训——老师提到的重点

    通信工程师考试培训——老师提到的重点
    发表于 08-15 23:16

    CLAD考试过

    CLAD考试过了,听说只有电子档的证书?貌似木有纸质证书?是这样吗?顺便分享下复习资料
    发表于 08-01 16:32

    2019中级通信工程师考试重点难点分析

    基于最新大纲定制课程,让你在最短时间内,快速掌握新大纲的重点考点。帮助你通过考试。适合人群:期望在最短的时间内通过中级通信工程师考试的行业从业人员。
    发表于 07-11 16:45

    2021年高压电工考试报名及高压电工考试资料相关推荐

    题库来源:安全生产模拟考试一点通公众号小程序高压电工考试报名根据新高压电工考试纲要求,安全生产模拟考试一点通将高压电工模拟
    发表于 07-09 06:22

    2021年电工(初级)证考试及电工(初级)作业模拟考试相关资料分享

    题库来源:安全生产模拟考试一点通公众号小程序电工(初级)证考试根据新电工(初级)考试纲要求,安全生产模拟考试一点通将电工(初级)模拟
    发表于 07-09 07:14

    2021年电工(初级)报名考试及电工(初级)考试内容相关资料推荐

    题库来源:安全生产模拟考试一点通公众号小程序电工(初级)报名考试根据新电工(初级)考试纲要求,安全生产模拟考试一点通将电工(初级)模拟
    发表于 07-09 08:11

    2021年电工(初级)考试及电工(初级)考试题库相关资料下载

    题库来源:安全生产模拟考试一点通公众号小程序电工(初级)考试根据新电工(初级)考试纲要求,安全生产模拟考试一点通将电工(初级)模拟
    发表于 07-09 07:01

    2021年焊工考试总结及焊工(中级)复审考试相关资料分享

    题库来源:安全生产模拟考试一点通公众号小程序焊工(中级)考试总结根据新焊工(中级)考试纲要求,安全生产模拟考试一点通将焊工(中级)模拟
    发表于 09-01 06:24

    平行线和垂直线的导向工具

    结合国家电工(初级)考试最新大纲及电工(初级)考试真题汇总,有助于电工(初级)模拟考试题库考前练习。1、【判断题】()测量电流时,要根据电流大小选择适当量程的电流表,不能使电流大于电流表的最大量程。(√)2、【判断题】角尺是测量
    发表于 09-02 08:13

    “十二五”中国重点发展太阳能热利用

    中国“十二五”规划纲要于3月14日获全国人大批准,此外,纲要中还明确提出“重点发展太阳能热利用”。
    发表于 03-23 09:36 737次阅读

    DSP期末考试重点

    DSP期末考试重点,大学期末考试大招,绝招。
    发表于 01-06 14:47 4次下载

    AI不仅能帮你估分、填志愿,还能刷脸给你”验明正身”

    就是不能帮你考试……
    的头像 发表于 06-10 11:27 2813次阅读

    python的入门考试题免费下载

    本文档的主要内容详细介绍的是python的入门考试题免费下载。
    发表于 07-19 08:00 13次下载

    Python程序设计的考试大纲详细资料说明

    考试目标:测试考生系统掌握 Python 基本概念及其编程思想,了解 Python 计算生态,利用 Python 进行数据处理及解决问题的能力。考试
    发表于 12-19 08:00 1次下载
    <b class='flag-5'>Python</b>程序设计的<b class='flag-5'>考试</b>大纲详细资料说明

    python二级考试的选择复习题和答案说明

    本文档的主要内容详细介绍的是python二级考试的选择复习题和答案说明。
    发表于 07-02 18:03 12次下载
    <b class='flag-5'>python</b>二级<b class='flag-5'>考试</b>的选择复习题和答案说明