文档要害信息提取造成常识图谱:基于NLP算法提取文本内容的要害信息生成信息图谱教程及码源(含pyltp装置应用教程)

1. 我的项目介绍

指标:输出一篇文档,将文档进行要害信息提取,进行结构化,并最终组织成图谱组织模式,造成对文章语义信息的图谱化展现。

如何用图谱和结构化的形式,即以简洁的形式对输出的文本内容进行最佳的语义示意是个难题。 本我的项目将对这一问题进行尝试,采纳的办法为:输出一篇文档,将文档进行要害信息提取,并进行结构化,并最终组织成图谱组织模式,造成对文章语义信息的图谱化展现。

成果展现

我的项目链接以及码源见文末:

2.相干依赖装置

2.1 Anaconda装置教程

还是要装置一个Anaconda进行环境隔离,尽管没用到一些深度学习框架,后续改良算法过程是会用的这里揭示一下。

具体教程和避坑文章见:

Anaconda装置超简洁教程,配置环境、创立虚拟环境、增加镜像源

conda创立虚拟环境后文件夹中只有conda-meta文件夹,无奈将环境增加到IDE中

2.2 pyltp 装置教程

pyltp 是哈工大自然语言工作组推出的一款基于Python 封装的自然语言解决工具(轮子),提供了分词,词性标注,命名实体辨认,依存句法分析,语义角色标注的性能。从利用角度来看,LTP为用户提供了下列组件:

  • 针对繁多自然语言解决工作,生成统计机器学习模型的工具
  • 针对繁多自然语言解决工作,调用模型进行剖析的编程接口
  • 应用流水线形式将各个剖析工具联合起来,造成一套对立的中文自然语言解决零碎
  • 零碎可调用的,用于中文语言解决的模型文件
  • 针对繁多自然语言解决工作,基于云端的编程接口
  • 装置环境:windows10

2.2.1 pyltp 0.4.0 装置

pip install pyltp

即装置最新版本了

2.2.2 pyltp 0.2.1 装置

这个版本比拟坑,间接pip装置不上的,须要用whl本地装置

  • 首先进入终端cmd,进入你的虚拟环境,查看python版本
  • 进入官网下载对应版本的pyltp: https://pypi.tuna.tsinghua.edu.cn/simple/pyltp-binary/

  • 装置对应版本whl

     pip install pyltp_binary-0.2.1.0-cp38-cp38-win_amd64.whl

2.3 LTP模型下载

模型下载官网:http://ltp.ai/download.html
github:https://github.com/HIT-SCIR/ltp

  • pyltp 版本:0.2.1
  • LTP 版本:3.4.0

下载后,能够解压到任意地位,C盘,D盘、E盘都行,为了不便查找数据,我将模型文件解压到我的pyltp库文件中

(1)新建一个我的项目文件夹,比方:D:\myLTP;
(2)将模型文件解压,将带版本号的模型文件改名字为ltp_data。文件夹放入我的项目文件夹;这将是咱们当前加载模型的门路。 D:\myLTP\ltp_data.
上面阐明所蕴含的模型内容:

1.  官网的下载模型文件,ltp_data并解压到任意地位(留神点:模型的门路最好不要有中文,不然模型加载不出),2. 解压后失去一个大于1G的文件夹,确保此文件夹名称为ltp_data,地位任意,但在Python程序中肯定要指明这个门路。3. LTP提供的模型包含:(在ltp_data文件夹外面)cws.model         分句模型,单文件pos.model         词性标注模型,单文件ner.model         命名实体辨认模型,单文件parser.model    依存句法分析模型,单文件srl_data/ 语义角色标注模型,多文件(文件夹srl)(留神:依照官网提醒注:3.4.0 版本 SRL模型 pisrl.model 如在windows零碎下不可用,能够到官网“此链接” 下载反对windows的语义角色标注模型。)     182,672,934 cws.model              260 md5.txt       22,091,814 ner.model      367,819,616 parser.model      196,372,381 pisrl.model     433,443,857 pos.model                6 version               7 个文件  1,202,400,868 字节               2 个目录 108,015,374,336 可用字节
  • 文档阐明地址:https://github.com/HIT-SCIR/ltp
  • Python文档阐明地址:https://github.com/HIT-SCIR/pyltp
  • http://pyltp.readthedocs.io/zh_CN/latest/api.html#id2

