精华内容
下载资源
问答
  • 中文序列标注
    2019-05-31 23:05:21

    先立个FLAG写一个比较完善的中文序列标注系列

    因为最近接触的序列标注比较多,主要是做命名实体识别,区别于之前的主要是类别是多种,不仅限于人名地名机构;模型主要是用了经典的BiLSTM+CRF,BERT,以及二者结合的模型。

    博主渣渣,代码主要参考git上大佬的分享代码,此系列主要记录序列标注的原理,代码的注释,以及自己阅读的相关论文笔记。

    关于序列标注的统计学习方法主要是HMM,MEMM,CRF,在前边的博文有讲过,相关代码实现也都放在了git上,想要学习的同学学起来啊~~~

    关于中英文数据集,开源有很多,找不到的也可以联系我我告诉你地方哈哈哈,或者之后我整理下资源统一放到git上

    渣渣如我,希望我的记录能够给入门同学带来一丝丝帮助,也对得起敲过的这些字啦嘻嘻

    更多相关内容
  • 中文序列标注Flat Lattice代码解读与使用1. 原文与项目地址1.1 原文1.2 项目2. 环境搭配3. 总体结构与文件4. 参数介绍4.1 数据加载参数:4.2 bert相关参数(V1):4.3 模型参数:4.4 训练参数5. 模型与细节6. 模型...

    好久没有更新了,有好几个NLP的实践项目一直没有整理,以后会尽量加大更新频率,给大家带来更多的深度学习应用方面的分享。

    关于之前几篇博客的评论和私信,一般我都会回复,如果没有回的话可能是我也不懂的,或者当时回不了的,后来又忘记了。我目前主要是做NLP相关的研究,CV上的很多东西没有跟进,平时CV的项目接触的也少了很多,所以很多问题我也不明白,或者没有时间去仔细查代码。对于我没有及时回复的问题和解答不了的问题,在这里道个歉。

    进入正题之前,先声明一下,这篇文章是我在阅读原文和项目代码的基础上自己理解和修改的,可能存在不正确不恰当的地方,不能代表原项目本意,包括一些参数的解释,未必完全正确。如果要深入了解这个项目,请仔细阅读原文与代码。

    1. 原文与项目地址

    1.1 原文

    原文是《FLAT:Chinese NER Using Flat-Lattice Transformer》,解决的是中文命名实体识别的任务,在这里不过多的介绍原理。如果想了解原理上的细节或者Lattice在NER上的应用,可以直接在站内或者某乎搜索关键词,已经有很多人详细介绍过了。文章提出的方法在多个数据集上达到了SOTA结果,目前是中文NER的一个主流的方法。

    这篇博客虽然叫代码解读,但是我不会把每一个类、每一个方法都解释一遍,因为项目还是比较复杂的,我只会大体介绍其中相对重要的内容,把代码的运行方法讲清楚。如果有细节上的问题,可以留言或私信与我讨论。如果是原理方面的问题,建议先去多看看别人的介绍,把原理搞清楚,不清楚原理的话,想看懂代码是很难的。另外,不能完全以论文为准,有些处理细节在论文原文中没有详细的介绍。

    如果我写的有不正确的地方,还请大家帮忙指正。

    1.2 项目

    项目地址:https://github.com/LeeSureman/Flat-Lattice-Transformer

    项目分为V0和V1两个版本,其中V0是没有Bert的版本,V1是有Bert的版本。由于我个人的疏忽,一开始看的项目是原来的旧版本,只有V0,所以这次代码解读以V0为主,V1在代码结构上与V0比较相似,我在尝试复现论文结果时,在MSRA数据集上f1只达到了91,没有到论文的96,回去看git才发现原来还有个V1版本,后来在加入bert编码之后,复现了论文中96的结果。

    原项目中并没有给出模型如何进行预测等使用,在这篇博客中将会给出简单的预测方法。

    2. 运行环境

    代码是使用pytorch实现的,依赖的模块如下:

    Python: 3.7.3
    PyTorch: 1.2.0
    FastNLP: 0.5.0
    Numpy: 1.16.4
    

    (1)关于pytorch
    我使用的pytorch 1.5.0,只要是1.0以上的版本应该都没有问题。

    (2)关于FastNLP
    FastNLP是作者团队自己做的一个NLP工具包,跟这个项目比较贴合,用起来还挺好用的,FLAT的代码中很多类都是定义在FastNLP中的。
    与这个项目匹配的是0.5.0的版本,建议安装这个版本,严格按照作者的指导,会比较省事儿。如果你跟我一样安装了0.5.5的新版的FastNLP,在之后的代码执行过程中可能会遇到些问题。不过没有关系,都是比较容易解决的,我在下面也会进行说明。

    3. 项目结构

    项目的整体目录结构如下:
    项目结构

    这个目录并不是原作者git项目的结构,而是我整理之后的,直接下载我百度云上传的文件,解压之后就是这样的。
    链接:https://pan.baidu.com/s/1TGLb44HNQ2ypotxIYbsVJw
    提取码:2c2y

    所做的整理主要如下:

    (1)下载了相关的词向量文件数据集
    需要下载几个词向量文件和数据集如下

    文件默认值解释
    yangjie_rich_pretrain_unigram_path‘./gigaword_chn.all.a2b.uni.ite50.vec’单字符的预训练vec编码
    yangjie_rich_pretrain_bigram_path‘./gigaword_chn.all.a2b.bi.ite50.vec’双字符的预训练vec编码
    yangjie_rich_pretrain_word_path‘./ctb.50d.vec’词语的预训练vec编码
    yangjie_rich_pretrain_char_and_word_path‘./yangjie_word_char_mix.txt’词语和字符混合的编码,由prepocess生成
    msra_ner_cn_path‘./MSRANER’msra数据集位置

    (2)把V0和V1两个文件夹里边的main搬出来了,防止import的问题

    (3)load_data和fastNLP_model两个脚本是有V0和V1的区别的。如果执行的是flat_main.py,则会调用不带v1的脚本,如果是flat_main_v1.py,则会调用带v1的脚本。

    (4)MSRA是MSRA的序列标注数据集

    (5)cn-wwm是一个空文件夹,需要下载中文whole-word-mask的bert预训练权重文件的pytorch版,要求以bin为后缀名,该文件夹下还需要有json格式的bert config文件和词表。
    bert预训练
    方便起见我也都传百度云了。链接如下:
    链接:https://pan.baidu.com/s/1LdSYaFvgKdhLMXuSK7Fx-w
    提取码:thct

    4. 参数介绍

    项目中出现了大量的可调参数,而且,多数参数并没有给出含义的介绍,这让我在阅读代码时非常困扰,我在代码中挨个去找了这些参数,推断出参数的含义如下总结。

    4.1 数据加载参数:

    参数解释默认值
    dataset数据集名称‘msra’
    bigram_min_freqbigram编码时考虑的最小词频1
    char_min_freq单个汉字编码时考虑的最小词频1
    word_min_freq词语编码时考虑的最小词频1
    lattice_min_freq添加lattice编码时考虑的最小词频1
    train_clip是否将训练集裁剪到200以下False
    only_train_min_freq仅对train中的词语使用min_freq筛选True
    only_lexicon_in_train只加载在trian中出现过的词汇False
    number_normalized0:不norm;1:char;2:char&bi;3:char&bi&lattice0
    load_dataset_seed随机种子100

    4.2 bert相关参数(V1):

    bert相关的参数只有在V1版本中才会用到。

    参数解释默认值
    use_bert是否使用bert编码1
    only_bert是否只使用bert编码0
    fix_bert_epoch多少轮之后开始训练bert20
    after_bert如果只使用bert,bert之后的层mlp

    4.3 模型参数:

    参数解释默认值
    fffeed-forward中间层的节点个数3,修正为hidden * ff
    hiddenSE位置编码和三角函数编码共用的编码维度会修正为head_dim * head
    layerTransformer中Encoder_Layer的数量1
    headmulti-head-attn中head的个数8
    head_dimmulti-head-attn中每个head的编码维度20
    scaledmulti-head-attn中是否对attn标准化(attn_raw/sqrt(per_head_size))False
    attn_ff是否在self-attn layer最后加一个linear层False
    ff_activatefeed-forward中的激活函数‘relu’
    use_bigram是否使用双字符编码1
    use_abs_pos是否使用绝对位置编码False
    use_rel_pos是否使用相对位置编码True
    rel_pos_shared是否共享相对位置,无效参数True
    add_pos是否在transformer_layer中通过concat加入位置信息,无效参数False
    learn_pos绝对和相对位置编码中编码是否可学习(是否计算梯度)False
    pos_norm是否对位置编码进行norm(pe/pe_sum)False
    rel_pos_init相对位置编码初始化编码方向,0: 左向右;1:右向左。无效参数1,但是实际调用的类中写死为0
    four_pos_shared4个位置编码是不是共享权重True
    four_pos_fusion4个位置编码融合方法’ff’, ‘attn’, ‘gate’, ‘ff_two’, ‘ff_linear’ff_two
    four_pos_fusion_shared要不要共享4个位置融合之后形成的posTrue
    k_projattn中是否将key经过linear层False
    q_projattn中是否将query经过linear层True
    v_projattn中是否将value经过linear层True
    r_projattn中是否将相对位置编码经过linear层True
    embed_dropoutembedding中的dropout0.5
    ff_dropoutff层中的dropout0.15
    ff_dropout_2第二个ff层中的dropout0.15
    attn_dropoutattention中的dropout0

    4.4 训练参数

    训练参数相对容易理解,就不过多解释了(偷懒),把默认值列出来如下。

    epoch = 10
    batch = 1
    optim = 'sgd'   # sgd|adam
    lr = 1e-3
    warmup = 0.1
    embed_lr_rate = 1
    momentum = 0.9
    update_every = 1
    init = 'uniform'   # 'norm|uniform'
    self_supervised = False
    weight_decay = 0  
    norm_embed = True
    norm_lattice_embed = True
    test_batch = batch // 2
    

    5. 模型结构

    模型分为V0和V1两个版本。主要区别就是有没有使用Bert,所调用的类的名称也有所不同,但main脚本的流程没有太大的区别,都是按照如下的过程进行的:
    流程
    首先加载数据,创建fastNLP中Dataset类型的数据集,可以通过Dataset[‘train’]的方式去索引训练集、验证集和测试集。然后每一个数据集里边,又包含几个字段。

    字段名含义
    char原文本,以字为分割
    target标签
    bigram两两连续分割的字符

    equip lexicon是给数据集添加lattice的过程,就是去词库里边匹配词汇,然后放在原来的token embedding后边。
    接下来会读入数据的长度,给dataset添加要给seq_len的字段。然后对所有的embedding进行normalization。
    上述准备工作完成之后,就会建立模型,建立哪一种模型会根据用户输入的args进行判断。简单画了两个图,如下。

    V0版本的模型结构如下:
    V0结构
    V1版本的模型结构如下:
    V1结构

    6. 模型训练

    以MSRA数据集为例,训练只需要在项目目录下执行

    python flat_main.py --dataset msra
    

    可以根据训练参数去传参。
    在这里总结一下可能遇到的问题。如果你是直接执行我上传在百度云中的代码,可能不会遇到这些问题,因为我都已经修改过了。
    (1)import 报错。无法import _get_file_name_base_on_postfix函数。
    这个错误很明显,函数名以下短线开头,不能被import。只需要把这个函数复制到报错的脚本load_data.py中就可以了。
    (2)ncoding_type 不对。
    在代码里改一下就好了,例如MSRA数据集,改成bioes,CLUE数据集,改成bio,就可以了。
    (3)缺少数据类型‘chain’。
    这个来自于\JetBrains\PyCharm\python_stubs-1902731831\itertools.py这个脚本,把这个脚本复制到项目根路径,然后import它就可以了。在报错的脚本中添加:

    from itertools import chain
    

    (4)Bert相关的问题
    如果是用的V1版本代码,可以设置使用Bert编码,如果使用0.5.5的FastNLP则会遇到若干问题,问题和解决方法如下。
    BertModel的名称不对:
    这是因为FastNLP中这个类的名字变了,原本是_WordBertModel,改成了_BertWordModel,直接复制这个类,改一下名字,丢在fastNLP_Module_v1.py里边就可以了。
    然后会报缺少bert tokenizer,也是直接把fastNLP里边的\modules\tokenizer\bert_tokenizer.py里边相关的代码复制到fastNLP_Module_v1.py就可以解决了。
    (5)tqdm引发的报错
    如果是在jupyter中执行训练,可能会由于tqdm版本的问题引发报错,遇到这种情况只需要把训练参数中的use tqdm给关掉就可以了。

    7. 模型保存、加载与预测

    由于作者提供的只包含了训练,没有设置模型的保存、加载与预测相关的功能,所以我在这补充一下这几方面。

    7.1 模型保存

    模型在训练的时候,利用了fastNLP中的一个名为Trainer的类,通过查看这个类的代码可以发现,这个类是写了保存方法的。
    只需要在flat_main.py中,生成Trainer的位置加一个参数save_path就可以了。

        trainer = Trainer(datasets['train'], model, optimizer, loss, args.batch,
                          n_epochs=args.epoch,
                          dev_data=datasets['dev'],
                          metrics=metrics,
                          device=device, callbacks=callbacks, dev_batch_size=args.test_batch,
                          test_use_tqdm=False, check_code_level=-1,
                          update_every=args.update_every,
                          save_path='your_path/flat_lattice/{}/'.format(args.dataset))
    

    但是我这样修改了之后,在保存的时候还是报错了,所以我又把Trainer的save和load方法修改了一下。修改后的代码如下:

    def _save_model(self, model, model_name):
    	if self.save_path is not None:
    		model_path = os.path.join(self.save_path, model_name)
    		if not os.path.exists(self.save_path):
    			os.makedirs(self.save_path, exist_ok=True)
    		if _model_contains_inner_module(model):
    			model = model.module
    		torch.save(model.state_dict(), model_path)  # 只改了这一行
    
    def _save_model(self, model, model_name):
    	if self.save_path is not None:
    		model_path = os.path.join(self.save_path, model_name)
    		model.load_state_dict(torch.load(model_path))
    	elif hasattr(self, "_best_model_states"):
    		model.load_state_dict(self._best_model_states)
    	else:
    		return False
    	return True
    

    这样改好了之后,执行flat_main.py脚本进行训练之后,就会在save_path路径下保存一个模型权重文件。

    7.2 模型加载

    模型加载很简单,只需要在flat_main.py中,实例化model之后,load之前保存的权重文件就可以了。

    model_path = '/msra/best_Lattice_Transformer_SeqLabel_f_2021-03-03-14-55-31-899501'
    states = torch.load(model_path).state_dict()
    model.load_state_dict(states)
    

    7.3 生成预测

    作者并没有给出如何预测,但是在fastNLP中实际上是定义了用于预测的类的,名为predictor,去看一下代码的话,这个类其实写的很简单,但是很实用。使用方法如下:

    from fastNLP.core.predictor import Predictor
    predictor = Predictor(model)   # 这里的model是加载权重之后的model
    
    test_label_list = predictor.predict(datasets['test'][:1])['pred'][0]  # 预测结果
    test_raw_char = datasets['test'][:1]['raw_chars'][0]     # 原始文字
    

    上面代码中的test_label_list就在test上预测出来的label,label对应的BIO可以通过以下代码查看:

    for d in vocabs['label']:
        print(d)
    

    然后我写了一个简单的方法把label转换成实体(仅适用于MSRA数据集),如下所示:

    def recognize(label_list, raw_chars):
        """
        根据模型预测的label_list,找出其中的实体
        label_lsit: array
        raw_chars: list of raw_char
        return: entity_list: list of tuple(ent_text, ent_type)
        -------------
        ver: 20210303
        by: changhongyu
        """
        if len(label_list.shape) == 2:
            label_list = label_list[0]
        elif len(label_list) > 2:
            raise ValueError('please check the shape of input')
            
        assert len(label_list.shape) == 1
        assert len(label_list) == len(raw_chars)
        
        # 其实没有必要写这个
        # 但是为了将来可能适应bio的标注模式还是把它放在这里了
        starting_per = False
        starting_loc = False
        starting_org = False
        ent_type = None
        ent_text = ''
        entity_list = []
        
        for i, label in enumerate(label_list):
            if label in [0, 1, 2]:
                ent_text = ''
                ent_type = None
                continue
            # begin
            elif label == 10:
                ent_type = 'PER'
                starting_per = True
                ent_text += raw_chars[i]
            elif label == 4:
                ent_type = 'LOC'
                starting_loc = True
                ent_text += raw_chars[i]
            elif label == 6:
                ent_type = 'ORG'
                starting_org = True
                ent_text += raw_chars[i]
            # inside
            elif label == 9:
                if starting_per:
                    ent_text += raw_chars[i]
            elif label == 8:
                if starting_loc:
                    ent_text += raw_chars[i]
            elif label == 3:
                if starting_org:
                    ent_text += raw_chars[i]
            # end
            elif label == 11:
                if starting_per:
                    ent_text += raw_chars[i]
                    starting_per = False
            elif label == 5:
                if starting_loc:
                    ent_text += raw_chars[i]
                    starting_loc = False
            elif label == 7:
                if starting_org:
                    ent_text += raw_chars[i]
                    starting_org = False
            elif label == 13:
                ent_type = 'PER'
                ent_text = raw_chars[i]
            elif label == 12:
                ent_type = 'LOC'
                ent_text = raw_chars[i]
            elif label == 14:
                ent_type = 'PER'
                ent_text = raw_chars[i]
            else:
                ent_text = ''
                ent_type = None
                continue
            
            if not (starting_per or starting_loc or starting_org) and len(ent_text):
                # 判断实体已经结束,并且提取到的实体有内容
                entity_list.append((ent_text, ent_type))
            
        return entity_list    
    
    recognize(test_label_list, test_raw_char)
    # Out:
    # [('中共中央', 'ORG'),
    #  ('中国致公党', 'ORG'),
    #  ('中国致公党', 'ORG'),
    #  ('中国共产党中央委员会', 'ORG'),
    #  ('致公党', 'ORG')]
    

    8. 应用在自己的数据集

    在这里我以中文命名实体识别数据集CLUE NER 2020为例,介绍怎样将FLAT用在自己的数据集上。
    (1)数据格式转换。
    首先,不管你的数据格式原来是什么样子,都要转成一行一个字符的格式,例如:

    浙 B-CMP
    商 I-CMP
    银 I-CMP
    行 I-CMP
    企 O
    业 O
    信 O
    贷 O
    部 O
    

    并且命名为train.char.bmes,然后创建一个名为CLUE2020的文件夹,把train,dev和test都放进去。
    (2)设置路径
    打开paths.py,增加一行:

    clue_2020_ner_path = './CLUE2020'
    

    (3)写加载数据方法
    打开load_data_v1.py,仿照load_ontonotes4ner,写一个新的方法load_clue_2020,几乎就是复制粘贴,改一下加载数据的路径和缓存路径就好了。

    (4)在main中修改加载的数据集
    打开flat_main_v1.py,修改dataset为clue,以及读取数据的时候,加一个判断,如果dataset为clue,调用(3)中刚写的load_clue的方法。

    完成了这几步之后,训练时就可以用自己的数据集啦。

    python flat_main_v1.py --dataset clue
    

    然后就可以根据7中的步骤去进行预测了,记得自己写一下recognize的方法,这个识别方法是由数据集的标注格式决定的。

    注意一点,缓存的名字是跟着dataset的名字走的,如果你换了数据集的实际内容,而数据集的名称没有改的话,记得去cache里边把缓存清理掉,不然模型运行的时候会有限去找缓存,而缓存存的还是原来的数据集。

    这篇文章到这里就结束了,如果有任何关于Flat命名实体识别相关的问题,无论是原理还是代码,可以在评论区留言交流,如果我能解答的话会回复的。如果没有回复,可以给我发私信。

    如果对你有所帮助的话,记得一键三连支持一下博主。我们下期再见。

    展开全文
  • 本次要完成 nlp 四大基础任务之一的序列标注任务,也叫做命名实体识别。即是在给定文本中能够对词性、人名地名等特定信息进行标注。 实验主要采用循环神经网络进行搭建,每一条样本输入是一条句子(对应的嵌入向量...

    资源下载地址:https://download.csdn.net/download/sheziqiong/86178744
    资源下载地址:https://download.csdn.net/download/sheziqiong/86178744

    一、思路

    本次要完成 nlp 四大基础任务之一的序列标注任务,也叫做命名实体识别。即是在给定文本中能够对词性、人名地名等特定信息进行标注。

    实验主要采用循环神经网络进行搭建,每一条样本输入是一条句子(对应的嵌入向量表示),该样本的标签也是一个等长的句子标签,其中每一个元素对应句子中每一个字的标签。如样本为‘我 爱 北 京’,则该样本的标签为‘O O B-LOC I-LOC’。然后通过循环神经网络再结合交叉熵损失函数进行训练。但根据课上所学知识,我们知道直接用 LSTM 虽然可以完成该任务,但是往往会预测出现一些不可能真实存在的结果,如连续两个 B-LOC 标签。因此我们可以增加条件随机场 CRF 模型在 LSTM 层之后,使用梯度下降自动去学习 CRF 模型的参数,这样可以获得比只使用 LSTM 好的结果。

    二、模型概况

    Input()
    Embedding(input_dim=5000, output_dim=50)
    BiLSTM(units=100)
    BiLSTM(units=150)
    CRF(units=7)

    三、编程实现

    为了实现上述模型我们首先需要对输入进行处理。首先使用 Tokenizer 库进行分词,词典大小设置为 5000,之后对训练样本进行padding(这里选择 maxlength进行padding),之后对标签也要做相应的 padding(这里 padding 的内容直接选用 O 标签)。

    使用 keras 库进行模型的搭建,堆叠型模型声明如下

    优化器选用 Adam,损失函数使用稀疏交叉熵,batchsize 设为 128,训练 20 轮。之后用训练好的模型,在测试集上测试即可。 www.biyezuopin.vip

    四、实验结果

    1.两层双向 LSTM 结果:

    OB-LOCI-LOCB-PERI-PERB-ORGI-ORG
    Precision0.99400.90800.92260.90630.90260.81310.8626
    Recall0.99780.84710.79270.81350.88520.75510.7894
    F10.99590.87650.85270.85740.89380.78300.8244
    With ‘O’Without ‘O’
    Macro-precision0.90130.8859
    Macro-recall0.84010.8138
    Macro-f10.86910.8480

    2.三层双向 LSTM 结果,效果提升不明显

    With ‘O’Without ‘O’
    Macro-precision0.88630.8682
    Macro-recall0.86100.8383
    Macro-f10.87260.8520


    资源下载地址:https://download.csdn.net/download/sheziqiong/86178744
    资源下载地址:https://download.csdn.net/download/sheziqiong/86178744

    展开全文
  • NLP之序列标注学习

    千次阅读 2021-07-11 21:11:58
    以下内容参考自:b站【NLP经典论文】【基于神经网络的序列标注:BiLSTM+CNNs+CRF】 1、什么是序列标注  ...序列标注是自然语言处理中最常见也是最基础的的问题,常见的子任务包括 (中文)分词 、

    在讲序列标注学习之前,我们需要了解NLP中关系抽取Relation Extraction系统通常分为以下三个模块
    RE
           而端到端的关系抽取系统将实体和关系进行联合的训练,也就是Joint Extraction of Entities and Relations。我们输入一个句子,可以输出一个(头实体,关系,尾实体)的三元组。联合抽取模型是管道模型PineLine的改进,改进了误差传递和实体冗余等管道模型的缺陷。

    经典的关系抽取任务设定
           预定义关系类型,给定一句话和句中两个实体,对该句子表达的两实体间的关系进行分类。

    关系抽取模型的发展
    1、Pattern Mining(模板匹配,需要花很多时间设计模板)>>
    2、Feature- Based Methods(特征模板)>>
    3、 Kernel- Based Methods(SVM)>>
    4、Graphical Models(概率图模型)>>
    5、 Neural Models

    以上内容部分参考自:智源论坛Live | 清华大学高天宇:实体关系抽取的现状和未来
    以下内容主要参考自:b站【NLP经典论文】【基于神经网络的序列标注:BiLSTM+CNNs+CRF】

    1、什么是序列标注

           序列标注 Sequence Labeling,即给定一个输入序列,使用模型对这个序列的每一个位置标注一个相应的标签,是一个序列到序列的过程。
           序列标注是自然语言处理中最常见也是最基础的的问题,常见的子任务包括 (中文)分词命名实体识别(NER)词性标注等等。
    --------------------------------------------------------以下以命名实体识别为例子讨论序列标注的具体问题-------------------------------------------------------

    2、什么是命名实体识别

    2.1 定义

           命名实体识别 ( Named Entities Recognition, NER )的目的是识别语料中人名、地名,组织机构名等命名实体。NER是信息抽取、信息检索、机器翻译、问答系统等多种自然语言处理技术必不可少的组成部分。
           命名实体是命名实体识别的研究主体,一般包括3大类(实体类、时间类和数字类)和7小类(人名、地名、机构名、时间、日期、货币和百分比)。
           评判一个命名实体是否被正确识别包括两个方面:实体边界是否正确;实体类型是否正确。其主要错误类型包括文本正确,类型错误;反之,文本边界错误,而其包含的主要实体词和类型标记也可能正确。

    2.2 发展历史

    1. 基于规则的NER >>
    2. 基于特征模板的NER,如生成模型HMM、判别模型 >>
    3. 基于神经网络的NER,如Bi-LSTM-CRF、Lattice LSTM

    2.3 模型/方法介绍

    2.3.1 基于规则的NER

           利用手工编写的规则,将文本与规则进行匹配来识别出命名实体。
           例如,对于中文来说,"说”、”老师” 等词语可作为人名的下文,“大学”、”医院"等词语可作为组织机构名的结尾,还可以利用到词性、句法等一系列信息帮助我们做判断。
           但是,在构建规则的过程中往往需要大量的语言学知识,不同语言的识别规则不尽相同,而且需要谨慎处理规则之间的冲突问题;此外,构建规则的过程费时费力、可移植性不好。

    2.3.2 基于特征模板的NER

           统计机器学习方法将NER视作序列标注任务,利用大规模语料来学习出标注模型,从而对句子的各个位置进行标注。常用的应用到NER任务中的模型包括生成式的HMM(隐马尔科夫模型)和判别式的CRF (条件随机场)等。
           比较流行的方法是特征模板+CRF的方案:特征模板通常是人工定义的一些二值特征函数试图挖掘命名实体内部以及上下文的构成特点。对于句子中的给定位置来说,提取特征的位置是一个窗口,即上下文位置。而且,不同的特征模板之间可以进行组合来形成一个新的特征模板。我的理解是通过统计机器学习方法,能预先从语料库中学习到实体与实体之间相互匹配的位置关系,进而构成特征模板。
           CRF的优点在于其为一个位置进行标注的过程中,可以利用到此前已经标注的信息,并利用Viterbi解码来得到最优序列。对句子中的各个位置提取特征时,满足条件的特征取值为1,不满足条件的特征取值为0;然后把特征喂feed给CRF,进而在训练阶段建模标签的转移,并在推断( inference )阶段为测试句子的各个位置做标注。

    2.3.3 基于神经网络的NER

           近年来,随着词向量的出现,神经网络成为可以有效处理许多NLP任务的模型。基于神经网络的命名实体识别模型首先将词表示为稠密的向量表示,随后将词向量序列输入到RNN中,用神经网络自动提取特征后,来预测每个位置的标签。这种方法使得模型的训练成为一个端到端的整体过程,不再依赖特征工程,是一种数据驱动的方法。
           这种方法的一个缺点是对每个词打标签的过程中是独立的分类,不能直接利用上文已经预测的标签(只能靠隐状态传递上文信息),进而导致预测出的标签序列可能是非法的,例如,标签B-PER后面是不可能紧跟I-LOC的,由此也就出现了Bi-LSTM-CRF的方法。
    ----------------------------------------------------------------------------------持续更新ing----------------------------------------------------------------------------------

    展开全文
  • 序列标注的方法

    2021-12-11 21:23:38
  • | 疯狂的Max 论文Lexicon Enhanced Chinese Sequence Labelling Using BERT Adapter 解读 01 背景与动机 近年来,多项研究致力于将词汇信息融入中文预训练模型中以提升命名实体识别、分词和词性标注等序列标注类任务...
  • 常见的标注体系以及BMEO格式转换BIO格式代码实现
  • ERNIE 3.0中文预训练模型进行MSRA序列标注 文章链接:...
  • 提出了一种基于序列标注模型的中文依存句法分析方法。 该方法将依存句法分析转化成序列标注问题, 利用条件随机 场 CRF ( Cond itionalR andom F ie ld)建立序列标注模型。 在宾州中文树库的测试中, 达得了 76. 59% ...
  • 基于循环神经网络序列标注中文分词研究.pdf
  • 序列标注 | (1) 序列标注问题概述

    千次阅读 2020-04-02 20:44:43
     序列标注问题是自然语言中最常见的问题,在深度学习火起来之前,常见的序列标注问题的解决方案都是借助于HMM模型,最大熵模型,CRF模型。尤其是CRF,是解决序列标注问题的主流方法。随着深度学习的发展,RNN在序列...
  • 利用transformers实现序列标注 最近在学习transformers这个模块,用这个模块实现序列标注。transformers模块可以加载大部分的预训练模型,包括bert-base-uncased,bert-base-chinese,hfl/chinese-roberta-wwm-ext,...
  • 中文NLP序列标注工具。利用CRF进行命名实体识别NER,自动标注数据集产生语料库,可以选择BIO或者BMES标注体系。
  • 各种序列标注的介绍

    2022-03-10 21:10:16
    参考资料 Jiagu: Jiagu深度学习自然语言处理工具 知识图谱关系抽取 中文分词 词性标注 命名实体识别 情感分析 新词发现 ...(269条消息) 序列标注中的BIO标注介绍_HappyRocking的专栏-CSDN博客_bio标注//清晰易懂 ...
  • 背景 ...但是,序列标注中,以命名实体识别中的姓名为例,一个姓名实体可能由两个汉字、三个、四个汉字组成。在序列标注算法中,一般会有如下序列标注列表: ['O', 'O', 'B-MISC', 'I-MISC', 'B-MIS
  • 所谓序列标注: 就是有一个线性序列:X = x_1 , x_2, x_3,......,x_n 给每一个元素打上标签:Y = y_1, y_2, y_3,......, y_n 序列标注任务 1.分词 [B, M, E, S] B: 代表开始字符 M:代表中间字符 E:代表...
  • 序列标注简介

    千次阅读 2018-11-09 15:05:17
    1. 序列标注 序列标注:简单的来说序列标注就是:给定一个序列,对序列中的每一个元素做一个标记,或者说给每一个元素打一个标签。一般来说,一个序列指的是一个句子,而一个元素指的是句子中的一个词。 2. 标签 ...
  • 概率序列模型:它的工作是为序列中的每个单元分配一个标签或类,从而将一个观察序列映射到一个标签序列。给定一个单位序列(单词、字母、语素、句子,等等),它计算可能的标签序列的概率分布,并选择最佳的标签序列...
  • 以一组词性标注为例,给定输入X={我,喜欢,学习},那么输出为Y={名词,动词,名词}的概率应该为最大。输入序列X又称为观测序列,输出序列Y又称为状态序列。这个状态序列构成马尔可夫随机场,所以根据观测序列,得出...
  • 序列标注中文命名实体识别(NER)
  • 文章大纲序列标注词性标注lac参考文献 序列标注 词性标注 词性和专名类别标签集合如下表,其中我们将最常用的4个专名类别标记为大写的形式: 标签 含义 标签 含义 标签 含义 标签 含义 n 普通名词 f 方位...
  • NLP|序列标注

    2021-07-09 10:55:57
    序列标注(Sequence Tagging)是一个比较简单的NLP任务,但也可以称作是最基础的任务。序列标注的涵盖范围是非常广泛的,可用于解决一系列对字符进行分类的问题,如分词、词性标注、命名实体识别、关系抽取等等。 有...
  • 这个得分函数S就很好地弥补了传统BiLSTM的不足,因为我们当一个预测序列得分很高时,并不是各个位置都是softmax输出最大概率值对应的label,还要考虑前面转移概率相加最大,即还要符合输出规则(B后面不能再跟B),...
  • pytorch-sequencelabeling是一个支持softmax、crf、span等模型,只依赖pytorch、transformers、tensorboardX和numpy,专注于序列标注(命名实体识别、词性标注、中文分词)的轻量级自然语言处理工具包。 目录 ...
  • Datawhale-NLP-序列标注

    2021-08-28 17:26:32
    1. 什么是序列标注 在上面这个例子中有两个 saw ,其中第一个 saw 是动词,而第二个 saw 是名次,所以需要理解整个句子的含义才能做出正确的词性标注。 序列标注(Sequence Tagging)是一个比较简单的NLP任务,但也...
  • 序列标注

    2017-07-19 09:21:18
    序列标注问题应该说是自然语言处理中最常见的问题,而且很可能是最而没有之一。在深度学习没有广泛渗透到各个应用领域之前,传统的最常用的解决序列标注问题的方案是最大熵、CRF等模型,尤其是CRF,基本是最主流的...
  • 当前主流的中文分词方法是基于字标注的传统机器学习方法,但传统机器学习方法需要人为地从中文文本中配置并提取特征,存在词库维度高且...LSTM网络模型的方法也更容易推广并应用到其他自然语言处理中序列标注的任务。
  • 序列标注任务是中文自然语言处理(NLP)领域在句子层面中的主要任务,在给定的文本序列上预测序列中需要作出标注的标签。常见的子任务有命名实体识别(NER)、Chunk提取以及词性标注(POS)等。序列标注任务在e成的...
  • NLP(三十四)使用keras-bert实现序列标注任务

    千次阅读 热门讨论 2020-12-26 14:04:32
    本系列文章将致力于应用keras-bert对BERT进行微调,完成基础的NLP任务,比如文本多分类、文本多标签分类以及序列标注等。   keras-bert是Python的第三方模块,它方便我们使用Keras来调用BERT,借助几行代码就可以...
  • Pytorch-NLU是一个只依赖pytorch、transformers、numpy、tensorboardX,专注于文本分类、序列标注的极简自然语言处理工具包。 支持BERT、ERNIE、ROBERTA、NEZHA、ALBERT、XLNET、ELECTRA、GPT-2、TinyBERT、XLM、T5...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,223
精华内容 8,489
关键字:

中文序列标注