精华内容
下载资源
问答
  • 机器学习规则抽取

    2016-09-21 15:13:25
    机器学习规则抽取源码,是学习规则抽取技术的好资料
  • The automatic extraction of information from unstructured sources has opened up new avenues for querying, organizing, and analyzing data by drawing upon the clean semantics of structured databases and...
  • 利用演绎推导特性对情节规则间的关联关系进行建模,引入无冗余情节迹规则的概念,分析了情节迹冗余的原因,通过最大重叠项冗余性检查给出广义无冗余情节规则抽取算法;证明了广义无冗余情节规则对情节规则的等价表达能力...
  • 规则挖掘是数据挖掘的一项重要研究内容,也是决策支持系统、人工智能和推荐系统等领域的研究热点,其中,属性约简和最小规则集合抽取是关键环节,尤其抽取效率决定了其可应用性。将粗糙集模型和粒计算理论应用于决策...
  • 统计机器翻译中翻译规则抽取
  • 基于聚类遗传算法的神经网络规则抽取及应用.pdf
  • 基于多种群协同优化的文本分类规则抽取方法
  • 结合链接结构聚类的混沌粒子群网页分类规则抽取.pdf
  • 一种基于混沌粒子群算法的网页分类规则抽取方法.pdf
  • 结合扩张矩阵理论,提出了一种简化规则抽取算法,该算法有效地解决了粗糙集约简算法生成的规则数量多、概括力不强的问题,并给出了相应的算法示例,示例结果证明了该算法能够有效地从信息安全事件和等级测评数据中抽...
  • 基于短语结构树的层次短语模型是在双语对齐短语的基础之上结合英语短语结构树抽取翻译规则,并利用启发式策略获得翻译规则的扩展句法标记。采用翻译规则的统计机器翻译系统在不同数据集上具有稳定的翻译结果,在训练...
  • 层次短语模型之短语规则抽取

    千次阅读 2014-04-21 15:19:33
    层次短语模型是David Chiang在短语模型基础之上提出来的模型,该模型属于...本文着重讲述层次短语模型的短语规则抽取模块,也就是如何从双语句对的训练集中抽取去“短语表”。 我们可以参看如下图,系统的总体框架图:

    层次短语模型是David Chiang在短语模型基础之上提出来的模型,该模型属于形式化句法翻译模型。将普通短语模型拓展成了层次化的短语。例如“X1 和 X2”。

    本文着重讲述层次短语模型的短语规则抽取模块,也就是如何从双语句对的训练集中抽取去“短语表”。


    我们可以参看如下图,系统的总体框架图:

     

    将系统中出现的物体都抽象成对象。大家可以通过命名就知道此点。


    下面我们将对重要的子过程进行讲述:

    1、LexTranslator词到词的翻译

    底层的数据结构如下:

    	typedef map<Word, Float> LexTableItem;
    	typedef map<Word, map<Word, Float> > LexTable;
    	LexTable f2e_table_; // prob(0.0-1.0) from f to e
    	LexTable e2f_table_; 

    基本流程如下:



    2、对齐一致性的抽取

    对齐一致性的抽取采用了前缀数组,通过检测数组的相应范围变化是否一致,得出是否为对齐一致性。

    void Alignment::CreateTightConsistSpan(int src_limit, int trg_limit)
    {
        //count the size of alignment of prefix
        vector<int> src_count, trg_count;
        src_count.resize(m_src_size, 0);
        trg_count.resize(m_trg_size, 0);
    
        for (size_t i = 0; i < (size_t)m_src_size; i++) 
    	{
            for (size_t j = 0; j < m_wa[i].size(); j++) 
    		{
                src_count[i]++;
                trg_count[m_wa[i][j]]++;
            }//end for j
        }//end for i
    
        for (size_t i = 1; i < src_count.size(); i++) 
    		src_count[i] += src_count[i - 1];
        for (size_t i = 1; i < trg_count.size(); i++) 
    		trg_count[i] += trg_count[i - 1];
    
    	Alignment::Span trg;
        for (int begin = 0; begin < m_src_size; begin++) 
    	{
            trg.first = MAX_INT;
            trg.second = MIN_INT;
            for (int dist = 1;  dist <= src_limit && dist + begin - 1 < m_src_size; dist++) 
    		{
                int end = begin + dist - 1;
                for (size_t i = 0; i < m_wa[end].size(); i++) 
    			{
                    if (trg.first > m_wa[end][i]) 
    					trg.first = m_wa[end][i];
                    if (trg.second < m_wa[end][i]) 
    					trg.second = m_wa[end][i];
                }
    
                if (trg.first > trg.second) //null alignment
                    continue;
                if (trg.second - trg.first + 1 > trg_limit)
                    continue;
    
                int f = src_count[end];
                if (begin != 0) 
    				f -= src_count[begin - 1];
    
                f -= trg_count[trg.second];
                if (trg.first != 0) 
    				f += trg_count[trg.first - 1];
    
                if (f == 0) //consistent to align
    			{
    				//tight consist, boundary words must have alignments
                    if (m_wa[begin].size() != 0 && m_wa[end].size() != 0) 
    					m_consist_spans[Alignment::Span(begin, end)] = trg;
                }
            }
        }
    }
    

    仔细研究代码,此段代码很高效!


    3、Extractor的抽取规则模块讲解

    void Extractor::Extract(const string& src_file, const string& trg_file, const string& wa_file)
    {
    	ifstream in_src, in_trg, in_wa;	
    	ReadFile(src_file, in_src);
    	ReadFile(trg_file, in_trg);
    	ReadFile(wa_file, in_wa);
    
    	Log::Instance().Out() << "Starting to extract rule!" << endl;
    	Log::Instance().TimeStart();
    
    	map<string, Rule *> sent_rules;//store the rules extracted from a sentence
    	map<string, Rule *> rule_map; //cache for store extracted but not yet output file
    	string src, trg, wa;
    
    	int part_file_id = 0;
    	int sent_id = 0;
    	int rule_count = 0;
    	while (getline(in_src, src)
    		&& getline(in_trg, trg)
    		&& getline(in_wa, wa)) 
    	{
    		sent_id ++;
    
    		SentPair sent;
    		sent.SetSentId(sent_id - 1);
    		
    		if (sent.Init(src, trg, wa)) 
    			sent.ExtractRules(sent_rules);
    		else 
    			continue;
    		
    		rule_count += sent_rules.size();
    		LocalCombine(sent_rules, rule_map);
    
    		if ((int) rule_map.size() > StaticData::Instance().Capacity()) 
    		{
    			OutCache(m_part_file, part_file_id, e2f, rule_map);
    			part_file_id++;
    		}
    
    		if (sent_id % 10000 == 0) 
    		{
    			Log::Instance().Out() << "cur sent_id:" << sent_id <<endl;;
    		}
    	}
    	OutCache(m_part_file, part_file_id, e2f, rule_map);
    
    	in_src.close();
    	in_trg.close();
    	in_wa.close();
    
    	Log::Instance().Out() << "end extracted rule in time (s):"
    		<< Log::Instance().TimeEnd() << endl;
    }

    不断的对每一句话进行提取规则,然后加入到规则表中,如果规则表的数目超过了设定的值,将输出到临时文件中,并且清空规则表。经过这一步的处理之后,就得到了很多临时文件。

    4、规则概率估算

    1)合并所有的临时文件->一个e2f的文件A

    2)对A进行排序

    3)计算f2e的概率,并且生成f2e文件B

    4)对B进行排序

    5)计算e2f的概率,并且生成最终规则文件

    5、抽取一个句对中所有的规则

    void SentPair::ExtractRules(std::map<string, Rule *>& rule_map)
    {
    	SentenceMeta sm;
    	sm.sent_id_ = this->sent_id_;
    	sm.src_ = &src_;
    	sm.trg_ = &trg_;
    	StaticData::Instance().GetFeatureSet().Prepare(sm);
    
    	// use cky-style algorithm to find all consistent rule
    	for (int dist = 1; dist <= StaticData::Instance().SrcSpanLimit(); dist++) 
    	{
    		for (size_t begin = 0; begin + dist - 1 < src_.size(); begin++) 
    		{
    			pair<int,int> span;
    			span.first = begin;
    			span.second = begin + dist - 1;
    
    			if (Log::Instance().IsVerbose(3)) 
    			{
    				Log::Instance().Out() << "\n deal span (" 
    					<< span.first << ", " << span.second << ")" <<endl;
    			}
    
    			GetRule(span, rule_map);
    		} //end begin
    	} //end dist
    
    	map<string, Rule *>::const_iterator citer;
    	for (citer = rule_map.begin(); citer != rule_map.end(); citer++)
    		StaticData::Instance().GetFeatureSet().Final(sm, *citer->second);
    }

    抽取某一个span范围内的规则

    void SentPair::GetRule(const pair<int,int>& span, map<string ,Rule *>& rule_map)
    {
    	// current span must be consist
    	Alignment::SpanAlign::const_iterator citer;
    	const Alignment::SpanAlign& cs = wa_->GetConsistSpans(); 
    	map<string, Rule *>::iterator iter;
    	citer = cs.find(span);
    	if (citer == cs.end()) 
    		return;
    	
    	// TODO support extract boundary expansion
    	// full lexical rule trg_span shall be small than limit
    	SentenceMeta sm;
    	sm.sent_id_ = this->sent_id_; 
    	sm.src_ = &src_;
    	sm.trg_ = &trg_;
    	Context context;
    	context.src_span_ = span;
    	context.trg_span_ = citer->second;
    
    	//extract bp
    	if (span.second - span.first + 1 <= StaticData::Instance().InitPhraseLimit()) 
    	{
    		vector<pair<int,int> > empty;		
    		Rule * rule = new Rule();		
    		CreateSrcTrg(span, empty, citer->second, empty, rule->src_rhs_, rule->trg_rhs_, rule->wa_);
    		StaticData::Instance().GetFeatureSet().Traverse(sm, context, 1.0, *rule);
    		//cout << "rule->fract_count_: " << rule->fract_count_ << endl;
    
    		iter = rule_map.find(rule->Key());
    		if (iter == rule_map.end()) 
    		{
    			rule_map[rule->Key()] = rule;
    		} 
    		else 
    		{
    			iter->second ->Add(*rule);
    			delete rule;
    		}
    	}
    	
    	//extract rules with variable 
    	vector<vector<pair<int,int> > > var_span;
    	EnumerateVar(span, var_span);	
    	vector<pair<int,int> > trg_childs_span;
    	for (size_t i = 0; i < (int)var_span.size(); i++) 
    	{
    		trg_childs_span.resize(var_span[i].size());
    		for (size_t j = 0; j < var_span[i].size(); j++)
    			trg_childs_span[j] = cs.find(var_span[i][j])->second;
    
    		Rule *rule = new Rule();
    		CreateSrcTrg(span, var_span[i], citer->second, trg_childs_span, rule->src_rhs_, rule->trg_rhs_, rule->wa_);
    		//cout << "rule->fract_count_: " << rule->fract_count_ << endl;
    		//if (rule->m_wa.size() == var_span[i].size()) {//must have lexical alignment
    		if (rule->AlignLinkCount() == var_span[i].size()) //must have lexical alignment
    		{
    			delete rule;
    			continue;
    		}
    		context.src_var_spans_ = var_span[i];
    		context.trg_var_spans_ = trg_childs_span;
    		StaticData::Instance().GetFeatureSet().Traverse(sm, context, (Float) 1.0/var_span.size(), *rule);
    		
    		iter = rule_map.find(rule->Key());
    		if (iter == rule_map.end()) 
    		{
    			rule_map[rule->Key()] = rule;
    		} 
    		else 
    		{
    			iter->second->Add(*rule);
    			delete rule;
    		}
    	}
    }


    展开全文
  • 知识图谱-基于规则的关系抽取

    千次阅读 多人点赞 2019-10-06 19:57:33
    文章目录一、简介二、原理三、实战1、规则集定义2、数据获取3、去除无关词组4、关系抽取5、抽取结果验证6、知识存储7、查询验证三、总结 一、简介 基于规则的知识抽取主要还是通过人工定义一些抽取规则,从文章中...


    一、简介

    前面讲了一篇LSTM+CRF人物关系抽取实战,稍微有些复杂,本篇主要来一个简单的,基于规则

    基于规则的知识抽取主要还是通过人工定义一些抽取规则,从文章中抽取出三元组信息(实体-关系-实体)。重点即是定义规则。虽然定义规则这种抽取方式看起来有点low,但却简单实用,很多时候,效果比很多高深的算法还要好一些(非绝对,具体领域具体分析)。
    本文的数据来源和https://blog.csdn.net/qq_21120275/article/details/102159314保持一致。

    二、原理

    本文的抽取原理主要分为三个步骤(这三个步骤可以多看几遍,下面的部分其实就不需要看了)

    第一步:定义需要抽取的关系集合,比如【父亲,母亲,儿子,女儿,…】
    第二步:遍历文章的每一句话,将每句话中非实体和非关系集合里面的词去掉
    第三步:从每句话的第二个词开始遍历,遇到关系集合中的词,就选出该词左右最近的实体

    本文没有贴出全部代码,只拿重点代码作为讲解。

    三、实战

    1、规则集定义

    本文从简单入手,依旧和https://blog.csdn.net/qq_21120275/article/details/102159314一样抽取人物关系,先定义需要抽取的关系集合

    allowRelationships = ['母亲','父亲','儿子','女儿','母','父','下嫁','又嫁','祖父','祖母','孙','孙子','改嫁','哥哥','姐姐','弟弟']
    

    2、数据获取

    使用requests进行文章内容的爬取

    import requests
    from lxml import etree
    import jieba
    from jieba import posseg
    import re
    hraders={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763'}
    url='http://www.uuqgs.com/lsrw/1358.html'
    html = requests.get(url,headers=hraders)
    text = html.content.decode("gb2312","ignore")
    selector = etree.HTML(text)
    content=selector.xpath('//div[@id="newscont"]/p/text()')
    

    3、去除无关词组

    通过jieba词性识别抽取出nr的实体和带有关系的词组,比如

    武德九年(626年),玄武门之变后,李渊退位称太上皇,禅位于儿子李世民  => 李渊  儿子 李世民
    
    # 抽取的实体词性
    allowTags = ['nr']
    relationships = set()
    for line in content:
        sentence = []
        for word, tag in posseg.cut(line):
            if tag == 'nr' or word in alowRelationships:
                sentence.append(word)
        sentence = ' '.join(sentence)
    

    4、关系抽取

    遍历一句话,从第二个词组开始,如果该词组属于要抽取的关系词组,则抽出前一个词组作为主语,后一个词语作为宾语:
    比如通过上一步骤,得到

    李渊  儿子 李世民
    

    从第二个词 儿子开始 ,判断属于关系词,则可认为李渊为主语,李世民为宾语

        sentenceSplit = sentence.split(' ')
        print("原始文本:", line)
        for i in range(1,len(sentenceSplit)-1):
            if sentenceSplit[i] in alowRelationships:
                source = sentenceSplit[i-1]
                relationship = sentenceSplit[i]
                target = sentenceSplit[i+1]
                print('提取结果:',source+'->'+relationship+'->'+target)
                relationships.add(source+'->'+relationship+'->'+target)
    

    5、抽取结果验证

    结果如下:

    '''
    原始文本: 武德九年(626年),玄武门之变后,李渊退位称太上皇,禅位于儿子李世民。
    提取结果: 太上皇->儿子->李世民
    原始文本: 李渊的祖父李虎,在西魏时官至太尉,是西魏八柱国之一。李渊的父亲李昞,北周时历官御史大夫、安州总管、柱国大将军,袭封唐国公。李渊的母亲是隋文帝独孤皇后的姐姐[7] 。
    提取结果: 李渊->祖父->李虎
    提取结果: 李渊->父亲->李昞
    提取结果: 李渊->母亲->隋文帝  #错误结果
    '''
    

    6、知识存储

    本文的存储形式采用rdf格式,使用rdflib工具包进行操作

    import rdflib
    
    g = rdflib.Graph()
    pesonUrl = 'http://www.huoyo.org/person/'
    relationshipUrl = 'http://www.huoyo.org/relationship/'
    for line in relationships:
        line = line.split('->')
        p1 = rdflib.URIRef(pesonUrl+line[0])
        re = rdflib.URIRef(relationshipUrl+line[1])
        #p2 = rdflib.URIRef(pesonUrl+line[2])
        p2 = rdflib.Literal(line[2])
        g.add((p1,re,p2))
        g.serialize("graph.rdf")
    

    文件结果如下

    <?xml version="1.0" encoding="UTF-8"?>
    <rdf:RDF
       xmlns:ns1="http://www.huoyo.org/relationship/"
       xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    >
      <rdf:Description rdf:about="http://www.huoyo.org/person/李渊">
        <ns1:女儿>南昌公主</ns1:女儿>
         ...
        <ns1:女儿>高密公主</ns1:女儿>
        <ns1:女儿>长沙公主</ns1:女儿>
        <ns1:儿子>彭思王李元则</ns1:儿子>
      </rdf:Description>
      <rdf:Description rdf:about="http://www.huoyo.org/person/周王李元方">
        <ns1:>张婕妤</ns1:>
      </rdf:Description>
       ...
      <rdf:Description rdf:about="http://www.huoyo.org/person/韩王李元嘉">
        <ns1:>宇文昭仪</ns1:>
      </rdf:Description>
    </rdf:RDF>
    
    

    7、查询验证

    使用sparql语言进行查询验证

    g = rdflib.Graph()
    g.parse("graph.rdf", format="xml")
    q = "PREFIX p: <"+pesonUrl+">" \
        "PREFIX r: <"+relationshipUrl+">" \
        "select distinct ?b where { p:李渊 r:儿子 ?b }"
    x = g.query(q)
    t = list(x) 
    for i in t:
        print(i)
    

    三、总结

    本文主要基于规则进行知识的抽取,核心点就是关系规则的定义和规则两边的实体抽取,整体效果还行,会有部分错误需要人工干预。基于规则抽取的优缺点如下:

    • 优点
    • 无需训练
    • 实现简单
    • 缺点
    • 需要人工干预,特别是细节处理上
    • 只能抽取实体-关系-实体模式的三元组,对于实体-实体-关系模式需要人工识别
    • 局限于通用领域的实体识别,特殊实体和词性需要单独处理

    另外由于本人没能及时回复的原因,代码已放在
    基于规则的关系抽取下载,找到资源下载模块自取

    展开全文
  • 基于机器学习的规则抽取算法演示源码,使用C++实现
  • 用TensorFlow实现神经网络实体关系抽取
  • 近年来,与关系抽取相关的研究势头越来越大,本文讨论了关系抽取的发展过程,并对近年来的关系抽取算法进行了分类。此外,我们还讨论了深度学习、强化学习、主动学习和迁移学习。通过分析监督学习、无监督学习、半...

    信息抽取——命名实体识别

    1 关系抽取介绍

    关系抽取(Relation Extraction)的概念字1988年在MUC大会上提出,是信息抽取的基本任务之一,目的是为了识别出文本实体中的目标关系。

    知识图是语义关联的实体,它将人们对物理世界的认知转化为计算机能够以结构化的方式理解的语义信息。关系抽取通过识别实体之间的关系来提取实体之间的语义关系。在现实世界中,关系的提取要比实体提取复杂得多,自然句子的形式也多种多样,所以关系的提取比实体提取困难得多。

    在这里插入图片描述

    关系抽取主要分为两个任务:

    • 关系分类
      • 基于预先给定的关系,对实体对进行分类匹配。
        Example 1:“Bill Gates works at Microsoft Inc.”
        Person-affiliation (Bill Gates,Microsoft Inc)
    • 开放关系抽取
      • 直接从文本中抽取结构化文本关系
      • 对文本关系映射到知识库的规范关系
        Example 2:Hudson was born in hampstead ,which is a suburb of London.
        (Husdon, w a s b o r n i n \color{red} was\quad born\quad in wasbornin , Hampstead)
        (Hampstead, i s a s u b u r d o f \color{red}is \quad a \quad suburd \quad of isasuburdof, London)

    关系抽取的发展主要也分为三个阶段:基于规则、传统机器学习和基于深度学习。其中机器学习又包括监督学习,无监督学习,半监督学习。深度学习主要是监督学习和远程监督学习。下面分别介绍这三种框架的经典算法。

    2 基于规则的关系抽取算法

    通过手写规则来匹配文本,实现关系的提取。主要是分为两种。

    2.1 基于触发词 (基于模式)

    假设X和Y表示公司类型,可使用如下模板表示收购(ACQUISITION)关系。当满足下述模板,则表示两个实体指称在这个句子中具有收购(ACQUISITION)关系。

    规则内容
    规则1X is acquired by Y
    规则2X is purchased by Y
    规则3X is bought by Y

    当匹配出以上模式时候,就可以根据规则提取出实体之间的关系(X,Acquisition,Y)

    2.2 基于依存关系(语法树)

    以动词为起点构建规则,对节点上的词性和边上的依存关系进行限定。
    在这里插入图片描述
    在这里插入图片描述

    2.3 基于规则的RE优缺点

    • 优点:
      • 人工规则有高准确度
      • 可以针对特定的垂直领域
      • 在小规模数据集哈桑容易实现
    • 缺点
      • 低召回率
      • 特定领域需要专家构建,费时费力
      • 难以维护
      • 每条关系都需要人工构建
      • 鲁棒性差

    3 基于机器学习的RE方法

    根据数据是否标注,可以分为监督学习(Supervised Study)、半监督学习(Semi-Supervised Study)和无监督学习(Unsupervised Study)。

    3.1 监督学习

    监督学习从训练数据中研究模型,并预测测试数据的关系类型。输入时自然语句,输出时预定义的关系集合。由于在RE任务中的向量都是来自非结构化的数据,所以需要对文本不同层次的语言进行形式化,对于文本的处理方法主要是两类:特征向量法(Feture Vectors/Eigenvector )和核函数法。

    3.1.1基于特征向量

    主要是从上下文信息,词性,句法中提取出一系列的特征向量,然后通过分类算法,如:

    • Naive Bayes
    • SVM
    • ME最大熵模型

    所谓的特征向量也就是一个实例的向量表示x, x i x^i xi就是N维特征向量的第i个元素。

    3.1.2 基于核函数

    通过核函数计算两个实体之间的相似度,来训练分类模型。核心在于如何设计核函数。
    在这里插入图片描述
    监督学习方法的准确率和标注数据的质量、数量成正比,且不能拓展新的关系,受限于训练语料库,也不适合在开放领域进行关系抽取,因此学术界开始转向半监督和无监督的学习方法。

    3.3 半监督学习—Booststrap和Snowball

    半监督学习又称弱监督学习,利用模型的假设,对少量的数据进行标注(freebase),在不足的条件下提高模型在标记样本中的泛化能力,未标记的数据为Corpus text。

    在论述Snowball之前,先看Boost strap,他是介于监督学习和半监督学习的算法。

    1 Boost strap

    根据已知的标记数据seed库,生成规则。在利用该规则在text中进行遍历,生成新的规则,新规则入库,作为标记的数据进行重新遍历。缺陷就是如果生成的一个规则不准确,这个错误的规则会在库中逐渐增大,导致正确率逐渐降低。

    在这里插入图片描述
    接下来Snowball基于这个缺陷,进行了改进。

    2 Snowball

    关 于 该 算 法 的 介 绍 看 我 这 篇 博 客 \color{red}关于该算法的介绍看我这篇博客 关系抽取——Snowball
    关于该算法的介绍看我这篇博客 关系抽取——Snowball
    关于该算法的介绍看我这篇博客 关系抽取——Snowball


    snowball在2000年被提出,提供了一种从文本文档生成模式和提取元组的新技术,此外,snowball还介绍了一种策略,用于评估在提取过程的每次迭代中生成的模式和元组的质量,只有那些被认为“足够可靠”的元组和模式才会被雪球保留,用于系统的后续迭代。

    在这里插入图片描述
    算法主要四个步骤

    Step1:生成模式

    定义规则:五元组构成 ( L , 实 体 1 , M , 实 体 2 , R ) \color{red}(L,实体1,M,实体2,R) L1M2R,其中,LMR是向量。
    给定文本按照: L + 实 体 1 + M + 实 体 2 + R \color{red}L+实体1+M+实体2+R L+1+M+2+R 的模板生成规则。
    在这里插入图片描述

    Step2:生成tuple

    在这里插入图片描述

    然后,每个候选tuple都有许多帮助生成它的模式,每个模式都有相应的匹配程度。snowball使用这些信息以及关于模式选择性的信息来决定将哪些候选元组实际添加到它正在构建的表中。

    Step3 :评估模式和tuple

    通过计算模式的置信度来决定该模式是否被选择,反之错误的模式产生更多错误的元组。同样的,错误的元组也可能生成无关的模式,通过不断迭代产生更多错误的tuple,(as the name(Snowball) implies).如果一个元组是由多个高得分的模式所产生的,它的置信度就会高。

    3.4 无监督学习—聚类

    监督和半监督学习都需要提前确定关系的类型,事实上,在大规模语料库中,人们往往无法预测所有类型的实体关系。一些研究者试图通过基于聚类思想来解决这一问题。

    无监督关系提取是由Hasegawa等人在2004年的ACL会议上首次提出的,随后的大多数方法都是在Hasegawa的基础上改进的。结果表明,聚类方法在关系提取中是非常可行的。

    首先,他们通过爬虫获取新闻文本,然后根据文章的来源开始分类。然后,根据句子的语义结构,提取出满足一系列约束条件的基本模式聚类实体,将这些实体按照基本模型进行映射,形成次级聚类,使每个次级聚类包含的实体之间的关系相同。

    无监督方法通常需要大规模的语料库作为支持。利用语料库的冗余度,挖掘可能的关系模式集,确定关系名称。该方法的不足之处在于关联名称难以准确描述,低频关联的召回率低

    4 基于深度学习的RE方法

    参考:鄂海红,张文静,肖思琪,程瑞,胡莺夕,周筱松,牛佩晴.深度学习实体关系抽取研究综述[J].软件学报,2019,30(06):1793-1818.

    基于深度学习的关系抽取,主要是有监督学习和远程监督学习。其中有监督学习主要有pipeline和Joint。

    • 流 水 线 \color{red}流水线 线NER串联RE,在实体识别完成的基础上直接进行实体之间关系的抽取;
    • 联 合 学 习 \color{red}联合学习 :基于神经网络端到端模型,同时完成实体的识别和实体间关系的抽取。
    • 远 程 监 督 方 法 \color{red}远程监督方法 :缺少人工标注数据集,比有监督多一步远程对齐知识库给无标签数据打标的过程。而构建关系抽取模型模型的部分,与有监督领域的流水线方法差别不大。

    基于DL的RE任务框架如下:

    1. 获取有标签数据:有监督方法通过人工标记获取有标签数据集,远程监督方法通过自动对齐远程知识库获取有标签数据集;
    2. 构建词向量表示:将有标签句子分词,将每个词语编码成计算机可以接受的词向量,并求出每个词语与句子中实体对的相对位置,作为这个词语的位置向量,将词向量与位置向量组合作为这个词语的最终向量表示;
    3. 进行特征提取:将句子中每一个词语的向量表示输入神经网络中,利用神经网络模型提取句子特征,进而训练一个特征提取器;
    4. 关系分类:测试时根据预先定义好的关系种类,将特征提取出的向量放入非线性层进行分类,提取最终的实体对关系;
    5. 评估分类性能:最后,对关系分类结果进行评估;

    在这里插入图片描述
    监督实体关系抽取框架演化流程
    在这里插入图片描述

    4.1 监督学习—流水线(Pipeline)

    As the name implies,流水线就是将NER和RE两个任务串联起来进行,在NER的基础上进行RE。首先,针对已经标注好目标实体对的句子进行关系抽取,最后把存在实体关系的三元组作为预测结果输出。主要是基于 RNN,CNN,LSTM 及其改进模型的网络结构。

    1 基于RNN的关系抽取

    RNN 在处理单元之间既有内部的反馈连接又有前馈连接,可以利用其内部的记忆来处理任意时序的序列信息,具有学习任意长度的各种短语和句子的组合向量表示的能力,已成功应用在多种 NLP 任务中。

    基于 RNN 模型进行关系抽取的方法由 Socher 等人[46]于 2012 年首次提出,此方法为分析树中的每个节点分配一个向量和一个矩阵,其中,向量捕获组成部分的固有含义,而矩阵捕捉它如何改变相邻单词或短语的含义.这种矩阵向量 RNN 可以在命题逻辑和自然语言中学习操作符的含义,解决了单词向量空间模型(singleword vector space models)无法捕捉到长短语的构成意义,阻碍了它们更深入地理解语言的问题。

    RNN 相比于前馈网络更适合处理序列化输入,但 RNN 也存在着以下两个缺点:

    • (1) 在网络训练时,RNN 容易出现梯度消失、梯度爆炸的问题,因此,传统 RNN 在实际中很难处理长期依赖,这一点在 LSTM 网络中有所改进;
    • (2) 由于 RNN 的内部结构复杂,网络训练周期较长,而 CNN 结构相对简单,主要包括前置的卷积层和后置的全连接层,训练更快速.

    2 基于CNN的关系抽取

    CNN 的基本结构包括两层:其一为特征提取层,每个神经元的输入与前一层的局部接受域相连,并提取该局部的特征;其二是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射是一个平面,平面上所有神经元的权值相等,减少了网络中自由参数的个数.由于同一特征映射面上的神经元权值相同,所以 CNN 网络可以并行学习.

    Zeng 等人在 2014 年首次提出了使用 CNN 进行关系抽取,利用卷积深度神经网络(CDNN)来提取词汇和句子层次的特征,将所有的单词标记作为输入,而无需复杂的预处理,解决了从预处理系统中提取的特征可能会导致错误传播并阻碍系统性能的问题.图 3 描述了该论文用于关系分类的神经网络的体系结构.网络对输入句子提取多个级别的特征向量,它主要包括以下 3 个组件:词向量表示、特征提取和输出.图 3 右部分显示了句子级特征向量构建过程:每个词语向量由词特征(WF)和位置特征(PF)共同组成,将词语向量放入卷积层提取句子级特征.图 3 左上部分为提取词汇级和句子级特征的过程,然后直接连接以形成最终的句子特征向量.最后如图3 左下部分,通过隐藏层和 Softmax 层得到最终的分类结果.

    在这里插入图片描述

    3 基于 LSTM的关系抽取

    由于梯度消失、梯度爆炸的问题,传统的 RNN 在实际中很难处理长期依赖,后面时间的节点对于前面时间的节点感知力下降.而 LSTM 网络通过 3 个门控操作及细胞状态解决了这些问题,能够从语料中学习到长期依赖关系.

    Yan 等人在 2015 年提出了基于 LSTM 的融合句法依存分析树的最短路径以及词向量特征、词性特征、WordNet 特征、句法类型特征来进行关系抽取,该论文的模型图如图 4 所示.首先,如图 4 左下部分,利用斯坦福解析器将句子解析为依赖树,并提取最短依赖路径(SDP)作为网络的输入,沿着 SDP,使用 4 种不同类型的信息(称为通道),包括单词、词性标签、语法关系和 WordNet 上位词;在每个通道中(图 4 右部分是每个通道的细节图),词语被映射成向量,捕获输入的基本含义,两个递归神经网络分别沿着 SDP 的左右子路径获取信息,网络中的 LSTM 单元用于有效信息的传播;之后,如图 4 左上部分,最大池化层从每个路径中的 LSTM 节点收集信息,来自不同通道的池化层连接在一起,然后输入到隐藏层;最后,使用 Softmax 输出层用于关系分类。

    在这里插入图片描述

    4 流水线方法存在的问题

    1. 错误传播:实体识别模块的错误会影响到接下来的关系分类性能;
    2. 忽视了两个子任务之间存在的关系:丢失信息,影响抽取效果;
    3. 产生冗余信息:由于对识别出来的实体进行两两配对,然后再进行关系分类,那些没有关系的实体对就会带来多余信息,提升错误率.

    4.2 监督学习—联合学习(Joint)(End2End)

    相比于流水线方法,联合学习方法能够利用实体和关系间紧密的交互信息,同时抽取实体并分类实体对的关系,很好地解决了流水线方法所存在的问题。

    联合学习方法通过实体识别和关系分类联合模型,直接得到存在关系的实体三元组.因在联合学习方法中建模的对象不同,联合学习方法又可以分为参数共享方法和序列标注方法:参数共享方法分别对实体和关系进行建模,而序列标注方法则是直接对实体-关系三元组进行建模.下面分别对这两种方法进行说明。

    针对流水线方法中存在的错误累积传播问题和忽视两个子任务间关系依赖的问题,基于参数共享的实体关系抽取方法被提出.在此方法中,实体识别子任务和关系抽取子任务通过共享联合模型的编码层来进行联合学习,通过共享编码层,在训练时,两个子任务都会通过后向传播算法更新编码层的共享参数,以此来实现两个子任务之间的相互依赖,最终找到全局任务的最佳参数,实现性能更佳的实体关系抽取系统.在联合学习模型中,输入的句子在通过共享的编码层后,在解码层会首先进行实体识别子任务,再利用实体识别的结果,并对存在关系的实体对进行关系分类,最终输出实体-关系三元组.

    1 参数共享

    针对流水线方法中存在的错误累积传播问题和忽视两个子任务间关系依赖的问题,基于参数共享的实体关系抽取方法被提出.在此方法中,实体识别子任务和关系抽取子任务通过共享联合模型的编码层来进行联合学习,通过共享编码层,在训练时,两个子任务都会通过后向传播算法更新编码层的共享参数,以此来实现两个子任务之间的相互依赖,最终找到全局任务的最佳参数,实现性能更佳的实体关系抽取系统。

    在联合学习模型中,输入的句子在通过共享的编码层后,在解码层会首先进行实体识别子任务,再利用实体识别的结果,并对存在关系的实体对进行关系分类,最终输出实体-关系三元组。

    Miwa 等人在 2016 年首次将神经网络的方法用于联合表示实体和关系,其模型图如图 5 所示.在该模型中,实体识别子任务和关系分类子任务共享编码层的 LSTM 单元序列表示(编码层包括 LSTM 单元和隐藏层).该方法将实体识别任务当作序列标注任务,使用双向序列 LSTM 输出具有依赖关系的实体标签;之后,通过在双向序列 LSTM 单元上堆叠双向树结构 LSTM 的方法,使关系分类子任务和实体识别子任务共享编码层的 LSTM单元序列表示,同时,在关系分类子任务中捕获词性标签等依赖特征和实体识别子任务中输出的实体序列,形成依存树,最终根据依存树中目标实体间的最短路径对文本进行关系抽取.但该模型中的关系分类子任务和实体识别子任务仅共享了编码层的双向序列 LSTM 表示,从严格意义上来说不是真正的联合模型.但是该模型的提出,为之后真正意义上联合学习模型的提出奠定了基础,是基于深度学习方法做联合学习模型的启发者。

    在这里插入图片描述

    2 序列标注

    基于参数共享的实体关系抽取方法,改善了传统流水线方法中存在的错误累积传播问题和忽视两个子任务间关系依赖的问题.但因其在训练时还是需要先进行命名实体识别子任务,再根据实体预测信息对实体进行两两匹配,最后进行关系分类子任务,因其在模型实现过程中分开完成了命名实体识别和关系分类这两个子任务,仍然会产生没有关系的实体这种冗余信息.为了解决这个问题,基于新序列标注方法的实体、关系联合抽取方法被提出.

    Zheng 等人在 2017 年提出了基于新的标注策略的实体关系抽取方法,把原来涉及到命名实体识别和关系分类两个子任务的联合学习模型完全变成了一个序列标注问题.在该方法中,共包含 3 种标注信息:

    • (1) 实体中词的位置信息{B,I,E,S,O},分别表示{实体开始,实体内部,实体结束,单个实体,无关词};
    • (2) 实体关系类型信息,需根据实际需要自定义关系类型并编码,如{CF,CP,…};
    • (3) 实体角色信息{1,2},分别表示{实体 1,实体 2}.

    该方法能使用序列标注的方法同时识别出实体和关系,避免了复杂的特征工程,通过一个端到端的神经网络模型直接得到实体-关系三元组,解决了基于参数共享的实体关系抽取方法可能会带来的实体冗余的问题.新序列标注方法的模型图如图 6所示.在该端到端的神经网络模型中,对输入的句子,首先,编码层使用 Bi-LSTM来进行编码;之后,解码层再使用 LSTM 进行解码;最终,输出模型标注好的实体-关系三元组。

    • 在这里插入图片描述

    3 联合学习存在的共性问题

    联合学习方法包括基于参数共享和基于新序列标注的实体关系抽取方法:

    • 前者很好地改善了流水线方法中存在的错误累积传播问题和忽视两个子任务间关系依赖的问题;
    • 而后者不仅解决了这两个问题,还解决了流水线方法中存在的冗余实体的问题.
    • 但这两种方法对于现今有监督领域存在的重叠实体关系识别问题,并未能给出相关的解决方案。

    4 监督学习的关系抽取核心公式

    加粗样式

    4.3 基于远程监督的RE

    Mintz于 2009 年首次提出将远程监督应用到关系抽取任务中,其通过数据自动对齐远程知识库来解决开放域中大量无标签数据自动标注的问题。远程监督标注数据时主要有两个问题:噪声和特征提取误差传播.

    下面按照 PCNN及其扩展模型、LSTM、COTYPE、深度残差网络的顺序来进行远程监督领域实体关系抽取的主流方法介绍.。

    在这里插入图片描述

    1 基于 PCNN 及其扩展模型的实体关系抽取

    • 基于 PCNN 和多示例(MIL)的实体关系抽取
    • 基于 PCNN 和注意力机制(ATT)的实体关系抽取
    • 基于 PCNN、注意力机制和实体表示信息的实体关系抽取

    2 基于 LSTM 的实体关系抽取方法

    He 等人提出一种 SE-LSTM 结合多示例学习的方法来解决远程监督中错误传播、错误积累问题。

    • a) LSTM 网络抽取实体对方向性信息(图 10 左上部分):HE 等人首先将句子的最短依存路径(SDP)分割成两个子路径作为 LSTM 结构的输入,自动地抽取特征,以此来抽取实体对的方向性信息;

    • b) CNN 网络提取句子整体信息(图 10 右部分):尽管 SDP 对关系抽取非常有效,但是这并不能捕捉到句子的全部特征.针对此问题,作者将全部句子放进 CNN 网络,进而抽取句子的全部信息(sentence embedding);

    • c) 特征融合(图 10 左下部分):最后,将 LSTM 隐藏层单元以及 CNN 的非线性单元相融合,通过 Softmax层来标注实体对对应的关系。

    在这里插入图片描述

    3 基于 COTYPE 联合抽取模型的实体关系抽取方法

    还没看论文(参考文献3)

    4 基于深度残差网络的实体关系抽取方法

    还没看论文

    Reference:

    1.《A Review on Entity Relation Extraction》; DOI:10.1109/ICMCCE.2017.14
    2.《A survey of relation extraction of knowledge graphs》;DOI:https://doi.org/10.1007/978-3-030-33982-1
    3. 鄂海红,张文静,肖思琪,程瑞,胡莺夕,周筱松,牛佩晴.深度学习实体关系抽取研究综述[J].软件学报,2019,30(06):1793-1818

    展开全文
  • 知识图谱-基于规则-知识抽取简介

    千次阅读 2020-01-06 20:20:11
    知识抽取涉及的“知识”通常是 清楚的、事实性的信息,这些信息来自不同的来源和结构,而对不同数据源进行的知识抽取的方法各有不同,从结构化数据中获取知识用 D2R,其难点在于复杂表数据的处理,包括嵌套表、多列...

    摘自徐阿衡,加入一些理解和注释

    介绍

    知识抽取涉及的“知识”通常是 清楚的、事实性的信息,这些信息来自不同的来源和结构,而对不同数据源进行的知识抽取的方法各有不同,从结构化数据中获取知识用 D2R,其难点在于复杂表数据的处理,包括嵌套表、多列、外键关联等,从链接数据中获取知识用图映射,难点在于数据对齐,从半结构化数据中获取知识用包装器,难点在于 wrapper 的自动生成、更新和维护,这一篇主要讲从文本中获取知识,也就是我们广义上说的信息抽取。

    在这里插入图片描述信息抽取三个最重要/最受关注的子任务:

    实体抽取
    也就是命名实体识别,包括实体的检测(find)和分类(classify)
    关系抽取
    通常我们说的三元组(triple) 抽取,一个谓词(predicate)带 2 个形参(argument),如 Founding-location(IBM,New York)
    事件抽取
    相当于一种多元关系的抽取(不做介绍)

    一、实体抽取 / 命名实体识别(NER)

    实体抽取或者说命名实体识别(NER)在信息抽取中扮演着重要角色,主要抽取的是文本中的原子信息元素,如人名、组织/机构名、地理位置、事件/日期、字符值、金额值等。实体抽取任务有两个关键词:find & classify,找到命名实体,并进行分类。

    ex:
    在这里插入图片描述主要应用:

    命名实体作为索引和超链接
    情感分析的准备步骤,在情感分析的文本中需要识别公司和产品,才能进一步为情感词归类
    关系抽取(Relation Extraction)的准备步骤
    QA 系统,大多数答案都是命名实体

    传统机器学习方法

    标准流程:
    Training:

    1.收集代表性的训练文档
    2.为每个 token(分词后的短语,个人理解) 标记命名实体(不属于任何实体就标 Others O)
    3.设计适合该文本和类别的特征提取方法
    4.训练一个 序列分类器( sequence classifier) 来预测数据的 label(类别,人物,地点等)

    Testing:

    1.收集测试文档
    2.运行 序列分类器 给每个 token 做标记
    3.输出命名实体(NE)

    gfsg
    特征选择(Features for sequence labeling)
    来看一个比较重要的 特征(feature)
    Word substrings(子串)
    Word substrings (包括前后缀)的作用是很大的,以下面的例子为例,NE(命名实体) 中间有 ‘oxa’ 的十有八九是 drug,NE 中间有 ‘:’ 的则大多都是 movie,而以 field 结尾的 NE 往往是 place。

    实体链接,消歧
    实体识别完成之后还需要进行归一化,比如万达集团、大连万达集团、万达集团有限公司这些实体其实是可以融合的。
    在这里插入图片描述主要步骤如下:

    1.实体识别
    命名实体识别,词典匹配

    2.候选实体生成
    表层名字扩展,搜索引擎,查询实体引用表

    3.候选实体消歧
    图方法,概率生成模型,主题模型,深度学习

    关系抽取

    关系抽取 需要从文本中抽取两个或多个实体之间的语义关系,主要方法有下面几类:

    基于模板的方法(hand-written patterns) (也称作基于规则)

    • 基于触发词/字符串(模式)
    • 基于依存句法(以动词为起点构建规则,对节点上的词性和边上的依存关系进行限定)
      在这里插入图片描述在这里插入图片描述小结
      手写规则的 优点 是:
    • 人工规则有高准确率(high-precision)
    • 可以为特定领域定制(tailor)
    • 在小规模数据集上容易实现,构建简单

    缺点:

    • 低召回率(low-recall)
    • 特定领域的模板需要专家构建,要考虑周全所有可能的 pattern 很难,也很费时间精力
    • 需要为每条关系来定义 pattern
    • 难以维护
    • 可移植性差

    机器学习方法在本文不作详述

    监督学习(supervised machine learning)

    • 机器学习
    • 深度学习(Pipeline vs Joint Model)

    监督学习-小结
    如果测试集和训练集很相似,那么监督学习的准确率会很高,然而,它对不同 genre 的泛化能力有限,模型比较脆弱,也很难扩展新的关系;另一方面,获取这么大的训练集代价也是昂贵的。

    半监督/无监督学习(semi-supervised and unsupervised)

    • Bootstrapping
    • Distant supervision
    • Unsupervised learning from the web
    展开全文
  • 基于规则的常用实体信息抽取

    千次阅读 2019-05-20 22:51:08
    文本中经常涉及到一些信息的抽取,有的是通过CRF算法来实现的,如:人名、地名、机构名等,有的则可以通过规则来实现,本文就常用的实体,如电话号码、身份证号码等信息的抽取做一个总结。 1. 文本中url地址抽取 ...
  • 前言:同事给了我一个看起来并不简单的活,根据一定的规则随机抽取一定数量的人参加下次考试,为什么我觉得不容易呢?规则如下: 60-69分:该人员继续参加下月考试; 70-79分:无; 80-89分:该人员下月免试; 90分...
  • 将基于CRF的方法与规则抽取方法相结合来进行地址抽取,并将优化后的结果再用来进行CRF训练;此过程不断循环迭代,直至性能不再提升,最后得到多个CRF分类器。这个不断迭代的过程就是基于群集智能的ACG算法流程,最后...
  • 关联规则挖掘算法apriori算法的实现
  • 因此提出了一种综合多种数据源,并结合规则推理引擎的实体关系抽取方法,准确地说就是综 合结构化和非结构化两种数据源,在结构化数据提供少量种子的情况下用规则推理引擎推理出更多的实体关 系。然后使用远程监督...
  • 针对领域术语抽取问题,采用基于规则和多种统计策略相融合的方法,从词语度和领域度两个角度出发,提出一种领域术语的抽取算法并构建出相应的抽取系统。系统流程包括基于左右信息熵扩展的候选领域术语获取、基于词性...
  • NER命名实体抽取

    2020-09-22 18:40:02
    NER抽取针对无规则数据,有规则数据也没必要去做了,针对英文数据个人推荐几个工具:NLTP,hanlp,stanfordcorp,下来大概说一下nltp去提取命名实体: # coding=utf-8 import re import pandas a
  • 通过文档对象模型(DOM)解析以及检索、抽取、映射等规则的定义,设计并实现了一种具有规则归纳能力的信息抽取系统,用于Web信息的自动检索。在用于抽取规则归纳的框架下,还重点对用于生成抽取模式的WHISK学习算法...
  • 规则提取介绍

    千次阅读 2018-04-24 18:45:38
     模型的规则用析取范式 R =(r1 ∨ r2 ∨ ••• ∨ rk)表示,其中R称作规则集,ri 是分类规则或析取项。  每一个分类规则可以表示为如下形式: ri:(条件i)→yi 规则左边成为规则前件或前提。它是属性测试的合...
  • 如何从非结构化的PDF文档中抽取结构化数据是知识图谱领域所面临的一大 挑战。本项目利用Adobe公司开发的 Acrobat DC SDK对PDF进行格式 转换,从半结构化的中间文件进行信息抽取。相比已有方法, Acrobat导出的中间...
  • 1. 半结构化数据定义 ...2.百科类知识抽取 3. Web网页数据抽取:包装器生成 现在我们的目标网站是部分结构化的,如: 包装器归纳 借助基于有监督学习的方法,自动的从标注好的训练样例集合中学习数
  • 基于依存树与规则相结合的汉泰新闻事件要素抽取方法
  • 而对于数据记录之间的不规则性问题,在已有的标签树匹配算法的基础上加入了对节点内容的考虑,提高了两棵标签树匹配的准确率。根据构成数据记录的标签树之间的匹配结果,再采用部分树对齐算法生成一个数据记录的最大...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 86,317
精华内容 34,526
关键字:

规则抽取