2.4 简要测试

from pyltp import SentenceSplittersents = SentenceSplitter.split('元芳你怎么看?我就趴窗口上看呗!')  # 分句print '\n'.join(sents)后果如下元芳你怎么看?我就趴窗口上看呗!

2.5 pyltp中可能遇到问题

问题一:pyltp的初始化报错:segmentor = Segmentor() # 初始化实例TypeError: __init__(): incompatible constructor argument

LTP_DATA_DIR =  './ltp_data_v3.4.0' # ltp模型目录的门路cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型门路,模型名称为`cws.model`segmentor = Segmentor()  # 初始化实例segmentor.load(cws_model_path)  # 加载模型words = segmentor.segment(word)  # 分词words_list = list(words)   #words_list列表保留着分词的后果segmentor.release()
  • pyltp的初始化报错

    Traceback (most recent call last):File “test.py”, line 11, insegmentor = Segmentor() # 初始化实例
  • pyltp.Segmentor(model_path: str, lexicon_path: str = None, force_lexicon_path: str = None)

  • 解决办法:

解决1: 这是因为pyltp版本的写法不同,这种segmentor = Segmentor() 写法能够装置pyltp==0.2.1

解决2: pyltp==0.4.0的写法:不必segmentor = Segmentor()来进行初始化之后segmentor.load,而是间接加载模型,如以下代码:

from pyltp import SegmentorLTP_DATA_DIR =  './ltp_data_v3.4.0' # ltp模型目录的门路cws_model_path = os.path.join(LTP_DATA_DIR, 'cws.model')  # 分词模型segmentor = Segmentor(cws_model_path)words = segmentor.segment("元芳你怎么看")print("|".join(words))segmentor.release()

问题二:应用办法一装置呈现VC++谬误,

起因:你的电脑的确VC++编译环境,须要装置特定的VC++反对数据包。

解决办法:装置反对环境,下载上面的exe文件,装置VC++编译环境。

2.6 LTP根本组件应用(能够跳过)

2.6.1分词

import osfrom pyltp import SegmentorLTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0'cws_model_path=os.path.join(LTP_DATA_DIR,'cws.model')segmentor=Segmentor()segmentor.load(cws_model_path)words=segmentor.segment('熊高雄你吃饭了吗')print(type(words))print('\t'.join(words))segmentor.release()#后果展现:熊高雄    你    吃饭    了    吗

2.6.2 应用自定义字典

import osfrom pyltp import Segmentor#ltp模型目录的门路LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0' # 分词模型门路,模型名称为`cws.model`cws_model_path=os.path.join(LTP_DATA_DIR,'cws.model')segmentor=Segmentor() #初始化实例#加载模型  第二个参数是您的内部词典文件门路segmentor.load_with_lexicon(cws_model_path,'lexicon')words=segmentor.segment('亚硝酸盐是一种化学物质')print('\t'.join(words))segmentor.release()#代码运行后果:亚硝酸盐    是    一    种    化学    物质

2.6.3 词性标注

词性标注的指标是用一个独自的标签标记每一个词,该标签示意了用法和其句法作用,比方名词、动词、形容词等。

在自然语言剖析中,机器须要模仿了解语言。为了实现这一点,它必须在肯定水平上可能理解自然语言的规定。它首先须要了解的是词,特地是每一个词的性质。它是一个名词还是一个形容词?如果它是一个动词的屈折模式,那么它的不定模式是什么,以及该屈折模式应用了什么对应的时态、人称和数?这个工作被称为词性标注(Part-of-Speech (PoS) tagging)

词性标注的正确与否将会间接影响到后续的句法分析、语义剖析,是中文信息处理的基础性课题之一。罕用的词性标注模型有 N 元模型、隐马尔科夫模型、最大熵模型、基于决策树的模型等。其中,隐马尔科夫模型是利用较宽泛且成果较好的模型之一。

