├── .gitignore ├── .idea ├── CausalityEventGraph.iml ├── markdown-navigator.xml ├── markdown-navigator │ └── profiles_settings.xml ├── misc.xml ├── modules.xml ├── vcs.xml └── workspace.xml ├── PPTS ├── 事理图谱:事件演化的规律和模式 .pdf ├── 从知识图谱到事理图谱.pdf └── 基于增强学习的股市涨跌预测技术.pdf ├── README.md ├── causality_extract.py └── image ├── fangbingbing.png ├── gongda.png ├── schema.jpg └── shouguang.png /.gitignore: -------------------------------------------------------------------------------- 1 | /ltp_data/ -------------------------------------------------------------------------------- /.idea/CausalityEventGraph.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /.idea/markdown-navigator.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 36 | 37 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /.idea/markdown-navigator/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/workspace.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 22 | 23 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 49 | 50 | 51 | 53 | 54 | 62 | 63 | 64 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 102 | 103 | 104 | 105 | 108 | 109 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 148 | 149 | 165 | 166 | 182 | 183 | 193 | 194 | 210 | 211 | 222 | 223 | 241 | 242 | 260 | 261 | 281 | 282 | 303 | 304 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 343 | 344 | 345 | 346 | 1532091811338 347 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 380 | 383 | 384 | 385 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | -------------------------------------------------------------------------------- /PPTS/事理图谱:事件演化的规律和模式 .pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/CausalityEventExtraction/261617e9713b0e3c88c09cd7d87959e331afefbd/PPTS/事理图谱:事件演化的规律和模式 .pdf -------------------------------------------------------------------------------- /PPTS/从知识图谱到事理图谱.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/CausalityEventExtraction/261617e9713b0e3c88c09cd7d87959e331afefbd/PPTS/从知识图谱到事理图谱.pdf -------------------------------------------------------------------------------- /PPTS/基于增强学习的股市涨跌预测技术.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/CausalityEventExtraction/261617e9713b0e3c88c09cd7d87959e331afefbd/PPTS/基于增强学习的股市涨跌预测技术.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CausalityEventExtraction 2 | self complement of templated based causality event extraction 基于因果关系知识库的因果事件图谱构建demo 3 | 4 | # 项目介绍 5 | 现实社会是个逻辑社会,大量的逻辑即逻辑经验存在于我们的脑海中,而这些逻辑经验是无法穷举出来的,靠大量人工的总结,显然不切实际。然而,幸好人类将这种逻辑用文字表达出来了,这为我们利用自然语言处理技术实现这种因果逻辑的抽取提供了可能性。不过,受限于自己的技术水平,目前还无法将深度学习这套高端的打发应用于因果事件抽取当中,而以构造和总结因果模板,结合中文语言特点,构建因果语言知识库的方式代替。 6 | 本项目是对因果事件抽取以及因果知识图谱构建的一种尝试。 7 | 8 | # 技术路线 9 | 因果事件图谱技术流程上遵循以下流程: 10 | ![image](https://github.com/liuhuanyong/CausalityEventGraph/blob/master/image/schema.jpg) 11 | 12 | 主要包括以下几个步骤: 13 | 1、因果知识库的构建。因果知识库的构建包括因果连词库,结果词库、因果模式库等。 14 | 2、文本预处理。这个包括对文本进行噪声移除,非关键信息去除等。 15 | 3、因果事件抽取。这个包括基于因果模式库的因果对抽取。 16 | 4、事件表示。这是整个因果图谱构建的核心问题,因为事件图谱本质上是联通的,如何选择一种恰当(短语、短句、句子主干)等方式很重要。 17 | 5、事件融合。事件融合跟知识图谱中的实体对齐任务很像 18 | 6、事件存储。事件存储是最后步骤,基于业务需求,可以用相应的数据库进行存储,比如图数据库等。 19 | 20 | # 最终效果 21 | 经过以上几个流程之后,可以支持各类查询,比如已知原因找结果,已知结果找原因等,这都很有事情,总之,数据库有了,我们可以做的事情有很多,接下来就是我们脑洞的事情了。 22 | 接下来以以下几个事件在因果知识库中查询一把: 23 | 以上几个图展示了输入既定事件在数据库中相似的事件(一度),相似事件导致的结果(二度节点)。 24 | # 范冰冰偷税漏税事件 25 | ![image](https://github.com/liuhuanyong/CausalityEventGraph/blob/master/image/fangbingbing.png) 26 | 27 | # 美国攻打伊拉克事件 28 | ![image](https://github.com/liuhuanyong/CausalityEventGraph/blob/master/image/gongda.png) 29 | 30 | # 寿光发生洪水事件 31 | ![image](https://github.com/liuhuanyong/CausalityEventGraph/blob/master/image/shouguang.png) 32 | 33 | # 总结 34 | 1)基于规则这套,很实用,但问题不少,规则维护比较多 35 | 2)事件表示这块一定要好好想想啊 36 | 3)事件融合这块,利用各种相似度度量进行计算,都有一定缺陷 37 | 38 | # question? 39 | send mail to lhy_in_blcu@126.com 40 | If any question about the project or me ,see https://liuhuanyong.github.io/ 41 | 42 | # contact? 43 | 如有自然语言处理、知识图谱、事理图谱、社会计算、语言资源建设等问题或合作,可联系我: 44 | 1、我的github项目介绍:https://liuhuanyong.github.io 45 | 2、我的csdn博客:https://blog.csdn.net/lhy2014 46 | 3、about me:刘焕勇,中国科学院软件研究所,lhy_in_blcu@126.com 47 | -------------------------------------------------------------------------------- /causality_extract.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # coding: utf-8 3 | # File: causality_pattern.py 4 | # Author: lhy 5 | # Date: 18-3-12 6 | 7 | import re, jieba 8 | import jieba.posseg as pseg 9 | from pyltp import SentenceSplitter 10 | class CausalityExractor(): 11 | def __init__(self): 12 | pass 13 | 14 | '''1由果溯因配套式''' 15 | def ruler1(self, sentence): 16 | ''' 17 | conm2:〈[之]所以,因为〉、〈[之]所以,由于〉、 <[之]所以,缘于〉 18 | conm2_model:{Effect},{Cause} 19 | ''' 20 | datas = list() 21 | word_pairs =[['之?所以', '因为'], ['之?所以', '由于'], ['之?所以', '缘于']] 22 | for word in word_pairs: 23 | pattern = re.compile(r'\s?(%s)/[p|c]+\s(.*)(%s)/[p|c]+\s(.*)' % (word[0], word[1])) 24 | result = pattern.findall(sentence) 25 | data = dict() 26 | if result: 27 | data['tag'] = result[0][0] + '-' + result[0][2] 28 | data['cause'] = result[0][3] 29 | data['effect'] = result[0][1] 30 | datas.append(data) 31 | if datas: 32 | return datas[0] 33 | else: 34 | return {} 35 | '''2由因到果配套式''' 36 | def ruler2(self, sentence): 37 | ''' 38 | conm1:〈因为,从而〉、〈因为,为此〉、〈既[然],所以〉、〈因为,为此〉、〈由于,为此〉、〈只有|除非,才〉、〈由于,以至[于]>、〈既[然],却>、 39 | 〈如果,那么|则〉、<由于,从而〉、<既[然],就〉、〈既[然],因此〉、〈如果,就〉、〈只要,就〉〈因为,所以〉、 <由于,于是〉、〈因为,因此〉、 40 | <由于,故〉、 〈因为,以致[于]〉、〈因为,因而〉、〈由于,因此〉、<因为,于是〉、〈由于,致使〉、〈因为,致使〉、〈由于,以致[于] > 41 | 〈因为,故〉、〈因[为],以至[于]>,〈由于,所以〉、〈因为,故而〉、〈由于,因而〉 42 | conm1_model:{Cause}, {Effect} 43 | ''' 44 | datas = list() 45 | word_pairs =[['因为', '从而'], ['因为', '为此'], ['既然?', '所以'], 46 | ['因为', '为此'], ['由于', '为此'], ['除非', '才'], 47 | ['只有', '才'], ['由于', '以至于?'], ['既然?', '却'], 48 | ['如果', '那么'], ['如果', '则'], ['由于', '从而'], 49 | ['既然?', '就'], ['既然?', '因此'], ['如果', '就'], 50 | ['只要', '就'], ['因为', '所以'], ['由于', '于是'], 51 | ['因为', '因此'], ['由于', '故'], ['因为', '以致于?'], 52 | ['因为', '以致'], ['因为', '因而'], ['由于', '因此'], 53 | ['因为', '于是'], ['由于', '致使'], ['因为', '致使'], 54 | ['由于', '以致于?'], ['因为', '故'], ['因为?', '以至于?'], 55 | ['由于', '所以'], ['因为', '故而'], ['由于', '因而']] 56 | 57 | for word in word_pairs: 58 | pattern = re.compile(r'\s?(%s)/[p|c]+\s(.*)(%s)/[p|c]+\s(.*)' % (word[0], word[1])) 59 | result = pattern.findall(sentence) 60 | data = dict() 61 | if result: 62 | data['tag'] = result[0][0] + '-' + result[0][2] 63 | data['cause'] = result[0][1] 64 | data['effect'] = result[0][3] 65 | datas.append(data) 66 | if datas: 67 | return datas[0] 68 | else: 69 | return {} 70 | '''3由因到果居中式明确''' 71 | def ruler3(self, sentence): 72 | ''' 73 | cons2:于是、所以、故、致使、以致[于]、因此、以至[于]、从而、因而 74 | cons2_model:{Cause},{Effect} 75 | ''' 76 | 77 | pattern = re.compile(r'(.*)[,,]+.*(于是|所以|故|致使|以致于?|因此|以至于?|从而|因而)/[p|c]+\s(.*)') 78 | result = pattern.findall(sentence) 79 | data = dict() 80 | if result: 81 | data['tag'] = result[0][1] 82 | data['cause'] = result[0][0] 83 | data['effect'] = result[0][2] 84 | return data 85 | '''4由因到果居中式精确''' 86 | def ruler4(self, sentence): 87 | ''' 88 | verb1:牵动、导向、使动、导致、勾起、引入、指引、使、予以、产生、促成、造成、引导、造就、促使、酿成、 89 | 引发、渗透、促进、引起、诱导、引来、促发、引致、诱发、推进、诱致、推动、招致、影响、致使、滋生、归于、 90 | 作用、使得、决定、攸关、令人、引出、浸染、带来、挟带、触发、关系、渗入、诱惑、波及、诱使 91 | verb1_model:{Cause},{Effect} 92 | ''' 93 | pattern = re.compile(r'(.*)\s+(牵动|已致|导向|使动|导致|勾起|引入|指引|使|予以|产生|促成|造成|引导|造就|促使|酿成|引发|渗透|促进|引起|诱导|引来|促发|引致|诱发|推进|诱致|推动|招致|影响|致使|滋生|归于|作用|使得|决定|攸关|令人|引出|浸染|带来|挟带|触发|关系|渗入|诱惑|波及|诱使)/[d|v]+\s(.*)') 94 | result = pattern.findall(sentence) 95 | data = dict() 96 | if result: 97 | data['tag'] = result[0][1] 98 | data['cause'] = result[0][0] 99 | data['effect'] = result[0][2] 100 | return data 101 | '''5由因到果前端式模糊''' 102 | def ruler5(self, sentence): 103 | ''' 104 | prep:为了、依据、为、按照、因[为]、按、依赖、照、比、凭借、由于 105 | prep_model:{Cause},{Effect} 106 | ''' 107 | pattern = re.compile(r'\s?(为了|依据|按照|因为|因|按|依赖|凭借|由于)/[p|c]+\s(.*)[,,]+(.*)') 108 | result = pattern.findall(sentence) 109 | data = dict() 110 | if result: 111 | data['tag'] = result[0][0] 112 | data['cause'] = result[0][1] 113 | data['effect'] = result[0][2] 114 | 115 | return data 116 | 117 | '''6由因到果居中式模糊''' 118 | def ruler6(self, sentence): 119 | ''' 120 | adverb:以免、以便、为此、才 121 | adverb_model:{Cause},{Effect} 122 | ''' 123 | pattern = re.compile(r'(.*)(以免|以便|为此|才)\s(.*)') 124 | result = pattern.findall(sentence) 125 | data = dict() 126 | if result: 127 | data['tag'] = result[0][1] 128 | data['cause'] = result[0][0] 129 | data['effect'] = result[0][2] 130 | return data 131 | 132 | '''7由因到果前端式精确''' 133 | def ruler7(self, sentence): 134 | ''' 135 | cons1:既[然]、因[为]、如果、由于、只要 136 | cons1_model:{Cause},{Effect} 137 | ''' 138 | pattern = re.compile(r'\s?(既然?|因|因为|如果|由于|只要)/[p|c]+\s(.*)[,,]+(.*)') 139 | result = pattern.findall(sentence) 140 | data = dict() 141 | if result: 142 | data['tag'] = result[0][0] 143 | data['cause'] = result[0][1] 144 | data['effect'] = result[0][2] 145 | return data 146 | '''8由果溯因居中式模糊''' 147 | def ruler8(self, sentence): 148 | ''' 149 | 3 150 | verb2:根源于、取决、来源于、出于、取决于、缘于、在于、出自、起源于、来自、发源于、发自、源于、根源于、立足[于] 151 | verb2_model:{Effect}{Cause} 152 | ''' 153 | 154 | pattern = re.compile(r'(.*)(根源于|取决|来源于|出于|取决于|缘于|在于|出自|起源于|来自|发源于|发自|源于|根源于|立足|立足于)/[p|c]+\s(.*)') 155 | result = pattern.findall(sentence) 156 | data = dict() 157 | if result: 158 | data['tag'] = result[0][1] 159 | data['cause'] = result[0][2] 160 | data['effect'] = result[0][0] 161 | return data 162 | '''9由果溯因居端式精确''' 163 | def ruler9(self, sentence): 164 | ''' 165 | cons3:因为、由于 166 | cons3_model:{Effect}{Cause} 167 | ''' 168 | pattern = re.compile(r'(.*)是?\s(因为|由于)/[p|c]+\s(.*)') 169 | result = pattern.findall(sentence) 170 | data = dict() 171 | if result: 172 | data['tag'] = result[0][1] 173 | data['cause'] = result[0][2] 174 | data['effect'] = result[0][0] 175 | 176 | return data 177 | 178 | '''抽取主函数''' 179 | def extract_triples(self, sentence): 180 | infos = list() 181 | # print(sentence) 182 | if self.ruler1(sentence): 183 | infos.append(self.ruler1(sentence)) 184 | elif self.ruler2(sentence): 185 | infos.append(self.ruler2(sentence)) 186 | elif self.ruler3(sentence): 187 | infos.append(self.ruler3(sentence)) 188 | elif self.ruler4(sentence): 189 | infos.append(self.ruler4(sentence)) 190 | elif self.ruler5(sentence): 191 | infos.append(self.ruler5(sentence)) 192 | elif self.ruler6(sentence): 193 | infos.append(self.ruler6(sentence)) 194 | elif self.ruler7(sentence): 195 | infos.append(self.ruler7(sentence)) 196 | elif self.ruler8(sentence): 197 | infos.append(self.ruler8(sentence)) 198 | elif self.ruler9(sentence): 199 | infos.append(self.ruler9(sentence)) 200 | 201 | return infos 202 | 203 | '''抽取主控函数''' 204 | def extract_main(self, content): 205 | sentences = self.process_content(content) 206 | datas = list() 207 | for sentence in sentences: 208 | subsents = self.fined_sentence(sentence) 209 | subsents.append(sentence) 210 | for sent in subsents: 211 | sent = ' '.join([word.word + '/' + word.flag for word in pseg.cut(sent)]) 212 | result = self.extract_triples(sent) 213 | if result: 214 | for data in result: 215 | if data['tag'] and data['cause'] and data['effect']: 216 | datas.append(data) 217 | return datas 218 | 219 | '''文章分句处理''' 220 | def process_content(self, content): 221 | return [sentence for sentence in SentenceSplitter.split(content) if sentence] 222 | 223 | '''切分最小句''' 224 | def fined_sentence(self, sentence): 225 | return re.split(r'[?!,;]', sentence) 226 | 227 | 228 | '''测试''' 229 | def test(): 230 | content1 = """ 231 | 截至2008年9月18日12时,5·12汶川地震共造成69227人死亡,374643人受伤,17923人失踪,是中华人民共和国成立以来破坏力最大的地震,也是唐山大地震后伤亡最严重的一次地震。 232 | """ 233 | content2 = ''' 234 | 2015年1月4日下午3时39分左右,贵州省遵义市习水县二郎乡遵赤高速二郎乡往仁怀市方向路段发生山体滑坡,发生规模约10万立方米,导致多辆车被埋,造成交通双向中断。此事故引起贵州省委、省政府的高度重视,省长陈敏尔作出指示,要求迅速组织开展救援工作,千方百计实施救援,减少人员伤亡和财物损失。遵义市立即启动应急救援预案,市应急办、公安、交通、卫生等救援力量赶赴现场救援。目前,灾害已造成3人遇难1人受伤,一辆轿车被埋。 235 | 当地时间2010年1月12日16时53分,加勒比岛国海地发生里氏7.3级大地震。震中距首都太子港仅16公里,这个国家的心脏几成一片废墟,25万人在这场骇人的灾难中丧生。此次地震中的遇难者有联合国驻海地维和部队人员,其中包括8名中国维和人员。虽然国际社会在灾后纷纷向海地提供援助,但由于尸体处理不当导致饮用水源受到污染,灾民喝了受污染的水后引发霍乱,已致至少2500多人死亡。 236 | ''' 237 | content3 = ''' 238 | American Eagle 四季度符合预期 华尔街对其毛利率不满导致股价大跌 239 | 我之所以考试没及格,是因为我没有好好学习。 240 | 因为天晴了,所以我今天晒被子。 241 | 因为下雪了,所以路上的行人很少。 242 | 我没有去上课是因为我病了。 243 | 因为早上没吃的缘故,所以今天还没到放学我就饿了. 244 | 因为小华身体不舒服,所以她没上课间操。 245 | 因为我昨晚没睡好,所以今天感觉很疲倦。 246 | 因为李明学习刻苦,所以其成绩一直很优秀。 247 | 雨水之所以不能把石块滴穿,是因为它没有专一的目标,也不能持之以恒。 248 | 他之所以成绩不好,是因为他平时不努力学习。 249 | 你之所以提这个问题,是因为你没有学好关联词的用法。 250 | 减了税,因此怨声也少些了。 251 | 他的话引得大家都笑了,室内的空气因此轻松了很多。 252 | 他努力学习,因此通过了考试。 253 | 既然明天要下雨,就不要再出去玩。 254 | 既然他还是那么固执,就不要过多的与他辩论。 255 | 既然别人的事与你无关,你就不要再去过多的干涉。 256 | 既然梦想实现不了,就换一个你自己喜欢的梦想吧。 257 | 既然别人需要你,你就去尽力的帮助别人。 258 | 既然生命突显不出价值,就去追求自己想要的生活吧。 259 | 既然别人不尊重你,就不要尊重别人。 因果复句造句 260 | 既然题目难做,就不要用太多的时间去想,问一问他人也许会更好。 261 | 既然我们是学生,就要遵守学生的基本规范。 262 | ''' 263 | extractor = CausalityExractor() 264 | datas = extractor.extract_main(content1) 265 | for data in datas: 266 | print('******'*4) 267 | print('cause', ''.join([word.split('/')[0] for word in data['cause'].split(' ') if word.split('/')[0]])) 268 | print('tag', data['tag']) 269 | print('effect', ''.join([word.split('/')[0] for word in data['effect'].split(' ') if word.split('/')[0]])) 270 | 271 | test() 272 | -------------------------------------------------------------------------------- /image/fangbingbing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/CausalityEventExtraction/261617e9713b0e3c88c09cd7d87959e331afefbd/image/fangbingbing.png -------------------------------------------------------------------------------- /image/gongda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/CausalityEventExtraction/261617e9713b0e3c88c09cd7d87959e331afefbd/image/gongda.png -------------------------------------------------------------------------------- /image/schema.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/CausalityEventExtraction/261617e9713b0e3c88c09cd7d87959e331afefbd/image/schema.jpg -------------------------------------------------------------------------------- /image/shouguang.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/liuhuanyong/CausalityEventExtraction/261617e9713b0e3c88c09cd7d87959e331afefbd/image/shouguang.png --------------------------------------------------------------------------------