信息抽取介绍
信息抽取的主要功能是从文本中抽取出特定的事实信息,这些文本可以是结构化、半结构化或非结构化的数据。通常信息抽取利用机器学习、自然语言处理等方法从上述文本中抽取出特定的信息后,保存到结构化的数据库当中,一边用户查询和使用。路线分为两条:
1.基于KDD和数据挖掘的方法,主要从结构化、半结构化数据中抽取信息;
2.采用自然语言处理和文本挖掘的方法,从非结构化的开放文本中发现新知识。
信息抽取的任务:
-
-
实体抽取与识别
-
实体消歧
- 关系抽取
-
时间抽取
-
信息抽取关键技术
1.实体识别与抽取
(1)实体识别
命名实体识别的主要任务是识别出待处理文本中七类命名实体,分别为人名、机构名、地名、时间、日期、货币和百分比。
在这七类当中,时间、日期、货币、百分比相对而言其构成具有很明显的规律,识别起来相对容易,但是剩下的三类由于用字灵活,所以识别难度很大。命名实体的内部构成和外部语言环境具有一些特征,无论何种方法,都在试图充分发现和利用实体所在的上下文特征和实体的内部特征。
考虑到每一类命名实体都具有不同的特征,不同类别的实体适合用不同的识别模型[,如:
人名:用基于字的模型描述其内部构成
地名和机构名:用基于词的模型描述
同时利用MEMM、HMM、CRF等序列标注工具计算特征权重。
(2)开放域实体抽取
开放域实体抽取的特点是不限定抽取文本的类别,具有很大的灵活性。
基本思路在于种子词与目标词在网页中具有相同或者类似的上下文(包括网页结构和上下文)。因此需要首先利用种子词提取模板,随后利用模板提取更多同类实体。处理该问题的主流框架为:
- 目前国内有多个开源的中文语言处理工具可供直接调用实现命名实体识别,比如复旦大学研发的fudanNLP,中科院的NLPIR分词系统(又名ICTCLAS2013)和哈工大的LTP。在这里使用哈工大的LTP,用python调用其封装成的pyltp的模块实现命名实体识别。具体安装配置见官方文档,可以参考的博客为 点击这里。
Python使用ltp_test
LTP提供的模型包括:(在ltp_data文件夹)
cws.model 分句模型,单文件
pos.model 词性标注模型,单文件
ner.model 命名实体识别模型,单文件
parser.model 依存句法分析模型,单文件
srl_data/ 语义角色标注模型,多文件(文件夹srl)
ltp_test是一个整合LTP中各模块的命令行工具。它完成加载模型,依照指定方法执行分析的功能。
主要参数:线程数、最终步骤、输入文件路径、模型路径、词典路径等。
具体可通过CMD运行ltp_test.exe查看。
# -*- coding: utf-8 -*- """ 学习:python执行CMD命令command,可以用&连接多个命令 功能:python调用CMD命令来执行本地LTP功能 """ import os project_path = "d:\\BeTheBest\\LTP" # 项目文件夹目录 # 可设置ltp_test、(cws、pos、par、ner)_cmdline,但是注意各自能用的参数,没有的参数请置空"" model_exe = "ltp_test" # 又如cws_cmdline threads_num = " --threads "+str(3) # 更改线程数 last_stage = " --last-stage "+"all" # 最终步骤,可设置ws、pos、ner、dp、srl、all input_path = " --input "+"d:\\myprojects\\LTP\\file\\test.txt" # 输入文件 seg_lexicon = "" # 分词用户词典 pos_lexicon = "" # 词性标注用户词典 output_path = "D:\\myprojects\\LTP\\result\\out.txt" # 输出文件 command = "cd "+project_path+" & "+model_exe+threads_num+input_path+last_stage+" > "+output_path os.system(command)
Python使用xxx_cmdline
(1)cws_cmdline :分词命令行
(2)pos_cmdline :词性标注命令行
(3)par_cmdline :句法分析命令行
(4)ner_cmdline :命名实体识别命令行
python程序简单调用(以cws_cmdline为例,其他类似,参数略不同)
# -*- coding: utf-8 -*- """ 功能:LTP本地分词cws_cmdline,输入文本需要每行一句。(不能自动分句) """ import os project_path = "d:\\myprojects\\LTP" # 项目文件夹目录 model_exe = "cws_cmdline" # 分词模块,相当于ltp_test的last_stage=ws,但是输出格式不同 threads_num = " --threads "+str(3) # 更改线程数 input_path = " --input "+"d:\\myprojects\\LTP\\file\\test.txt" # 输入文件 seg_lexicon = " --segmentor-lexicon "+"D:\\myprojects\\LTP\\file\\seg_lexicon.txt" # 分词用户词典 output_path = "D:\\myprojects\\LTP\\result\\out.txt" # 输出文件 command = "cd "+project_path+" & "+model_exe+threads_num+input_path+seg_lexicon+" > "+output_path os.system(command)
注意事项
(1)长度限制:为了防止输入过长句子对稳定性造成影响,限制输入字数少于1024字,分词结果少于256词。
(2)编码:统一采用UTF-8
使用心得
(1)ltp_test输出结果只有xml格式;(在线ltp-cloud api调用可以返回多种格式)
(2)ltp_test可以自动分句,遇到新的文本段落时,句子编号重新会从0开始(所以已经分好句的文本,输出结果中的句子编号都是0)
(3)单独使用某个功能模块时,需要事先分好句或者分好词;(不同分析之间存在的依赖关系)
(4)#、&、+等特殊符号不会影响LTP本地分析;(在线ltp-cloud api调用会有影响);
(5)cws_cmdline分词模块输出结果为plain格式,分词间隔用的是TAB制表符;
(6)pos_cmdline词性标注模块输出结果为plain格式,结果用TAB制表符分隔;词与词性之间以下划线(_)连接。
(7)分词用户词典问题:官方说“可以设置用户词典,但是ltp的分词模块并非采用词典匹配的策略,外部词典以特征方式加入机器学习算法,并不能保证所有的词都是按照词典里的方式进行切分。”
例子:“C++”、“互联网+”这样的词,加入词典还是不能切分出来。
(8)一定要注意编码问题:用户词典也要用UTF-8无BOM格式编码,如果是UTF-8格式编码,将导致第一行的词不能被正确识别(因为存在字节前缀)。
- 条件随机场(CRF):一种判别式概率模型,是随机场的一种,常用于标注或分析序列资料,如自然语言文字或是生物序列。简单是说在NER中应用是,给定一系列的特征去预测每个词的标签。
目前的思路是通过深度学习,将数据放入神经网络,输出理想结果,即得到特征。最后,将特征放到CRF进行应用。
使用NER,这是一个中文的实体命名识别系统。
使用CRF++
-
基于神经网络的实体识别和关系抽取联合学习
1.采用流水线的方法:输入一个句子,首先进行命名实体识别,然后对识别出来的实体进行两两组合,再进行关系分类,最后把存在实体关系的三元组作为输入。
这种方法容易造成错误传播,忽视两个子任务之间存在的关系,并且由于对识别出来的实体进行两两配对,然后再进行关系分类,那些没有关系的实体对就会带来多余信息,提升错误率。
2.联合学习:
输入一个句子,通过实体识别和关系抽取联合模型,直接得到有关系的实体三元组。这种可以克服上面流水线方法的缺点,但是可能会有更复杂的结构。
基于神经网络的联合学习:
分为两步:参数共享和标准策略。