import osfrom pyltp import Postagger#ltp模型目录的门路LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0' # 词性标注模型门路,模型名称'pos.model'pos_model_path=os.path.join(LTP_DATA_DIR,'pos.model')postagger=Postagger() #初始化实例#加载模型  postagger.load(pos_model_path)words=['元芳','你','怎么','看'] #分词后果postags=postagger.postag(words); #词性标注print('\t'.join(postags))postagger.release()  #开释模型nh    r    r    v

2.6.4 命名实体辨认

命名实体辨认(Named Entity Recognition,简称NER),又称作“专名辨认”,是指辨认文本中具备特定意义的实体,次要包含人名、地名、机构名、专有名词等。简略的讲,就是辨认天然文本中的实体指称的边界和类别。

常见办法:
晚期的命名实体识别方法根本都是基于规定的。之后因为基于大规模的语料库的统计办法在自然语言解决各个方面获得不错的成果之后,一大批机器学习的办法也呈现在命名实体类辨认工作。宗成庆老师在统计自然语言解决一书粗略的将这些基于机器学习的命名实体识别方法划分为以下几类:
有监督的学习办法:这一类办法须要利用大规模的已标注语料对模型进行参数训练。目前罕用的模型或办法包含隐马尔可夫模型、语言模型、最大熵模型、反对向量机、决策树和条件随机场等。值得一提的是,基于条件随机场的办法是命名实体辨认中最胜利的办法。

半监督的学习办法:这一类办法利用标注的小数据集(种子数据)自举学习。

无监督的学习办法:这一类办法利用词汇资源(如 WordNet)等进行上下文聚类。

混合办法:几种模型相结合或利用统计办法和人工总结的知识库。

值得一提的是,因为深度学习在自然语言的广泛应用,基于深度学习的命名实体识别方法也展现出不错的成果,此类办法根本还是把命名实体辨认当做序列标注工作来做,比拟经典的办法是 LSTM+CRF、BiLSTM+CRF。

LTP 采纳 BIESO 标注体系。B 示意实体开始词,I示意实体两头词,E示意实体完结词,S示意独自成实体,O示意不形成命名实体。
LTP 提供的命名实体类型为:人名(Nh)、地名(Ns)、机构名(Ni)。
B、I、E、S地位标签和实体类型标签之间用一个横线 - 相连;O标签后没有类型标签。
import osfrom pyltp import NamedEntityRecognizer#ltp模型目录的门路LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0' # 命名实体辨认模型门路,模型名称'ner.model'ner_model_path=os.path.join(LTP_DATA_DIR,'ner.model')recognizer=NamedEntityRecognizer() #初始化实例#加载模型  recognizer.load(ner_model_path)words=['元芳','你','怎么','看'] #分词后果postags=['nh','r','r','v'] #词性标注后果netags=recognizer.recognize(words,postags)  #命名实体辨认print('\t'.join(netags))recognizer.release()  #开释模型S-Nh    O    O    O

2.6.5 依存句法分析

import osfrom pyltp import Parser#ltp模型目录的门路LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0' # 依存句法分析模型门路,模型名称'parser.model'par_model_path=os.path.join(LTP_DATA_DIR,'parser.model')parser=Parser() #初始化实例#加载模型  parser.load(par_model_path)words=['元芳','你','怎么','看'] #分词后果postags=['nh','r','r','v'] #词性标注后果arcs=parser.parse(words,postags) #句法分析print("\t".join("%d:%s" % (arc.head,arc.relation)for arc in arcs))parser.release()  #开释模型4:SBV    4:SBV    4:ADV    0:HED

2.6.6 语义角色标注

语义角色标注(Semantic Role Labeling,简称 SRL)是一种浅层的语义剖析。

给定一个句子, SRL 的工作是找出句子中谓词的相应语义角色成分,包含外围语义角色(如施事者、受事者等) 和从属语义角色(如地点、工夫、形式、起因等)。依据谓词类别的不同,又能够将现有的 SRL 分为动词性谓词 SRL 和名词性谓词 SRL。

