精华内容
下载资源
问答
  • 关系抽取 代码by freeCodeCamp 通过freeCodeCamp 免费代码营不能赚钱,没关系 (Free Code Camp Doesn’t Make Money, and That’s OK) When people hear that Free Code Camp is completely free, their reflexive...

    关系抽取 代码

    by freeCodeCamp

    通过freeCodeCamp

    免费代码营不能赚钱,没关系 (Free Code Camp Doesn’t Make Money, and That’s OK)

    When people hear that Free Code Camp is completely free, their reflexive question is: “then how does Free Code Camp make money?” If you’ve watched the popular investment-themed reality TV show “Shark Tank”, profit is usually the first thing its investors ask about. And that totally makes sense for the capital intensive businesses they tend to feature on that show. There are really only two ways to fund your business: 1) take venture/angel capital, or 2) bootstrap your business with early sales. But what if you don’t need to fund your business?

    当人们听说Free Code Camp完全免费时,他们反省的问题是:“那么Free Code Camp如何赚钱?” 如果您看过热门的以投资为主题的真人秀节目“鲨鱼坦克”,则利润通常是投资者所要求的。 对于他们倾向于在该节目中展示的资本密集型业务而言,这完全有意义。 实际上,只有两种方法可以为您的企业提供资金:1)接受风险/天使资本,或者2)通过早期销售引导您的企业。 但是,如果您不需要为业务筹集资金怎么办?

    Free Code Camp isn’t a capital-intensive business. Let’s compare Free Code Camp to traditional coding bootcamps, which use traditional private school business models. A traditional coding bootcamp’s overhead:

    Free Code Camp不是资本密集型业务。 让我们将Free Code Camp与使用传统私立学校商业模式的传统编码训练营进行比较。 传统编码训练营的开销:

    • A campus. Usually an office space with desks and monitors. In San Francisco, renting one floor of an office building costs about a million dollars per year.

      一个校园。 通常是一个带桌子和显示器的办公空间。 在旧金山,租用办公楼的一层每年花费约一百万美元。
    • Teachers. If they’re good enough to be working as software engineers, you have to pay them like software engineers to attract them, which means at least $50 per teacher per hour of instruction.

      教师。 如果他们足以胜任软件工程师的工作,则必须像软件工程师一样付钱给他们以吸引他们,这意味着每位老师每小时的教学费用至少为50美元。
    • Marketing. If you’re paying a millions per year for office space and payroll, you need hundreds of students to pay your $15,000 tuition in order to break even. To do so, you’ll need to spend money on marketing professionals and advertisements.

      行销 如果您每年要支付数百万美元的办公空间和薪资,则需要数百名学生支付15,000美元的学费才能收支平衡。 为此,您需要花钱在营销专家和广告上。
    • Administrators. You have to manage the HR, leases, taxes, scheduling, counseling, and everything else necessitated by the first three.

      管理员。 您必须管理人力资源,租赁,税收,计划,咨询以及前三项所需的其他一切。

    Free Code Camp’s overhead:

    Free Code Camp的开销:

    • No campus. Your kitchen table is our campus. If you want to meet another student to pair program in person, your tax dollars have already paid for nice public spaces like your local library.

      没有校园。 您的厨房餐桌是我们的校园。 如果您想与其他学生面对面结对编程,则您的税金已经用于支付不错的公共场所(如您当地的图书馆)的费用。
    • No advertising. We market ourselves through our product: people who can code. We also blog, tweet relevant links, and live stream pair programming sessions. We’re not paying money to expose people to annoying ads.

      没有广告。 我们通过我们的产品推销自己:可以编码的人。 我们还发布博客,鸣叫相关链接和实时流对编程会议。 我们不会花钱让人们接触到烦人的广告。
    • No administrators. Once you’ve removed all these above things, there’s not much left to administer.

      没有管理员。 删除所有上述所有内容后,就没有多少可管理的了。

    I make enough money consulting that I can afford to hang out in co-working spaces, eat subway, and work on Free Code Camp, indefinitely. I don’t need to please investors or figure out some short term path to profitability.

    我赚到了足够的咨询费用,我可以负担得起可以在同事间闲逛,吃地铁和无限期地参加Free Code Camp。 我不需要取悦投资者或想出一些短期的盈利途径。

    Free Code Camp isn’t a startup. The most popular definition of a startup comes from Y-combinator founder Paul Graham: “A startup is a company designed to grow fast”. Free Code Camp meets neither of these criteria. It’s more of a community than a company. It’s not designed to grow fast, it’s designed to help people break into coding. When Free Code Camp needs to ‘monetize’, it will get money from employers, not users. And seeing that many companies have scaled infrastructure similar to ours into the hundreds of thousands of users without growing pains, I don’t think we’ll even need to charge employers any time soon.

    Free Code Camp不是一家初创公司。 Y-combinator创始人Paul Graham提出了最流行的创业公司定义:“ 创业公司是一家旨在快速成长的公司 ”。 Free Code Camp不满足这两个条件。 它比公司更像一个社区。 它并非旨在快速增长,而是旨在帮助人们突破编码。 当Free Code Camp需要“货币化”时,它将从雇主而不是用户那里获得收益。 而且,看到许多公司都将与我们类似的基础架构扩展到成千上万的用户而又毫不费力,我认为我们甚至都不需要很快向雇主收费。

    翻译自: https://www.freecodecamp.org/news/free-code-camp-doesnt-make-money-and-thats-ok-19bcbff64b5c/

    关系抽取 代码

    展开全文
  • TPLinker 实体关系抽取代码解读

    千次阅读 2020-11-15 19:07:12
    这篇论文是最新的基于joint方式进行的联合抽取实体关系的模型。主要创新点是提出了新的标注数据方法,具体可以看论文,本篇的主要目的是解读代码逻辑,更多想法细节可以先看论文。 主要算法流程就是: 总结来...

    前言:

    论文:https://arxiv.org/pdf/2010.13415.pdf

    代码:https://github.com/131250208/TPlinker-joint-extraction

    这篇论文是最新的基于joint方式进行的联合抽取实体关系的模型。主要创新点是提出了新的标注数据方法,具体可以看论文,本篇的主要目的是解读代码逻辑,更多想法细节可以先看论文。

     

    我们还是重点分两部分来看:输入数据部分+模型

    输入数据部分

    我们都假设seq的长度都是5

    追踪train_dataloader-->indexed_train_data-->data_maker-->DataMaker4Bert

    DataMaker4Bert位于tplinker.py

    其输入就是tokenizer和handshaking_tagger,其中tokenizer比较好理解就是bert输入前的编码id,重点看一下handshaking_tagger,用到了它的get_spots类函数

    追踪handshaking_tagger-->tplinker.py下的HandshakingTaggingScheme类

    19-23就是实体标签就是2种,26-37行就是关系标签三种(0,1,2),44行的shaking_ind2matrix_ind就是上三角铺平序列

    self.matrix_ind2shaking_ind就是没有优化前的完整矩阵,是一个二维矩阵,其上位三角每个元素储存着上三角铺平序列的相对应的位置序号

    看他的get_spots函数

    其56-59行就是将实体保存起来,形式是:【起始位置,尾部位置,实体标签(1)】

    61-64行是实体头部存储,形式是:【关系类别,实体_1 头部,实体_2头部,关系标签(1,2)】

    66-69行是实体尾部存储,形式是:【关系类别,实体_1 尾部,实体_2尾部,关系标签(1,2)】

    最后我们来看dataloader总返回是什么即DataMaker4Bert的返回值:

    sample_list, batch_input_ids, batch_attention_mask, batch_token_type_ids, tok2char_span_list基本就是通过BertTokenizerFast生成的id。

    重点来看batch_ent_shaking_tag, batch_head_rel_shaking_tag, batch_tail_rel_shaking_tag这三个

    其中实体batch_ent_shaking_tag用到了handshaking_tagger的sharing_spots2shaking_tag4batch的函数

    生成的batch_shaking_seq_tag维度就是[batch,5+4+3+2+1]

    111-112行就是声明这么一个tensor。

    113-117行就是对这个序列标注。

    其中关系batch_head_rel_shaking_tag, batch_tail_rel_shaking_tag用到了handshaking_tagger的spots2shaking_tag4batch的函数,其实和sharing_spots2shaking_tag4batch差不多,但是其得到的batch_shaking_seq_tag维度是:

    【batch,n,5+4+3+2+1】

    n 是关系总数

    即batch_head_rel_shaking_tag, batch_tail_rel_shaking_tag的维度都是【batch,n,5+4+3+2+1】

     

    总结一下最后的返回值就是:

    模型

    tplinker/train.py

    核心入口就是389-393

    即tplinker.py下的TPLinkerBert

    404行就是为了做实体预测最后维度是 2(标签就是0和1)

    405是关系头部的一个全连接(标签有三个0,1,2),注意每一个关系有一个独立的MLP层所以self.head_rel_fc_list是一个列表

    406就是关系尾部啦

    上述就是关系和实体关系预测了,可以看到实体和各个关系都单独被分了一个mlp层,假设有2中关系,其实上面就有5个MLP层即  :1个实体预测层+(1个头部层+1个尾部层)*2

    这是上游,底层的话大家都一样,共享编码(有很多种,bert啦,Bilstm,这里我们看bert),对应到代码 ,shaking_hiddens4ent就是共享编码

    468行就是用这个编码过实体抽取的mlp层得到预测结果

    471-472行就是用这个编码过各个关系的头部的MLP层,得到两个关系实体的头部预测

    474-476行就是用这个编码过各个关系的尾部的MLP层,得到两个关系实体的尾部预

    好啦,下面来看共享编码shaking_hiddens4ent是怎么来的,根据432行-->416行得到是common.components.py 里面的HandshakingKernel,其核心代码:

    输入的seq_hiddens维度是[batch,seq_len, hidden_size],其获得就可以简单看成是一句话经过bert后的编码,这里使用的是transformers这个python包,用的其AutoModel的即train.py下的278行,说白了就是用bert作为底层的encoder,下面假设seq_len是5

    回到HandshakingKernel(上上副图),这里不得不讲一下论文中的优化到上三角,假设我们一句话有5个单词,本来矩阵是5*5,但是优化后只要上三角就可以啦,其实第一行是5列,第二行就是4列,第三行是3列,第四行是2列,第四行是1列,然后把他们平铺成一个序列即5+4+3+2+1.

    进一步对应到论文的部分就是:

    从当前往后看即5,4,3,2,1 主要这里是j>=i就是要包括自身,因为自身单独一个单词可能就是一个实体

    所以HandshakingKernel主要就是在做这个事情:

    (1)代码中144行其实就是一个个遍历行,146行就是从当前取到最后,当是第一行时,ind是0,hidden_each_step维度是[batch,1,hidden_size]代表整句话第一个word的编码,为了进行拼接147行repeat_hiddens在第二个维度进行了复制,维度变成了[batch,5,hidden_size],相当于将当前单词编码复制了5份,visible_hiddens维度就是[batch,5,hidden_size],是从当前单词往后(包括自身)各个单词的编码,现在要计算得到上三角第一行的编码,即150行的shaking_hiddens,将当前单词和其后的各个单词的编码进行concat维度是[batch,5,hidden_size*2],然后151行又过了一个MLP层,转化为了shaking_hiddens [batch,5,hidden_size]

    (2)当是上三角第二行时,ind是1,hidden_each_step维度是[batch,1,hidden_size]代表第二个单词的编码,visible_hiddens维度就是[batch,4,seq_len],代表其后的各个单词的编码,为了拼接repeat_hiddens维度是[batch,4,hidden_size]即将hidden_each_step第二个单词复制了4份,shaking_hiddens此时是[batch,4,hidden_size*2],然后151行又过了一个MLP层,转化为了shaking_hiddens[batch,4,hidden_size]

    (3)同理当是上三角第三行时,最后shaking_hiddens维度是[batch,3,hidden_size],以此例推

    所以163行的shaking_hiddens_list是一个列表,就是记录上三角一行行的编码,当句子有5个单词时,该列表有五个元素,维度分别是:

    [batch,5,hidden_size],[batch,4,hidden_size],[batch,3,hidden_size],[batch,2,hidden_size],[batch,1,hidden_size]

    161行long_shaking_hiddens在第二个维度进行concat即维度是:[batch,5+4+3+2+1,hidden_size],平铺变成了一个sequence。

    long_shaking_hiddens就是公共编码就是shaking_hiddens4ent。

     

    再回到tplinker.py下的TPLinkerBert

    432行shaking_hiddens就是上述的输出,维度是是[batch,5+4+3+2+1,hidden_size],437-457行是加距离emb。

    440-447就是一个初始化(可以看到是用sin,cos初始化的,是不是想起来训练word2vec的初始化啦)

    注意450-452其实就是将距离emb也平铺成成一个序列,方便和shaking_hiddens运算。用了类似HandshakingKernel的手段进行平铺,451行的dist_emb的维度是[5,hidden_size],每一个距离一个emb(5中距离,0-4),上三角第一行的覆盖的距离范围是0-4,所以451行dist_embbeding_segs列表第一个元素维度是[5,hidden_size],上三角第二行的覆盖的距离范围就只有0-3,所以451行dist_embbeding_segs列表第一个元素维度是[4,hidden_size],注意dist_embbeding_segs第一个元素的前四个距离的编码和

    dist_embbeding_segs第二个元素的四个距离的编码其实是一样的。一共就5种距离编码!!!

    452行的self.dist_embbedings就是concat成一个序列即其维度是[5+4+3+2+1,hidden_size]

    所以455行shaking_hiddens是[batch,5+4+3+2+1,hidden_size] ,self.dist_embbedings经过在第一维(batch)repeat后也是[batch,5+4+3+2+1,hidden_size],进行相加,就得到了加位置编码的最终共享编码。再往下就是我们一开始说的实体和关系网络

    ent_shaking_outputs:实体预测 [batch,5+4+3+2+1,2]

    head_rel_shaking_outputs, 关系实体头部预测 [batch,n,5+4+3+2+1,3]

    tail_rel_shaking_outputs关系实体尾部部预测 [batch,n,5+4+3+2+1,3]

    注意这里的n代表的是关系总数,478和479就是将各个关系的结果concat起来的,其实

    head_rel_shaking_outputs_list和tail_rel_shaking_outputs_list都是一个有n个元素的列表,为一个元素的维度都是[batch,5+4+3+2+1,3]

    至此我们得到了预测结果

    下面我们看两方面:解码得到三元组和计算Loss

    (1)解码

    我们再来看一下通过这三个结果ent_shaking_outputs、head_rel_shaking_outputs、tail_rel_shaking_outputs怎么解码出实体关系

    即tplinker.py下的HandshakingTaggingScheme类,其方法就是 decode_rel_fr_shaking_tag

    主要算法流程就是:

    总结来说就是:

    4-8 先进行实体抽取得到字典D(key是实体头部,value是实体尾部)

    第9-35就开始一个一个遍历关系

    10-16 通过关系得到有关系的两个实体的尾部得到E

    18-26 先通过关系得到有关系的两个实体的头部,然后结合字典D,可以得到后续两个实体尾部set(s),set(o),这是真实的的抽取的实体

    27-34 通过set(s),set(o)看看在不在关系抽取实体的E里面,如果在就是成功抽取了一条三元组。

    代码是:

    其输入可以从Evaluation.ipynb看

    通过argmax其实就是取出预测的结果

    ent_shaking_tag 【batch,5+4+3+2+1,1】
    head_rel_shaking_tag【batch,n,5+4+3+2+1,1】
    tail_rel_shaking_tag【batch,n,5+4+3+2+1,1】

    这就是decode_rel_fr_shaking_tag的输入:

    先用self.get_sharing_spots_fr_shaking_tag进行解析

    self.shaking_ind2matrix_ind是:  [(0, 0), (0, 1), (0, 2), (1, 1), (1, 2), (2, 2)]即上三角

    所以spots就是相当于是一个列表,每一个元素就是类似(0,0,预测标签)、(0,1,预测标签)等。

    接下来就是看tag_id(预测标签)是不是预测的是不是实体,是的话就保存到head_ind2entities(对应到论文算法就是D字典),形式大概就是{3:[4,6]}

    两个实体,都是以从位置3开始的,分别以位置4和6结束。

    接下来根据关系解析出有关系一对实体的尾部,保存在tail_rel_memory_set:形式类似“1-10-30”,第一种关系,对应的一对实体尾部分别是10和30(对应论文算法的E)

    接下来224-227根据关系解析出有关系一对实体的头部,但是229行会看一看是不是在预测的实体(D字典)当中,如果不在就跳过了,如果在的话,取其value,即取以该位置开头的所有实体,对应的是232行和233行的subj_list、obj_list,接着看236行和237行的subj和obj这些都是预测出的真实实体尾部,238是根据关系推断出的实体尾部,看看subj和obj合起来是不是匹配,不匹配的话跳过,匹配的话就成功抽取一条三元组保存了。

    (2)计算loss

    398行可以看到就是将实体loss和关系预测的实体对头实体Loss和关系预测的实体对尾实体Loss进行加权得到Loss,权重的大小部分:

    w_ent就是实体权重

    w_rel是关系权重

    动态权重,通过479-480行可以看到,随着step加大,w_ent的权重递减,w_rel权重递增。也就是开始关注实体,先保证实体抽准确,后面再越来越关注关系抽取

    注意:我们的模型输出:

    ent_shaking_outputs          : [batch, 5+4+3+2+1,2]

    head_rel_shaking_outputs :[batch,n,5+4+3+2+1,3]

    tail_rel_shaking_outputs     : [batch,n,5+4+3+2+1,3]

    label是:

    batch_ent_shaking_tag           :[batch, 5+4+3+2+1]

    batch_head_rel_shaking_tag  :[batch, n,5+4+3+2+1]

    batch_tail_rel_shaking_tag     :[batch, n,5+4+3+2+1]

    loss函数是:就是通过view转化维度计算交叉熵。

    总结

    (1)数据部分

    函数主要是两个:tplinker.py下的DataMaker4Bert和HandshakingTaggingScheme

    DataMaker4Bert里面一个比较重要的就是生产上三角序列,其实其用的是HandshakingTaggingScheme类函数

    HandshakingTaggingScheme比较重要,这里面定义了sharing_spots2shaking_tag4batch和spots2shaking_tag4batch这样的上三角序列生产函数以及decode_rel_fr_shaking_tag这样的解码三元组函数等等

    (2)model部分

    rel_extractor得到ent_shaking_outputs, head_rel_shaking_outputs,  tail_rel_shaking_outputs维度分别是[batch, 5+4+3+2+1,2],[batch,n,5+4+3+2+1,3],[batch,n,5+4+3+2+1,3]

    其实rel_extractor就是一个关系提取器,底层如果是基于Bert的话就是TPLinkerBert,底层如果是基于BiLSTM的话就是TPLinkerBiLSTM,这里以为例:

    底层是通过bert的共享编码shaking_hiddens,再加上距离编码得到最终的共享编码shaking_hiddens4ent

    上层的话就是1【实体层】+(1【头】+1【尾】)*n【关系数】个mlp层,即假设有3中关系,那么就是1+2*3=7个mlp层

    计算loss的话是上面三部分loss加权(动态权重)

    其中将上三角平铺成序列的代码在common.components.py 里面的HandshakingKernel,平铺后得到的shaking_hiddens4ent

     

     

     

    展开全文
  • 知识图谱之关系抽取代码实战

    千次阅读 2020-01-14 16:49:53
    上一篇博文讲解了关系抽取的理论部分,了解了关系抽取当前主流的技术方案,但是理论终究是纸上谈兵,下面来点实战。 还是拿 瑞金医院MMC人工智能辅助构建知识图谱大赛复赛作为案例啊,因为这个案例很经典啊,竞赛...

    上一篇博文讲解了关系抽取的理论部分,了解了关系抽取当前主流的技术方案,但是理论终究是纸上谈兵,下面来点实战。
    还是拿 瑞金医院MMC人工智能辅助构建知识图谱大赛复赛作为案例啊,因为这个案例很经典啊,竞赛连接,复赛题目是在 Named Entity 给定的基础上,做 Relation 抽取,实体关系类别名称:
    在这里插入图片描述

    考虑到代码有点多,这里不好一行行解释,故准备了完整的资料对这块做了详细的解释和说明,包括数据、代码、说明文档,详情如下:链接:https://pan.baidu.com/s/1ZCYOUDSS58boIURK9-SKAw
    提取码:xe9u
    拿走不谢。

    展开全文
  • OpenNER关系抽取代码阅读

    千次阅读 2019-02-11 20:42:29
    继上文阅读了论文Neural Relation Extraction with Selective Attention over Instances后,就找源码来修修改改以完成关系抽取的任务。 论文源码是C++实现,在其github上面找到另一个整合了几篇论文更好的框架...

    继上文阅读了论文Neural Relation Extraction with Selective Attention over Instances后,就找源码来修修改改以完成关系抽取的任务。
    论文源码是C++实现,在其github上面找到另一个整合了几篇论文更好的框架OpenNER

    遇到的坑

    no module named framework

    这不是少包,这是包在目录下没找到,只需要在import framework的地方修改为from . import framework即可

    NYT数据准备

    readme提供的数据链接下载下来后还要运行它提供的py文件才可以。而Py文件注意是python2.x的版本(强行转3有点坑)。

    json格式

    json需要用代码生成,如果直接手写内容的,会报编码错误

    载入文件

    如果训练文件发生修改,则需要把process_data下的文件删除干净,否则默认读取上一次预处理好的文件

    需要调整参数

    • batchsize:如果样本集很少的时候要把batchsize调整到合适的位置(默认160)
    • word_embeddingsize:词向量的维度(默认50)

    中文数据格式

    由于里面提供的是英文格式,关系抽取需要做中文的,所以这里记录一下中文的格式。词向量现在是随机,到时候肯定要用预模型。

    import thulac
    import numpy as np
    import json
    # 生成词向量
    thu1 = thulac.thulac(seg_only=True)  #默认模式
    text = thu1.cut("工商注册地、税务征管关系及统计关系在广州市南沙区范围内", text=True)  #进行一句话分词
    print(text)
    text1 = thu1.cut("工商注册地、税务征管关系及统计关系在广州市南沙区范围内", text=True)  #进行一句话分词
    print(text1)
    text2 = thu1.cut("企业具有独立法人资格", text=True)  #进行一句话分词
    print(text2)
    words=text.split(" ")
    word_list=[]
    for w in words:
        word_vec={}
        w2v=np.random.rand(1,300)
        word_vec['word']=w
        word_vec['vec']=list(w2v[0])
        word_list.append(word_vec)
    words=text1.split(" ")
    for w in words:
        word_vec={}
        w2v=np.random.rand(1,300)
        word_vec['word']=w
        word_vec['vec']=list(w2v[0])
        word_list.append(word_vec)
    words=text2.split(" ")
    for w in words:
        word_vec={}
        w2v=np.random.rand(1,300)
        word_vec['word']=w
        word_vec['vec']=list(w2v[0])
        word_list.append(word_vec)
    jsonArr = json.dumps(word_list, ensure_ascii=False)
    with open('word_vec.json','w')as f:
        f.write(jsonArr)
    ### 生成训练集
    import  json
    thu1 = thulac.thulac(seg_only=True)  #默认模式
    text = thu1.cut("工商注册地、税务征管关系及统计关系在广州市南沙区范围内", text=True)  #进行一句话分词
    print(text)
    text1 = thu1.cut("工商注册地、税务征管关系及统计关系在广州市南沙区范围内", text=True)  #进行一句话分词
    print(text1)
    text2 = thu1.cut("企业具有独立法人资格", text=True)  #进行一句话分词
    print(text2)
    word_list=[
      {
        "sentence": text,
        "head": {"word": "工商注册地","id":"1"},
        "tail": {"word": "广州市南沙区","id":"2"},
        "relation": "范围内"
      },
        {
        "sentence": text1,
        "head": {"word": "税务征管关系","id":"3"},
        "tail": {"word": "广州市南沙区","id":"2"},
        "relation": "范围内"
      },
        {
        "sentence": text2,
        "head": {"word": "企业","id":"4"},
        "tail": {"word": "独立法人资格","id":"5"},
        "relation": "具有"
      }
    ]
    jsonArr = json.dumps(word_list, ensure_ascii=False)
    with open('train.json','w')as f:
        f.write(jsonArr)
    with open('test.json','w')as f:
        f.write(jsonArr)
    word_list={"NA": 0, "范围内": 1,"具有":2}
    jsonArr = json.dumps(word_list, ensure_ascii=False)
    with open('rel2id.json','w')as f:
        f.write(jsonArr)
    
    

    感觉有问题

    计算AUC
    flag表示0/1正负
    但是没看懂的是为什么prec和recall的底数。然后auc的是根据阈值计算面积的,这里为什么直接就计算auc了。

            for i, item in enumerate(sorted_test_result[::-1]):
                # 我觉得这个指标有问题
                correct += item['flag']
                prec.append(float(correct) / (i + 1))
                recall.append(float(correct) / self.test_data_loader.relfact_tot)
    auc = sklearn.metrics.auc(x=recall, y=prec)
    所以AUC一般都是偏低的,哪怕准确率比较高的情况下
    
    展开全文
  • 参考:卷积神经网络在自然语言处理的应用 | 附源码
  • 解读的是苏剑林大神在百度关系抽取比赛中的代码,源代码看这里数据转换苏神把原始数据(数据下载地址)进行了转换,只提取出其中的(1)句子文本(2)spo列表,存成json,如下图:这个json加载进来是一个列表,列表中每一个...
  • 代码主要是基于深度学习的中文关系抽取模型,希望帮助大家
  • 关系抽取学习链接 BERT进行关系抽取github 关系抽取代码讲解
  • 1、什么是关系抽取 关系抽取的主要任务就是,给定一段句子文本,抽取句子中的两个实体以及实体之间的关系,以次来构成一个三元组(s,p,o),s是subject表示主实体,o为object表示客实体,p为predicate表示两实体间...
  • 人物关系抽取可看作是实体关系抽取的的一个重要的分支,只是将关系抽取中的命名实体限定为人名。人物由于其特定的存在而与他人之间产生的关系称为人物关系。人物关系抽取有其特定的模式和特征。在之前的研究中,人物...
  • 最近在学习DocRED的相关知识,由于刚开始接触nlp,对代码理解起来有难度,于是自己便一边调试代码一边将大纲记录在了xmind中
  • 超级超级详细的实体关系抽取数据预处理代码详解 由于本人是代码小白,在学习代码过程中会出现很多的问题,所以需要一直记录自己出现的问题以及解决办法. 废话不多说,直接上代码!!! 一.data_process 1.由于数据集太大,...
  • 文章目录关系抽取Relation Classification via Convolutional Deep Neural Network,COLING(CCF B)2014 关系抽取 关系抽取的定义如下:给定一个句子X和一对实体<x,y>,关系抽取的主要任务是预测二者之间的...
  • 实体关系抽取

    2020-03-02 15:27:22
    实体关系抽取入门 中文实体关系抽取实践:全流程以及ccks2019baseline代码 实体关系抽取的现状与未来
  • 以三元组的形式构造数据集 以NYT数据集为例:NYT数据集是关于远程监督关系抽取任务的广泛使用的数据集。该数据集是通过将freebase中的关系与纽约时报(NYT)语料库对齐而生成的。纽约时报New York Times数据集包含...
  • 人物关系抽取

    2018-09-01 15:54:05
    以釜山行里面的人物关系为实例,为大家介绍一下人物关系抽取怎么做。里面包含代码和数据,亲测可用!
  • PaddleNLP实战——LIC2021关系抽取任务基线 目录PaddleNLP实战——LIC2021关系抽取任务基线一、关系抽取基线评价方法1.1 快速复现基线Step1:构建模型1.2 快速复现基线Step2:加载并处理数据1.3 快速复现基线Step3:...
  • 关系抽取:图卷积网络的学习(二)(附代码) 目录关系抽取:图卷积网络的学习(二)(附代码)论文一:基于关系图的实体关系联合抽取摘要1.Introduction2.Motivation3.GCN回顾4.Methodology4.1 1st-phase ...
  • 前面写过一片实体抽取的入门,实体关系抽取就是在实体抽取的基础上,找出两个实体之间的关系。 本文使用的是BiLSTM+attention模型,代码在这里,不定期对代码进行修改添加优化。 数据处理 其实数据处理的方法有很...
  • BERT:代码解读、实体关系抽取实战

    千次阅读 2019-10-31 09:43:18
    目录 前言 一、BERT的主要亮点 ...二、BERT代码解读 1. 数据预处理 1.1 InputExample类 1.2 InputFeatures类 1.3 DataProcessor 重点 1.4 convert_single_example 1.5 file_based_conver...
  • 关系抽取:图卷积网络的学习(一)(附代码) 目录关系抽取:图卷积网络的学习(一)(附代码)一、 图卷积网络(GCN)【托马斯·基普夫】1.介绍2.Outline3.GCN到底有多强?Recent literature相关文献GCNs Part I: ...
  • 本文转载自:用Bi-GRU和字向量做端到端的中文关系抽取 代码在: Information-Extraction-Chinese 实体识别和关系抽取是例如构建知识图谱等上层自然语言处理应用的基础。关系抽取可以简单理解为一个分类问题:给定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,023
精华内容 409
关键字:

关系抽取代码