精华内容
下载资源
问答
  • 对文本进行实体抽取
    千次阅读
    2022-06-23 10:00:53

    随着信息化的发展,很多具有重要价值的知识隐藏分布在海量数据中,影响了人们获取知识的效率,如何处理繁杂的非结构化文本数据成为难题。

    近日,HMS Core机器学习服务6.5.0版本新增在线文本实体抽取能力,该能力可以检测出文本中是否存在比如日期、姓名、专有名词等实体信息,并将此类实体抽取出来,即自动处理非结构化自然语言文本数据的能力。例如,影视行业的应用中常常会出现大量文字的影评、资讯等内容,使用在线文本实体抽取能力即可快速提取结构信息,帮助搭建知识图谱,便于用户清晰理解。

    此外,文本实体抽取能力更多应用于问答系统、信息索引、知识图谱构建等领域。

    问答系统

    问答系统是信息检索系统的一种高级形式,它能用准确、简洁的自然语言回答用户提出的问题。在问答系统实现过程中,则需要用到文本实体抽取能力识别问题和知识库中的实体信息,再通过多种算法模型匹配出精准回答。

    信息索引

    使用在线文本实体抽取能力,可命名特定实体信息作为索引和超链接。比如用户在评论时提到的专有名词,可以生成超链接,便于其他用户检索了解相关内容。

    知识图谱构建

    知识图谱是由实体、关系和属性组成的一种数据结构,即具有有向图结构的一个知识库,文本实体抽取能力作为知识图谱构建过程中的底层能力,有着极其重要的作用。比如构建音乐知识图谱,首先需要大量的文本数据中提取出歌手、歌曲、作词、影视等相关信息,然后再进行知识图谱的搭建。

    目前,华为机器学习服务在线文本实体抽取能力共支持人名、金钱、影视名、网页链接在内的16个实体类别,可根据实际语义场景应用于不同类别的App中。

    集成步骤

    1. 开发准备

    详细准备步骤可参考华为开发者联盟官网

    1. 集成和配置apigateway鉴权

    基于apigateway的鉴权机制:

    "paths": {
    "/entityExtract": { "post": { "operationId": "entityExtract",
    "parameters": [{"in": "body",  "name": "req",  "required": true,
    "schema": { "$ref": "#/definitions/NerEnterReq"  } },  {
    "name": "X-Request-ID", "in": "header",  "required": true,
    "type": "string"
    }, {"name": "X-Package-Name",  "in": "header", "required": true,
    "type": "string"  }, ……],
     "responses": {"200": {   "description": "response of 200",
    "schema": { "$ref": "#/definitions/ResponseEntityNerBodyVo"}}}}}
    1. 创建在线文本实体构造器
    // 使用自定义的参数配置创建语种检测器。
     MLRemoteNerSetting setting = new MLRemoteNerSetting.Factory()
                    .setSourceLangCode("zh")
                    .create();
    MLRemoteNer ner = MLNerFactory.getInstance().getRemoteNer(setting);
    进行文本实体抽取。
    1. 在线获取文本实体抽取

    异步方法示例代码:

    ner.asyncEntityExtract(input).addOnSuccessListener(new OnSuccessListener<RemoteNerResultItem[]>() {
                @Override
                public void onSuccess(RemoteNerResultItem[] remoteNerResults) {
                    // 成功的处理逻辑。
                    if(remoteNerResults != null){
                        // 有识别结果
                    }else {
                        //  识别结果为空
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(Exception e) {
                    // 识别失败,获取相关异常信息。
                    try {
                        MLException mlException = (MLException) e;
                        // 获取错误码,开发者可以对错误码进行处理,根据错误码进行差异化的页面提示。
                        int errorCode = mlException.getErrCode();
                        // 获取报错信息,开发者可以结合错误码,快速定位问题。
                        String errorMessage = mlException.getMessage();
                    } catch (Exception error) {
                        // 转换错误处理。
                    }
                }
            });

    同步方法示例代码:

    try {
           RemoteNerResultItem[] remoteNerResults = ner.syncEntityExtract(input);
           // 识别成功逻辑
           if(remoteNerResults != null){
           // 有识别结果
           }else {
           //  识别结果为空
            }
       } catch (MLException mlException) {
           // 失败的处理逻辑。
           // 获取错误码,开发者可以对错误码进行处理,根据错误码进行差异化的页面提示。
           int errorCode = mlException.getErrCode();
           // 获取报错信息,开发者可以结合错误码,快速定位问题。
           String errorMessage = mlException.getMessage();
       }
    1. 完成后,释放资源
    if (ner != null) {
        ner.stop();
    }

    了解更多详情>>

    访问华为开发者联盟官网
    获取开发指导文档
    华为移动服务开源仓库地址:GitHubGitee

    关注我们,第一时间了解 HMS Core 最新技术资讯~

    更多相关内容
  • 计算机研究 -基于文本实体关系抽取以及知识图谱的表示推理方法研究.pdf
  • 实体关系抽取作为信息抽取、自然语言理解、信息检索等领域的核心任务和重要环节,能够从文本抽取实体对间的语义关系.近年来,深度学习在联合学习、远程监督等方面上的应用,使关系抽取任务取得了较为丰富的研究成果....
  • 目前广泛使用的深度学习模型往往数据有着较强的依赖性,因此数据集的匮乏极大限制了中文实体关系抽取的发展。为了弥补中文实体关系抽取研究的这一短板,本文基于远程监督技术,将原生网络文本与外部知识库实体对齐...
  • CHIP-2020 中文医学文本实体关系抽取

    热门讨论 2022-05-20 13:53:59
    CHIP-2020-2中文医学文本实体关系抽取数据集 数据集格式 本代码需要将数据处理成如下的格式: schemas格式(数据库的组织和结构) 介绍:限定待加入知识图谱数据的格式;相当于某个领域内的数据模型,包含了...

    来源:这里

    这个项目的本质是-----------医学文本的实体关系联合抽取问题,既要解决命名实体识别,又要解决关系分类问题。使用RoFormerV2模型作为预训练模型,GPLinker作为下游模型,在Embedding层添加FGM对抗训练增加模型性能。

    一、数据集

    • CHIP-2020-2中文医学文本实体关系抽取数据集

        数据集包含儿科训练语料和百种常见疾病训练语料,儿科训练语料来源于518种儿科疾病,百种常见疾病训练语料来源于109种常见疾病。
        近7.5万三元组数据,2.8万疾病语句和53种定义好的schema。
      
    • 数据集格式

    {
       "spo_list" : [
          {
             "Combined" : true,
             "object" : {
                "@value" : "外照射"
             },
             "object_type" : {
                "@value" : "其他治疗"
             },
             "predicate" : "放射治疗",
             "subject" : "慢性胰腺炎",
             "subject_type" : "疾病"
          },
          {
             "Combined" : true,
             "object" : {
                "@value" : "外照射"
             },
             "object_type" : {
                "@value" : "其他治疗"
             },
             "predicate" : "放射治疗",
             "subject" : "非肿瘤性疼痛",
             "subject_type" : "疾病"
          }
       ],
       "text" : "慢性胰腺炎@### 低剂量放射 自1964年起,有几项病例系列报道称外照射 (5-50Gy) 可以有效改善慢性胰腺炎患者的疼痛症状。慢性胰腺炎@从概念上讲,外照射可以起到抗炎和止痛作用,并且已经开始被用于非肿瘤性疼痛的治疗。"
    }
    
    临床实践文本可能不提及主题疾病---每句之前增加主题疾病实体,并以@和原文分割
    Combined-----三元组来源上下多个句子,拼接在一起
    ”text”----记录来源文本
    SPO表示法。S-头实体,O-尾实体,P-Predicate,即「关系(Relation)」更专业的叫法。
    
    • 本代码需要将数据处理成如下的格式:
    {
       "spo_list" : [
          {
             "Combined" : true,
             "object" : "外照射",
             "object_type" : "其他治疗",
             "predicate" : "放射治疗",
             "subject" : "慢性胰腺炎",
             "subject_type" : "疾病"
          },
          {
             "Combined" : true,
             "object" : "外照射",
             "object_type" : "其他治疗",
             "predicate" : "放射治疗",
             "subject" : "非肿瘤性疼痛",
             "subject_type" : "疾病"
          }
       ],
       "text" : "慢性胰腺炎@### 低剂量放射 自1964年起,有几项病例系列报道称外照射 (5-50Gy) 可以有效改善慢性胰腺炎患者的疼痛症状。慢性胰腺炎@从概念上讲,外照射可以起到抗炎和止痛作用,并且已经开始被用于非肿瘤性疼痛的治疗。"
    }
    
    • schemas格式(数据库的组织和结构)
      介绍:限定待加入知识图谱数据的格式;相当于某个领域内的数据模型,包含了该领域内有意义的概念类型以及这些类型的属性
      作用:规范结构化数据的表达,一条数据必须满足Schema预先定义好的实体对象及其类型,才被允许更新到知识图谱中
    ... ...
    
    {"subject_type": "疾病", "predicate": "发病部位", "object_type": "部位"}
    {"subject_type": "疾病", "predicate": "转移部位", "object_type": "部位"}
    {"subject_type": "疾病", "predicate": "外侵部位", "object_type": "部位"}
    
    ... ...
    
    
    • dataloader单条格式
    {'text': text, 'spo_list': [(s, p, o)]}
    

    schema中的predicate不能重复,如有重复要更改,加以区别,否则就算object_type和subject_type不一致,只要predicate一致,就认为是一个关系。数据里的predicate也要同步更改。

    二、项目结构

    ./
    ├── README.md
    ├── chinese_roformer-v2-char_L-12_H-768_A-12            roformer-v2 12层base版
    │		 ├── bert_config.json                           是BERT在训练时可选调整参数
    │		 ├── bert_model.ckpt.data-00000-of-00001
    │		 ├── bert_model.ckpt.index						负责模型变量载入
    │		 ├── bert_model.ckpt.meta						负责模型变量载入
    │		 ├── checkpoint
    │		 └── vocab.txt
    ├── chinese_roformer-v2-char_L-6_H-384_A-6              roformer-v2 12层base版
    │		 ├── bert_config.json
    │		 ├── bert_model.ckpt.data-00000-of-00001
    │		 ├── bert_model.ckpt.index
    │		 ├── bert_model.ckpt.meta
    │		 ├── checkpoint
    │		 └── vocab.txt
    ├── config.py                                           部分超参数配置
    ├── data
    │		 ├── chip2020                           数据集
    │		 │		 ├── 53_schemas.json
    │		 │		 ├── train_data.json
    │		 │		 └── val_data.json
    │		 └── pred                               最佳模型预测样本
    │		     ├── val_pred_ep38.json
    │		     └── val_pred_ep73.json
    ├── dataloader.py                                       数据编码器
    ├── evaluate.py                                         模型评估
    ├── images                                              数据绘图
    │		 ├── train_loss.png
    │		 ├── train_loss_base.png
    │		 ├── val_f1.png
    │		 └── val_f1_base.png
    ├── log                                                 日志
    │		 ├── f1.out
    │		 ├── nohup.out
    │		 ├── nohup_base.out
    │		 ├── train_log.csv
    │		 └── train_log_base.csv
    ├── main.py
    ├── model.py                                            模型文件
    ├── path.py                                             项目路径
    ├── plot.py                                             画图工具
    ├── predict.py                                          预测文件
    ├── report                                              模型评估报告
    │		 ├── f1.csv
    │		 ├── predicate_f1.csv
    │		 └── predicate_f1_base.csv
    ├── schemaloader.py                                     schema加载器
    ├── test.py                                             token转可读字符
    ├── train.py                                            训练
    ├── utils                                               bert4keras工具包,可pip下载
    │		 ├── __init__.py
    │		 ├── adversarial.py
    │		 ├── backend.py
    │		 ├── layers.py
    │		 ├── models.py
    │		 ├── optimizers.py
    │		 ├── snippets.py
    │		 └── tokenizers.py
    └── weights                                             保存的权重
        ├── gplinker_roformer_best.h5
        └── gplinker_roformer_v2_best.h5
    
    10 directories, 51 files
    
    

    模型中L表示的是transformer的层数,H表示输出的维度,A表示mutil-head attention的个数

    三、代码解析

    train.py

    • 构建模型:
    # 构建模型
    #extend_with_exponential_moving_average:返回新的优化器类,加入EMA(权重滑动平均)
    AdamEMA = extend_with_exponential_moving_average(Adam, name = 'AdamEMA')
    optimizer = AdamEMA(lr = 5e-5)
    model.compile(loss = globalpointer_crossentropy, optimizer = optimizer)
    model.summary()
    adversarial_training(model, 'Embedding-Token', 0.5)
    

    Adam:一阶梯度优化算法,提高计算效率,降低内存需求。
    optimizer优化器
    model.compile():模型编译的时候把优化器跟损失函数传进去,并返回一个张量作为输出结果。
    adversarial_training(): 对抗训练
    model.summary(): 输出模型各层的参数状况
    在这里插入图片描述

    • 每一轮的工作:
        def on_epoch_end(self, epoch, logs = None):
            global count_model_did_not_improve #记录模型没有变好的次数
            #确定模型参数保存位置
            save_best_path = "{}/{}_{}_best.h5".format(weights_path, event_type, MODEL_TYPE)
            #apply_ema_weights():备份原模型权重,然后将平均权重应用到模型上去
            optimizer.apply_ema_weights()
            f1, precision, recall = evaluate(valid_data, epoch)
            f1_list.append(f1)
            recall_list.append(recall)
            precision_list.append(precision)
            if f1 >= self.best_val_f1:
                self.best_val_f1 = f1
                count_model_did_not_improve = 0
                model.save_weights(save_best_path)
            else:
                count_model_did_not_improve += 1
                print("Early stop count " + str(count_model_did_not_improve) + "/" + str(self.patience))
                #当验证集F1超过5轮没有上升时,停止训练。
                if count_model_did_not_improve >= self.patience:
                    self.model.stop_training = True
                    print("Epoch %05d: early stopping THR" % epoch)
    

    model.py

    • 加载模型,训练结果
    def get_model():
        # 加载预训练模型
        base = build_transformer_model(
            config_path = config_path,
            checkpoint_path = checkpoint_path,
            model = MODEL_TYPE,
            return_keras_model = False
        )
        
        # 预测结果
        #SetLearningRate:层的一个包装,用来设置当前层的学习率
        entity_output = SetLearningRate(GlobalPointer(heads = 2, head_size = 64, kernel_initializer = "he_normal"),
                                        10, True)(base.model.output)
        head_output = SetLearningRate(GlobalPointer(
            heads = len(predicate2id), head_size = 64, RoPE = False, tril_mask = False, kernel_initializer = "he_normal"
        ), 10, True)(base.model.output)
        tail_output = SetLearningRate(GlobalPointer(
            heads = len(predicate2id), head_size = 64, RoPE = False, tril_mask = False, kernel_initializer = "he_normal"
        ), 10, True)(base.model.output)
        outputs = [entity_output, head_output, tail_output]
        
        #input输入层,output输出层
        model = keras.models.Model(base.model.inputs, outputs)
        return model
    

    1.调用bert4keras中的build_transformer_model来选择使用的模型

    checkpoint_path = checkpoint_path
    checkpoint_path = BASE_CKPT_NAME
    BASE_CKPT_NAME = proj_path + “/chinese_roformer-v2-char_L-12_H-768_A-12/bert_model.ckpt”

    TensorFlow模型会保存在后缀为.ckpt的文件中。
    保存后在save这个文件夹中实际会出现3个文件,因为TensorFlow会将计算图的结构和图上参数取值分开保存。
    model.ckpt.meta文件保存了TensorFlow计算图的结构,可以理解为神经网络的网络结构model.ckpt文件保存了TensorFlow程序中每一个变量的取值
    checkpoint文件保存了一个目录下所有的模型文件列表(也可以看作权重)

    • 设置当前层的学习率
    class SetLearningRate:
        """层的一个包装,用来设置当前层的学习率
        """
        
        def __init__(self, layer, lamb, is_ada = False):
            self.layer = layer
            self.lamb = lamb  # 学习率比例
            self.is_ada = is_ada  # 是否自适应学习率优化器
        
        def __call__(self, inputs):
            with K.name_scope(self.layer.name):
                if not self.layer.built:
                    input_shape = K.int_shape(inputs)
                    self.layer.build(input_shape)
                    self.layer.built = True
                    if self.layer._initial_weights is not None:
                        self.layer.set_weights(self.layer._initial_weights)
            for key in ['kernel', 'bias', 'embeddings', 'depthwise_kernel', 'pointwise_kernel', 'recurrent_kernel', 'gamma',
                        'beta']:
                if hasattr(self.layer, key):
                    weight = getattr(self.layer, key)
                    if self.is_ada:
                        lamb = self.lamb  # 自适应学习率优化器直接保持lamb比例
                    else:
                        lamb = self.lamb ** 0.5  # SGD(包括动量加速),lamb要开平方
                    K.set_value(weight, K.eval(weight) / lamb)  # 更改初始化
                    setattr(self.layer, key, weight * lamb)  # 按比例替换
            return self.layer(inputs)
    

    四、运行时的报错:

    1. AttributeError: module ‘keras.engine.base_layer’ has no attribute ‘Node’

    2. 版本问题
      在这里插入图片描述

    3. KeyError: ‘roformer’
      解决
      因为bert4keras模块的版本不对应------pip install bert4keras==0.11.1
      源代码中的utils文件夹其实就是bert4keras库,但是没有更新到最新的,所以导致找不到roformer

    4. tensorflow.python.framework.errors_impl.NotFoundError: Key bert/embeddings/LayerNorm/beta not found in checkpoint
      bert4keras版本出错

    5. 如何用gpu去跑数据
      安装tensorflow-gpu并且注意与cuda的版本问题

    6. tensorflow.python.framework.errors_impl.ResourceExhaustedError: 2 root error(s) found.
      找到两个root错误

       cuda+cuDNN+TensorFlow版本不一致导致
       显存分配问题,更改为动态分配内存就可以解决。
       ensorflow或者numpy版本引起-----tensorflow是1.14.0版本。应该使用pip uninstall numpy卸载所有的numpy,再安装1.16.4即可
       (以上方法都没用)
       后来发现漏了上一行报错tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[32,256,55,55]”
       ResourceExhaustedError:资源耗尽错误
       减少批处理Batch 的大小32---->16
      
    7. FileNotFoundError: [Errno 2] Unable to create file (unable to open file: name = ‘/root/autodl-tmp/chip2020_relation_extraction-gplinker/weights/gplinker_roformer_v2_best.h5’, errno = 2, error message = ‘No such file or directory’, flags = 13, o_flags = 242)

      报错的中文解释是:没有这样的文件和目录
      也就是说写的不应该是文件,而是文件的路径或者说是目录,否则系统根本找不到所指的东西。

      问题解决
      明确写好文件对应的位置
      (其实后来发现是,给的源文件中少了weights的文件夹,添加后)

    8. AttributeError: ‘str’ object has no attribute ‘decode’
      解决
      一般是因为str的类型本身不是bytes,所以不能解码
      问题原因:可能是h5py模块的版本过高,导致无法加载h5文件------------pip install h5py==2.10.0
      有时候有环境配置里很复杂,
      用pip install ‘h5py<3.0.0’ -i https://pypi.tuna.tsinghua.edu.cn/simple好一点

    9. Linux实时将所有输出重定向到文件

       nohup unbuffer command > file.out 2>&1 &
       unbuffer命令需要额外安装expect-devel,用来实时刷新。
       nohup命令用来忽略所有挂断(SIGHUP)信号,让你的程序即使在用户注销后依然继续运行。
       command是任何一段你想要执行的shell命令。
       > file.out 代表将command运行结果重定向到当前目录下的file.out文件中(如果要每次运行的结果追加到file.out后面,可以用>>而不是>)。
       2 >&1表示将标准错误输出cerr的所有输出也都重定向到标准输出cout中,这样file.out中就会记录command命令运行过程中所有标准输出。
       最后一个&表示后台运行该command。 
      

    10.File “/root/miniconda3/envs/simbert/lib/python3.7/site-packages/tensorflow/python/client/session.py”, line 1458, in call
    run_metadata_ptr)
    tensorflow.python.framework.errors_impl.InternalError: 2 root error(s) found.
    (0) Internal: Blas xGEMMBatched launch failed : a.shape=[12,234,64], b.shape=[12,64,234], m=234, n=234, k=64, batch_size=12
    [[{{node Transformer-0-MultiHeadSelfAttention_1/einsum/MatMul}}]]
    [[global_pointer_5_1/truediv/_1251]]
    (1) Internal: Blas xGEMMBatched launch failed : a.shape=[12,234,64], b.shape=[12,64,234], m=234, n=234, k=64, batch_size=12
    [[{{node Transformer-0-MultiHeadSelfAttention_1/einsum/MatMul}}]]
    解决
    很玄学,相同代码之前没问题,后来训练了一次mt5后出现问题,以为是内存爆炸,然后使用A500GPU还是不行,(A500不行怀疑是算力不匹配),然后换回最开始的代码在2080ti上跑行了

    展开全文
  • 修改论文模型时需要DBpedia进行实体链接,官方的DBpedia Spotlight就非常好用,特此记录。   Docker 由于DBpedia Spotlight需要部署到服务器中,官方Github使用的是Docker,这里我们需要先下载。(注意不...

    修改论文模型时需要对DBpedia进行实体链接,官方的DBpedia Spotlight就非常好用,特此记录。
     
     

    1 Docker

    由于DBpedia Spotlight需要部署到服务器中,官方Github使用的是Docker,这里我们需要先下载。(注意不支持MacBook M1)

    在这里插入图片描述

    一直点默认安装即可,不过安装完成后可能碰到WLS2不一致的问题,官方也给出了解决方法。按照里面说的去下载Ubuntu就行。

    在成功安装完Docker后,选择Images(镜像),可以从里面找到ubuntu
    在这里插入图片描述

     
     

    2 DBpedia Spotlight

    DBpedia Spotlight可以把我们输入的文本中的实体抽取出来,将其对应到知识图谱DBpedia。官方提供了一个示例网站:https:/demo.dbpedia-spotlight.org
    在这里插入图片描述

    下面在Windows的Docker中部署DBpedia Spotlight服务:

    1、先去DBpedia仓库下载对应语言的模型,我常用英文,这里下载的英文模型。

    在这里插入图片描述

    2、在DBpedia Spotlight的github上找到对应的Docker命令行代码,英文的如下:

    docker run -tid --restart unless-stopped --name dbpedia-spotlight.en --mount source=spotlight-model,target=/opt/spotlight -p 2222:80 dbpedia/dbpedia-spotlight spotlight.sh en
    

    image-20220416110221706

    3、Windows打开命令行窗口(先按win+R,输入cmd,再回车),运行刚刚的Docker命令行,由于我已经运行工,这里就不再运行了。

    4、如果运行成功,那么Docker里会有对应的镜像,然后点击旁边的RUN,就可以得到对应的容器,运行该容器,然后编写相应代码。
    在这里插入图片描述

    在这里插入图片描述

     
     

    3 实体抽取

    下列代码需要先按前面的方法把Docker运行起来后才能生效。该代码的效果和前面提到的网址功能一样,可以将输入的文本text里和知识图谱DBpedia中对应的实体关联,以字典形式返回。

    import json
    import re
    import requests
    
    DBPEDIA_SPOTLIGHT_ADDR = "http://localhost:2222/rest/annotate"
    
    def _text2entities(text, confidence):
        headers = {"Accept": "application/json"}
        data = {"text": text, "confidence": confidence}
    
        response = requests.get(url=DBPEDIA_SPOTLIGHT_ADDR, params=data, headers=headers)
        response = response.json()
        return (
            [f"<{x['@URI']}>" for x in response["Resources"]]
            if "Resources" in response
            else []
        )
    
    展开全文
  • 实体关系抽取旨在识别网络文本中的实体,并提取出文本实体之间隐含的关系。研究表明,深度神经网络在实体关系抽取任务上具有可行性,并优于传统关系抽取方法。目前的关系抽取方法大都使用卷积神经网络(CNN)和长...
  • 实体抽取主要任务就是给定一段文本,从中抽取出实体类单词,实体类单词如人名、地名、组织名、时间等名词性单词,在具体的代码实现中,我们都是事先定义抽取哪几类实体单词,这个根据具体的训练数据集而定,比如人民...

    实体抽取

    实体抽取主要任务就是给定一段文本,从中抽取出实体类单词,实体类单词如人名、地名、组织名、时间等名词性单词,在具体的代码实现中,我们都是事先定义抽取哪几类实体单词,这个根据具体的训练数据集而定,比如人民日报数据集中,定义了人名、地点名、组织名三类实体,在模型训练完成之后,我们的任务就是对输入的句子进行三类实体单词的抽取,并识别出单词具体属于那一类实体。在这里插入图片描述
    通过上面的介绍,我们会发现这个任务就是一个分类任务,对于中文,在代码实现上,我们是对每个字进行分类。

    只有一个词才属于一个实体类别,一个字怎么分类呢。首先我们要对文本中每个字进行标注,标注法有BIO、BMEO等标注法。BIO标注法中,B代表每个实体类单词的开始字,I代表此实体的其它字部分,O代表非实体字部分,这样每个字就可以进行分类了。

    示例如下:

    我  O
    爱  O
    北  B
    京  I
    天  I
    安  I
    门  I
    。  O
    

    但这样无法区分每个单词具体属于哪个实体,所以通常我们标注时会更加具体一点,如下:

    我  O
    爱  O
    北  B-LOC
    京  I-LOC
    天  I-LOC
    安  I-LOC
    门  I-LOC
    。  O
    

    这样就表明这个词属于地点类实体。

    实现思路

    既然是分类问题,并且是文本数据,我们可能首先会采用RNN网络后接softmax层来进行分类,模型结构如下图所示:
    在这里插入图片描述
    :若文本数据输入不熟悉,可参考句子文本数据如何作为深度学习模型的输入

    此种方法能得到一定准确率,但未考虑一个问题,当某一个字被分为某一类时一定概率上会基于前一个字被分为哪一类,比如类别B-PER后被分为I-LOC类的概率明显很小。

    而CRF(条件随机场)就会具备这个功能。在代码实现上,会有一个转移(transition)矩阵,如下图所示:
    在这里插入图片描述
    START为句子开始标签,END为句子结束标签。

    令此矩阵为 t r a n tran tran t r a n [ i ] [ j ] tran[i][j] tran[i][j]代表第i个标签之后为第j个标签的概率。此转移矩阵值作为模型参数,首先会被随机初始化,然后进行训练优化。

    有了转移矩阵后,最终标注方法为:首先通过排列组合的方式获取每种标注序列的得分,取最大标注序列得分为最终结果,若句子长度为m,共有n种标注类型,此种做法就要计算 n m n^{m} nm种标注序列得分。在具体实现时,是采用动态规划算法——维特比算法进行计算的。 转移矩阵发挥的作用就是,对每组标注序列得分,除每个标注自身得分外,提供标签转移过程中的转移加分。BiLstm-Crf模型结构如下图:
    在这里插入图片描述
    参考代码: https://github.com/buppt/ChineseNER

    参考文献

    Bidirectional LSTM-CRF Models for Sequence Tagging-2015
    https://www.cnblogs.com/ltolstar/p/11975937.html
    https://zhuanlan.zhihu.com/p/97676647

    展开全文
  • 从非结构化文本抽取给定实体的属性及属性值,将属性抽取看作是一个序列标注问题.为避免人工标注训练语料,充分利用百度百科信息框(Infobox)已有的结构化内容,非结构化文本回标自动产生训练数据.在得到训练语料后,...
  • 关系提取是指从文本中提取语义关系,这种语义关系通常发生在两个或多个实体之间。这些关系可以是不同类型的。" Paris is in France "表示巴黎与法国之间的" is in "关系。这可以用三元组(Paris, is in, France)来...
  • 信息抽取主要包括3项子任务:实体抽取、关系抽取和事件抽取,而关系抽取是信息抽取领域的核心任务和重要环节.实体关系抽取的主要目标是从自然语言文本中识别并判定实体之间存在的特定关系,这为智能检索、语义分析...
  • 基于Deep Belief Nets 的中文名实体关系抽取
  • 针对传统实体关系抽取需要预先指定关系类型和制定抽取规则等无法胜任大规模文本的情况,开放式信息抽取(Open Information Extraction, OIE)在以英语为代表的西方语言中取得了重大进展,但对于汉语的研究却显得不足...
  • 中医临床病历是中医重要的科研数据资源,但目前临床病历仍以文本为主要表达形式,病历数据深入分析的前提是进行结构化信息抽取,而命名实体抽取是其基础性步骤。针对中医临床病历的命名实体,如症状、疾病和诱因等的...
  • 人工智能-自然语言处理(NLP)-应用场景:知识抽取/信息抽取(Information Extraction)
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 实体关系抽取

    2017-08-08 12:23:33
    实体关系抽取
  • 要识别出文本中出现的专有名称和有意义的数量短语并加以归类。 2.命名实体识别的主要研究内容: 就整个的命名实体识别的研究结果而言,时间表达式和数字表达式的识别相对简单,其规则的设计、数据的统计训练等也...
  • 实体关系抽取是指从无结构的自然语言文本抽取实体之间的语义关系,并以结构化的形式表示出 来。传统的实体关系抽取方法只注重一种特定类型的数据源,并需要标注大量的训练数据来训练抽取模型,人工成本高。因此...
  • 根据参与实体的多少可以分为二元关系抽取(两个实体)和多元关系抽取(三个及以上实体)。 通过关注两个实体间的语义关系,可以得到(arg1, relation, arg2)三元组,其中arg1和arg2表示两个实体,relation表示实体...
  • 文本关系抽取怎么做

    2022-05-09 13:49:37
    在医疗领域知识图谱构建的过程中,需要数据进行结构化处理,将病例信息通过文本关系抽取抽取实体,关系。同时在构建对话系统时也需要输入的句子进行句意理解,这也需要句子进行文本关系抽取。 一、关系...
  • 知识抽取实现方案——实体抽取

    千次阅读 2021-12-02 16:47:32
    知识抽取涉及的“知识”通常是清楚的、事实性的信息,这些信息来自不同的来源和结构,而不同数据源进行的知识抽取的方法各有不同,从结构化数据中获取知识用D2R,其难点在于复杂表数据的处理,包括嵌套...实体抽取
  • 近年来,微博的Swift发展为实体... 我们用新浪微博文本对提出的方法进行了评估,结果表明该方法比传统的关系提取方法能够提取更多的信息,并且满足准确性要求。 据我们所知,MICRO-ORE是第一个中文微博文本的ORE方法。
  • 文本关键信息抽取整体综述

    千次阅读 2020-09-10 16:10:45
    关键词提取、主题提取、实体抽取、关系抽取。下面进行详细的实现分析。 一、关键词提取 简介 关键词是文本分析中比较传统也比较重要的一项,在繁冗文本中提取到关键词,有助于之后一系列的操作包括主题、推荐、...
  • 知识抽取-实体及关系抽取

    千次阅读 2020-06-30 22:15:52
    知识抽取涉及的“知识”通常是清楚的、事实性的信息,这些信息来自不同的来源和结构,而不同数据源进行的知识抽取的方法各有不同,从结构化数据中获取知识用 D2R,...实体抽取 也就是命名实体识别,包括实体的检测.
  • 针对旅游和新闻领域文本经常包含许多由协陪义动词引发的隐式实体关系,本文研究了基于协陪义动词的中文隐式实体关系抽取问题. 将机器学习方法与规则相结合,借助于显式实体关系隐式实体关系进行推理. 首先,利用...
  • 分析了近十几年来关于自由文本电子病历中命名实体实体修饰与实体间关系三类关键信息的单独抽取以及联合抽取方法的研究成果,这些成果所采用的主要方法、使用的数据集、最终的实验效果等进行了对比总结。
  • 基于Bert的实体关系抽取模型

    千次阅读 2021-05-10 19:24:09
    信息抽取(Information Extraction, IE)是从自然语言文本抽取实体、属性、关系及事件等事实类信息的文本处理技术,是信息检索、智能问答、智能对话等人工智能应用的重要基础,一直受到业界的广泛关注。信息抽取任务...
  • 实体关系抽取入门

    万次阅读 2019-03-13 16:52:39
    关系抽取(Relation Extracion,RE)是其中的重要子任务之一,主要目的是从文本中识别实体抽取实体之间的语义关系。实体关系抽取解决了原始文本中目标实体之间的关系分类问题,它也是构建复杂知识...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,112
精华内容 8,444
热门标签
关键字:

对文本进行实体抽取