import osfrom pyltp import SementicRoleLabellerfrom pyltp import Parser#ltp模型目录的门路LTP_DATA_DIR='D:\LTP\ltp_data_v3.4.0' #依存句法分析模型门路,模型名称'parser.model'par_model_path=os.path.join(LTP_DATA_DIR,'parser.model') # 语义角色标注模型门路,模型名称'pisrl_win.model'srl_model_path=os.path.join(LTP_DATA_DIR,'pisrl_win.model')#初始化实例parser=Parser()labeller=SementicRoleLabeller()#加载模型parser.load(par_model_path)labeller.load(srl_model_path)words=['元芳','你','怎么','看']postags=['nh','r','r','v']#句法分析arcs=parser.parse(words,postags)#arcs应用依存句法的后果roles=labeller.label(words,postags,arcs)#打印后果for role in roles:    print(role.index," ".join(["%s:(%d,%d)" % (arg.name,arg.range.start,arg.range.end)for arg in role.arguments]))labeller.release() #开释模[dynet] random seed: 2834750376[dynet] allocating memory: 2000MB[dynet] memory allocation done.3 A0:(1,1) ADV:(2,2)

3.文档要害信息提取造成常识图谱

代码状况:模型文件、主函数、前端可视化代码

局部代码展现:

from sentence_parser import *import refrom collections import Counterfrom GraphShow import *from keywords_textrank import *'''事件开掘'''class CrimeMining:    def __init__(self):        self.textranker = TextRank()        self.parser = LtpParser()        self.ners = ['nh', 'ni', 'ns']        self.ner_dict = {        'nh':'人物',        'ni':'机构',        'ns':'地名'        }        self.graph_shower = GraphShow()    '''移除括号内的信息,去除噪声'''    def remove_noisy(self, content):        p1 = re.compile(r'([^)]*)')        p2 = re.compile(r'\([^\)]*\)')        return p2.sub('', p1.sub('', content))    '''收集命名实体'''    def collect_ners(self, words, postags):        ners = []        for index, pos in enumerate(postags):            if pos in self.ners:                ners.append(words[index] + '/' + pos)        return ners    '''对文章进行分句解决'''    def seg_content(self, content):        return [sentence for sentence in re.split(r'[??!!。;;::\n\r]', content) if sentence]    '''对句子进行分词,词性标注解决'''    def process_sent(self, sent):        words, postags = self.parser.basic_process(sent)        return words, postags    '''构建实体之间的共现关系'''    def collect_coexist(self, ner_sents, ners):        co_list = []        for sent in ner_sents:            words = [i[0] + '/' + i[1] for i in zip(sent[0], sent[1])]            co_ners = set(ners).intersection(set(words))            co_info = self.combination(list(co_ners))            co_list += co_info        if not co_list:            return []        return {i[0]:i[1] for i in Counter(co_list).most_common()}

3.1 调用形式

from text_grapher import *content = 'xxxxxx请本人输出'handler = CrimeMining()handler.main(content8)

后果保留在graph.html文件当中。  

3.2案例展现

1) 中兴事件 

2) 魏则西事件 

3) 雷洋事件 

4) 同学事件 

(原题目:中科院研究生遇害案:凶手系乡亲学霸,老师同学已为死者发动捐款)6月14日下午6点多,中科院信息工程研究所硕士研究生谢雕在饭馆款待自重庆远道而来的高中同学周凯旋时,被周凯旋用匕首杀害。随后,周凯旋被北京警方抓获。周凯旋被抓后,他的家人向被警方递交了精力鉴定资料,称周凯旋患有精神性疾病。谢雕的家人罗创造通知南都记者,谢雕被害后,他的研究生老师和同学发动了捐款。并说,谢雕的遗体曾经进行尸检,等尸检后果进去后,家人将会把火化后的骨灰带回老家安葬,之后,他们将期待北京检察机关的公诉。高中同学千里赴京去杀人往年25岁的谢雕成长于重庆垫江县的一个小山村,谢雕和周凯旋同在垫江中学读高中,两人学习成绩名落孙山,周凯旋常常考年级第一,两人都是垫江中学的优良毕业生,谢雕考上了西安电子科技大学,周凯旋考取了四川大学。微信图片_20180627174901_正本.jpg案发现场的行凶者周凯旋(受访者提供)。学习优良的周凯旋认为本人应该能考上北大清华等名校,于是在入读四川大学两三个月后,抉择了入学复读。通过半年多的苦读,周凯旋以优异成绩考取了西安交通大学,来到了谢雕所在的城市,且是硕博连读。但周凯旋因大学本科期间因沉迷游戏,考试不及格,最终得到了硕博连读的机会,本科毕业后就回到重庆寻找就业机会。谢雕自西安电子科技大学毕业后,在2016年考取了中国科学院大学的硕士研究生,所读业余隶属于中科院信息工程研究所。谢雕的家人通知南都记者,6月14日下午6点,谢雕在西五环外的中科院信息工程研究所门口见到了久未见面的高中同学周凯旋。把他带到旁边的饭馆吃饭,两人还合影发到了高中同学微信群。这时,谢雕还没意识到周凯旋行将对他带来致命挫伤。南都记者在谢雕遇害现场视频中看到,在谢雕点菜时,周凯旋用匕首刺向他胸部,谢雕中刀站起后退时,周凯旋用匕首又刺向他颈部,谢雕倒地后,周凯旋又从背部向他连刺几刀。之后,又持刀割断了谢雕的颈部动脉。这时,有食客拿起椅子砸向正在行凶的周凯旋。刺死谢雕后,周凯旋举起双手挥动,随后扬长而去。起初,周凯旋被北京警方抓获。同学聚会时本人感觉受伤害起杀心罗创造通知南都记者,作为被害人家属,他们向北京警方理解到,凶案起因来自两年前的一场同学聚会,谢雕的一些话对周凯旋带来很大心理压力,让他不能释怀。两年前的一次高中同学聚会中,大家聊的话题很多,也聊到了周凯旋喜爱打游戏的事件,谢雕说了一些激励周凯旋的话,让他不要再打游戏,要振作起来。在参加团聚的同学们看来,这些话是常理之中的,但在周凯旋看来,对他带来很大挫伤,两年来给他带来很大心理压力。参加那次团聚的同学起初回顾,在一起玩“狼人杀”游戏时,谢雕、周凯旋产生了争执,但不欢快的霎时很快就过来了,大家也都没当回事。那次团聚之后的春节,不少同学发现被周凯旋拉黑,中断了分割。直至一年之后,周凯旋才退出了高中同学微信群。谢雕的家人说,周凯旋在网上购买了杀人凶器匕首,收货地址填写了北京,他在北京拿到网购的匕首后,才暗藏在身前来面见谢雕。师生捐款助他家人渡难关周凯旋被北京警方抓获后,他的家人向警方称周凯旋患有精神病,并提供了一些证实资料,心愿失去从轻处理。谢雕遇害后,他的学校为失去这么优良的学生感到可惜。谢雕的老师说,“谢雕家境并不富裕,本科尚有2.5万助学贷款未偿还,前不久还向同学借款1万,父亲也患有鼻咽癌。”谢雕的老师和同学发动了捐款,心愿能帮忙谢雕的家人临时渡过难关。谢雕的家人通知南都记者,他们向谢雕的学校提出要求,心愿案件能尽快解决。罗创造对南都记者说,谢雕的遗体曾经进行尸检,尸检后十天至十五天进去后果,等拿到尸检报告后,他们会尽快火化谢雕的遗体,把他的骨灰带回重庆老家安葬。对于这一案件,谢雕的家人通知南都记者,他们将期待北京的检察机关提起公诉。

5) 其余事件

正义网镇江9月5日电(通讯员喻瑶 杜希)通过网络二手平台公布虚伪信息,利用低廉的价格吸引购买者,诱骗买家先付定金、再付全款,先后欺骗作案11起,涉案金额28200元。2017年7月27日,江苏省句容市人民检察院依法对王明、王晓明两人以涉嫌诈骗罪批准逮捕。  妻子患病缺钱治,心理一动起歪念  王明和王晓明系父子关系。 2016年2月,王明的妻子胡晓梅患上重病,后期到医院医治曾经破费了十几万元医疗费用,前期医治更是个“无底洞”,因为家庭生存艰难,夫妻二人就动起了欺骗赚钱的歪念。  2016年底,王明在湖南娄底路边买了11张当地的手机卡用于联系,又购买了9张通过他人名字的办理的银行卡用于收款,筹备好作案工具后,妻子胡晓梅就开始在58同城这些二手交易平台上注册账号,公布各种便宜的虚伪二手信息,所有准备就绪,他们静待“猎物”上钩。  先后作案11起 先骗定金再骗全款  因为胡晓梅在平台上公布的二手信息价格很低,货品品质看起来也不错,所以很快就有“顾客”上门,2017年1月11日,王明接到一个句容宝华人的电话,无意购买他在网络平台上公布的一辆价值3200元的二手车,为了迅速达成交易,王明伪装成卖车老板和买家开始谈价格,价格谈拢后,王明提出要先付定金,再送货上门的要求。当日,王明顺利骗到了100元定金。  第二天,王明依照首次单方谈好的送货地址,让本人的儿子王晓明伪装成送货人,向被害人打电话,谎称把交易的货物运到了句容市某地,宣称本人开的车是“黑车”,间接进行现金交易不太平安,让被害人张某把剩下的购车款打过去,先付钱再拿车,被害人张某立刻通过某银行ATM机向王晓明领取了残余的3100元。王晓明又开始索要其他费用,这时被害人张某曾经觉察到了不对劲,不肯再付钱,王晓明就把号码拉黑,不再分割。  轻松到手的钱财,进一步引发了父子两人的贪欲。很快,王明的儿子王晓明就不再打工,而是退出父母,全家一起做专职欺骗的“交易”。随着欺骗次数的减少,他们的欺骗手法也从单纯的收取定金和购车款倒退出索要上牌费、平安保证金等多种形式。  一家人分工协作,王明负责假装老板和取钱,王晓明伪装送货,胡晓梅公布信息。2017年初至今,王明一家人共欺骗作案11起,涉案金额28200元。  受害人报警,父子两人终落法网  2017年4月3日,句容市公安局接到了被害人梁某某等人的报警电话,通过公安机关染指侦察,立功嫌疑人王明、王晓明于2017年6月6日被抓获归案。2017年7月21日,在句容市检察院检察官在依法对立功嫌疑人王明等人询问过程中,王明在得悉本人和儿子因触犯法律而将面临牢狱之灾时,后悔不已。  “近年来,检察机关在依法查办的多起诈骗案中发现,不法分子利用可乘之机,以多种形式施行不同的欺骗,作案伎俩多样化,让宽广市民深受其害。检察机关将依法履行职能,对此类欺骗立功坚定打击,实现从快从速拘捕和审查起诉,同时检察官揭示宽广市民,遇到不法侵害要及时报警。”承办检察官说。

我的项目链接以及码源见文末:

链接传输门,之后见文末即可看到码源

4.总结

  • 我的项目长处:

将文档进行要害信息提取,进行结构化,并最终组织成图谱组织模式,造成对文章语义信息的图谱化展现。在后续抽取工作上有借鉴意义

  • 我的项目不足之处:

    1. 如何用图谱和结构化的形式,即以简洁的形式对输出的文本内容进行最佳的语义示意是个难题。
    2. 本我的项目采纳了高频词,关键词,命名实体辨认,主谓宾短语辨认等抽取形式,并尝试将三类信息进行图谱组织示意,后续有待优化不然会导致抽取信息凌乱且有效
    3. 该我的项目:命名实体辨认以及要害信息抽取受限于NLP的性能,在算法和形式上还存在多处有余。(采纳了pyltp库自带的算法具备滞后性)
    4. 解决形式我的项目也是依照小段落形式抽取,同时在关系定义上含糊,目前看了次要是依赖实体定义链接,有改良空间。

参考链接:pyltp装置教程及简略应用:https://www.likecs.com/show-308274257.html

   pyltp的装置和应用:https://www.e-learn.cn/topic/3461951