日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CLUENER 细粒度命名实体识别baseline:BiLSTM-CRF

發(fā)布時(shí)間:2024/3/12 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CLUENER 细粒度命名实体识别baseline:BiLSTM-CRF 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 數(shù)據(jù)類別
    • 標(biāo)簽類別定義 & 標(biāo)注規(guī)則
    • 數(shù)據(jù)下載地址
    • 數(shù)據(jù)分布
    • 數(shù)據(jù)字段解釋
    • 數(shù)據(jù)來源
    • baseline:BiLSTM-CRF
    • 運(yùn)行
    • 參考

命名實(shí)體識(shí)別(NameEntity Recognition) 是信息提取的一個(gè)子任務(wù),其目的是將文本中的命名實(shí)體定位并分類為預(yù)定義的類別,如人員、組織、位置等。它是信息抽取、問答系統(tǒng)和句法分析等應(yīng)用領(lǐng)域的重要基礎(chǔ)技術(shù),是結(jié)構(gòu)化信息抽取的重要步驟。

目前可公開訪問獲得的、高質(zhì)量、細(xì)粒度的中文NER數(shù)據(jù)集較少,其中(CLUE)基于清華大學(xué)開源的文本分類數(shù)據(jù)集THUCNEWS,選出部分?jǐn)?shù)據(jù)進(jìn)行細(xì)粒度命名實(shí)體標(biāo)注,并對(duì)數(shù)據(jù)進(jìn)行清洗,得到一個(gè)細(xì)粒度的NER數(shù)據(jù)集。

項(xiàng)目地址:https://github.com/CLUEbenchmark/CLUENER2020

詳細(xì)內(nèi)容可以參考論文:
CLUENER2020: Fine-grained Named Entity Recognition Dataset and Benchmark for Chinese

下面是對(duì)數(shù)據(jù)集的簡(jiǎn)單介紹:

數(shù)據(jù)類別

數(shù)據(jù)分為10個(gè)標(biāo)簽類別,分別為: 地址(address),書名(book),公司(company),游戲(game),政府(government),電影(movie),姓名(name),組織機(jī)構(gòu)(organization),職位(position),景點(diǎn)(scene)

標(biāo)簽類別定義 & 標(biāo)注規(guī)則

地址(address): **省**市**區(qū)**街**號(hào),**路,**街道,**村等(如單獨(dú)出現(xiàn)也標(biāo)記)。地址是標(biāo)記盡量完全的, 標(biāo)記到最細(xì)。 書名(book): 小說,雜志,習(xí)題集,教科書,教輔,地圖冊(cè),食譜,書店里能買到的一類書籍,包含電子書。 公司(company): **公司,**集團(tuán),**銀行(央行,中國(guó)人民銀行除外,二者屬于政府機(jī)構(gòu)), 如:新東方,包含新華網(wǎng)/中國(guó)軍網(wǎng)等。 游戲(game): 常見的游戲,注意有一些從小說,電視劇改編的游戲,要分析具體場(chǎng)景到底是不是游戲。 政府(government): 包括中央行政機(jī)關(guān)和地方行政機(jī)關(guān)兩級(jí)。 中央行政機(jī)關(guān)有國(guó)務(wù)院、國(guó)務(wù)院組成部門(包括各部、委員會(huì)、中國(guó)人民銀行和審計(jì)署)、國(guó)務(wù)院直屬機(jī)構(gòu)(如海關(guān)、稅務(wù)、工商、環(huán)??偩值?#xff09;,軍隊(duì)等。 電影(movie): 電影,也包括拍的一些在電影院上映的紀(jì)錄片,如果是根據(jù)書名改編成電影,要根據(jù)場(chǎng)景上下文著重區(qū)分下是電影名字還是書名。 姓名(name): 一般指人名,也包括小說里面的人物,宋江,武松,郭靖,小說里面的人物綽號(hào):及時(shí)雨,花和尚,著名人物的別稱,通過這個(gè)別稱能對(duì)應(yīng)到某個(gè)具體人物。 組織機(jī)構(gòu)(organization): 籃球隊(duì),足球隊(duì),樂團(tuán),社團(tuán)等,另外包含小說里面的幫派如:少林寺,丐幫,鐵掌幫,武當(dāng),峨眉等。 職位(position): 古時(shí)候的職稱:巡撫,知州,國(guó)師等。現(xiàn)代的總經(jīng)理,記者,總裁,藝術(shù)家,收藏家等。 景點(diǎn)(scene): 常見旅游景點(diǎn)如:長(zhǎng)沙公園,深圳動(dòng)物園,海洋館,植物園,黃河,長(zhǎng)江等。

數(shù)據(jù)下載地址

數(shù)據(jù)下載地址一
或者
數(shù)據(jù)下載地址二

數(shù)據(jù)分布

訓(xùn)練集:10748 驗(yàn)證集集:1343按照不同標(biāo)簽類別統(tǒng)計(jì),訓(xùn)練集數(shù)據(jù)分布如下(注:一條數(shù)據(jù)中出現(xiàn)的所有實(shí)體都進(jìn)行標(biāo)注,如果一條數(shù)據(jù)出現(xiàn)兩個(gè)地址(address)實(shí)體,那么統(tǒng)計(jì)地址(address)類別數(shù)據(jù)的時(shí)候,算兩條數(shù)據(jù)): 【訓(xùn)練集】標(biāo)簽數(shù)據(jù)分布如下: 地址(address):2829 書名(book):1131 公司(company):2897 游戲(game):2325 政府(government):1797 電影(movie):1109 姓名(name):3661 組織機(jī)構(gòu)(organization):3075 職位(position):3052 景點(diǎn)(scene):1462【驗(yàn)證集】標(biāo)簽數(shù)據(jù)分布如下: 地址(address):364 書名(book):152 公司(company):366 游戲(game):287 政府(government):244 電影(movie):150 姓名(name):451 組織機(jī)構(gòu)(organization):344 職位(position):425 景點(diǎn)(scene):199

數(shù)據(jù)字段解釋

以train.json為例,數(shù)據(jù)分為兩列:text & label,其中text列代表文本,label列代表文本中出現(xiàn)的所有包含在10個(gè)類別中的實(shí)體。 例如:text: "北京勘察設(shè)計(jì)協(xié)會(huì)副會(huì)長(zhǎng)兼秘書長(zhǎng)周蔭如"label: {"organization": {"北京勘察設(shè)計(jì)協(xié)會(huì)": [[0, 7]]}, "name": {"周蔭如": [[15, 17]]}, "position": {"副會(huì)長(zhǎng)": [[8, 10]], "秘書長(zhǎng)": [[12, 14]]}}其中,organization,name,position代表實(shí)體類別,"organization": {"北京勘察設(shè)計(jì)協(xié)會(huì)": [[0, 7]]}:表示原text中,"北京勘察設(shè)計(jì)協(xié)會(huì)" 是類別為 "組織機(jī)構(gòu)(organization)" 的實(shí)體, 并且start_index為0,end_index為7 (注:下標(biāo)從0開始計(jì)數(shù))"name": {"周蔭如": [[15, 17]]}:表示原text中,"周蔭如" 是類別為 "姓名(name)" 的實(shí)體, 并且start_index為15,end_index為17"position": {"副會(huì)長(zhǎng)": [[8, 10]], "秘書長(zhǎng)": [[12, 14]]}:表示原text中,"副會(huì)長(zhǎng)" 是類別為 "職位(position)" 的實(shí)體, 并且start_index為8,end_index為10,同時(shí),"秘書長(zhǎng)" 也是類別為 "職位(position)" 的實(shí)體,并且start_index為12,end_index為14

數(shù)據(jù)來源

本數(shù)據(jù)是在清華大學(xué)開源的文本分類數(shù)據(jù)集THUCTC基礎(chǔ)上,選出部分?jǐn)?shù)據(jù)進(jìn)行細(xì)粒度命名實(shí)體標(biāo)注,原數(shù)據(jù)來源于Sina News RSS.

baseline:BiLSTM-CRF

模型所需的環(huán)境:

  • pytorch1.12
  • python3.7

模型的主要代碼:

from torch.nn import LayerNorm import torch.nn as nn from crf import CRFclass SpatialDropout(nn.Dropout2d):def __init__(self, p=0.6):super(SpatialDropout, self).__init__(p=p)def forward(self, x):x = x.unsqueeze(2) # (N, T, 1, K)x = x.permute(0, 3, 2, 1) # (N, K, 1, T)x = super(SpatialDropout, self).forward(x) # (N, K, 1, T), some features are maskedx = x.permute(0, 3, 2, 1) # (N, T, 1, K)x = x.squeeze(2) # (N, T, K)return xclass NERModel(nn.Module):def __init__(self,vocab_size,embedding_size,hidden_size,label2id,device,drop_p = 0.1):super(NERModel, self).__init__()self.emebdding_size = embedding_sizeself.embedding = nn.Embedding(vocab_size, embedding_size)self.bilstm = nn.LSTM(input_size=embedding_size,hidden_size=hidden_size,batch_first=True,num_layers=2,dropout=drop_p,bidirectional=True)self.dropout = SpatialDropout(drop_p)self.layer_norm = LayerNorm(hidden_size * 2)self.classifier = nn.Linear(hidden_size * 2,len(label2id))self.crf = CRF(tagset_size=len(label2id), tag_dictionary=label2id, device=device)def forward(self, inputs_ids, input_mask):embs = self.embedding(inputs_ids)embs = self.dropout(embs)embs = embs * input_mask.float().unsqueeze(2)seqence_output, _ = self.bilstm(embs)seqence_output= self.layer_norm(seqence_output)features = self.classifier(seqence_output)return featuresdef forward_loss(self, input_ids, input_mask, input_lens, input_tags=None):features = self.forward(input_ids, input_mask)if input_tags is not None:return features, self.crf.calculate_loss(features, tag_list=input_tags, lengths=input_lens)else:return features

以下為訓(xùn)練和評(píng)估代碼:

import json import torch import argparse import torch.nn as nn from torch import optim import config from model import NERModel from dataset_loader import DatasetLoader from progressbar import ProgressBar from ner_metrics import SeqEntityScore from data_processor import CluenerProcessor from lr_scheduler import ReduceLROnPlateau from utils_ner import get_entities from common import (init_logger,logger,json_to_text,load_model,AverageMeter,seed_everything)def train(args,model,processor):train_dataset = load_and_cache_examples(args, processor, data_type='train')train_loader = DatasetLoader(data=train_dataset, batch_size=args.batch_size,shuffle=False, seed=args.seed, sort=True,vocab = processor.vocab,label2id = args.label2id)parameters = [p for p in model.parameters() if p.requires_grad]optimizer = optim.Adam(parameters, lr=args.learning_rate)scheduler = ReduceLROnPlateau(optimizer, mode='max', factor=0.5, patience=3,verbose=1, epsilon=1e-4, cooldown=0, min_lr=0, eps=1e-8)best_f1 = 0for epoch in range(1, 1 + args.epochs):print(f"Epoch {epoch}/{args.epochs}")pbar = ProgressBar(n_total=len(train_loader), desc='Training')train_loss = AverageMeter()model.train()assert model.trainingfor step, batch in enumerate(train_loader):input_ids, input_mask, input_tags, input_lens = batchinput_ids = input_ids.to(args.device)input_mask = input_mask.to(args.device)input_tags = input_tags.to(args.device)features, loss = model.forward_loss(input_ids, input_mask, input_lens, input_tags)loss.backward()torch.nn.utils.clip_grad_norm_(model.parameters(), args.grad_norm)optimizer.step()optimizer.zero_grad()pbar(step=step, info={'loss': loss.item()})train_loss.update(loss.item(), n=1)print(" ")train_log = {'loss': train_loss.avg}if 'cuda' in str(args.device):torch.cuda.empty_cache()eval_log, class_info = evaluate(args,model,processor)logs = dict(train_log, **eval_log)show_info = f'\nEpoch: {epoch} - ' + "-".join([f' {key}: {value:.4f} ' for key, value in logs.items()])logger.info(show_info)scheduler.epoch_step(logs['eval_f1'], epoch)if logs['eval_f1'] > best_f1:logger.info(f"\nEpoch {epoch}: eval_f1 improved from {best_f1} to {logs['eval_f1']}")logger.info("save model to disk.")best_f1 = logs['eval_f1']if isinstance(model, nn.DataParallel):model_stat_dict = model.module.state_dict()else:model_stat_dict = model.state_dict()state = {'epoch': epoch, 'arch': args.arch, 'state_dict': model_stat_dict}model_path = args.output_dir / 'best-model.bin'torch.save(state, str(model_path))print("Eval Entity Score: ")for key, value in class_info.items():info = f"Subject: {key} - Acc: {value['acc']} - Recall: {value['recall']} - F1: {value['f1']}"logger.info(info)def evaluate(args,model,processor):eval_dataset = load_and_cache_examples(args,processor, data_type='dev')eval_dataloader = DatasetLoader(data=eval_dataset, batch_size=args.batch_size,shuffle=False, seed=args.seed, sort=False,vocab=processor.vocab, label2id=args.label2id)pbar = ProgressBar(n_total=len(eval_dataloader), desc="Evaluating")metric = SeqEntityScore(args.id2label,markup=args.markup)eval_loss = AverageMeter()model.eval()with torch.no_grad():for step, batch in enumerate(eval_dataloader):input_ids, input_mask, input_tags, input_lens = batchinput_ids = input_ids.to(args.device)input_mask = input_mask.to(args.device)input_tags = input_tags.to(args.device)features, loss = model.forward_loss(input_ids, input_mask, input_lens, input_tags)eval_loss.update(val=loss.item(), n=input_ids.size(0))tags, _ = model.crf._obtain_labels(features, args.id2label, input_lens)input_tags = input_tags.cpu().numpy()target = [input_[:len_] for input_, len_ in zip(input_tags, input_lens)]metric.update(pred_paths=tags, label_paths=target)pbar(step=step)print(" ")eval_info, class_info = metric.result()eval_info = {f'eval_{key}': value for key, value in eval_info.items()}result = {'eval_loss': eval_loss.avg}result = dict(result, **eval_info)return result, class_infodef predict(args,model,processor):model_path = args.output_dir / 'best-model.bin'model = load_model(model, model_path=str(model_path))test_data = []with open(str(args.data_dir / "test.json"), 'r') as f:idx = 0for line in f:json_d = {}line = json.loads(line.strip())text = line['text']words = list(text)labels = ['O'] * len(words)json_d['id'] = idxjson_d['context'] = " ".join(words)json_d['tag'] = " ".join(labels)json_d['raw_context'] = "".join(words)idx += 1test_data.append(json_d)pbar = ProgressBar(n_total=len(test_data))results = []for step, line in enumerate(test_data):token_a = line['context'].split(" ")input_ids = [processor.vocab.to_index(w) for w in token_a]input_mask = [1] * len(token_a)input_lens = [len(token_a)]model.eval()with torch.no_grad():input_ids = torch.tensor([input_ids], dtype=torch.long)input_mask = torch.tensor([input_mask], dtype=torch.long)input_lens = torch.tensor([input_lens], dtype=torch.long)input_ids = input_ids.to(args.device)input_mask = input_mask.to(args.device)features = model.forward_loss(input_ids, input_mask, input_lens, input_tags=None)tags, _ = model.crf._obtain_labels(features, args.id2label, input_lens)label_entities = get_entities(tags[0], args.id2label)json_d = {}json_d['id'] = stepjson_d['tag_seq'] = " ".join(tags[0])json_d['entities'] = label_entitiesresults.append(json_d)pbar(step=step)print(" ")output_predic_file = str(args.output_dir / "test_prediction.json")output_submit_file = str(args.output_dir / "test_submit.json")with open(output_predic_file, "w") as writer:for record in results:writer.write(json.dumps(record) + '\n')test_text = []with open(str(args.data_dir / 'test.json'), 'r') as fr:for line in fr:test_text.append(json.loads(line))test_submit = []for x, y in zip(test_text, results):json_d = {}json_d['id'] = x['id']json_d['label'] = {}entities = y['entities']words = list(x['text'])if len(entities) != 0:for subject in entities:tag = subject[0]start = subject[1]end = subject[2]word = "".join(words[start:end + 1])if tag in json_d['label']:if word in json_d['label'][tag]:json_d['label'][tag][word].append([start, end])else:json_d['label'][tag][word] = [[start, end]]else:json_d['label'][tag] = {}json_d['label'][tag][word] = [[start, end]]test_submit.append(json_d)json_to_text(output_submit_file, test_submit)def load_and_cache_examples(args,processor, data_type='train'):# Load data features from cache or dataset filecached_examples_file = args.data_dir / 'cached_crf-{}_{}_{}'.format(data_type,args.arch,str(args.task_name))if cached_examples_file.exists():logger.info("Loading features from cached file %s", cached_examples_file)examples = torch.load(cached_examples_file)else:logger.info("Creating features from dataset file at %s", args.data_dir)if data_type == 'train':examples = processor.get_train_examples()elif data_type == 'dev':examples = processor.get_dev_examples()logger.info("Saving features into cached file %s", cached_examples_file)torch.save(examples, str(cached_examples_file))return examplesdef main():parser = argparse.ArgumentParser()# Required parametersparser.add_argument("--do_train", default=False, action='store_true')parser.add_argument('--do_eval', default=False, action='store_true')parser.add_argument("--do_predict", default=False, action='store_true')parser.add_argument('--markup', default='bios', type=str, choices=['bios', 'bio'])parser.add_argument("--arch",default='bilstm_crf',type=str)parser.add_argument('--learning_rate',default=0.001,type=float)parser.add_argument('--seed',default=1234,type=int)parser.add_argument('--gpu',default='0',type=str)parser.add_argument('--epochs',default=50,type=int)parser.add_argument('--batch_size',default=32,type=int)parser.add_argument('--embedding_size',default=128,type=int)parser.add_argument('--hidden_size',default=384,type=int)parser.add_argument("--grad_norm", default=5.0, type=float, help="Max gradient norm.")parser.add_argument("--task_name", type=str, default='ner')args = parser.parse_args()args.data_dir = config.data_dirif not config.output_dir.exists():args.output_dir.mkdir()args.output_dir = config.output_dir / '{}'.format(args.arch)if not args.output_dir.exists():args.output_dir.mkdir()init_logger(log_file=str(args.output_dir / '{}-{}.log'.format(args.arch, args.task_name)))seed_everything(args.seed)if args.gpu!='':args.device = torch.device(f"cuda:{args.gpu}")else:args.device = torch.device("cpu")args.id2label = {i: label for i, label in enumerate(config.label2id)}args.label2id = config.label2idprocessor = CluenerProcessor(data_dir=config.data_dir)processor.get_vocab()model = NERModel(vocab_size=len(processor.vocab), embedding_size=args.embedding_size,hidden_size=args.hidden_size,device=args.device,label2id=args.label2id)model.to(args.device)if args.do_train:train(args,model,processor)if args.do_eval:model_path = args.output_dir / 'best-model.bin'model = load_model(model, model_path=str(model_path))evaluate(args,model,processor)if args.do_predict:predict(args,model,processor)if __name__ == "__main__":main()

運(yùn)行

1.運(yùn)行下列命令,進(jìn)行模型訓(xùn)練:

python run_lstm_crf.py --do_train

電腦經(jīng)過四個(gè)小時(shí)的奮戰(zhàn),得到的結(jié)果為:


可以看出經(jīng)過50個(gè)epoch之后,
eval_f1 達(dá)到了 0.7234823215476984
下面是各個(gè)領(lǐng)域的評(píng)估結(jié)果:

  • name - Acc: 0.7734 - Recall: 0.7634 - F1: 0.7684
  • address - Acc: 0.542 - Recall: 0.5013 - F1: 0.5209
  • movie - Acc: 0.7447 - Recall: 0.6954 - F1: 0.7192
  • position - Acc: 0.787 - Recall: 0.7252 - F1: 0.7548
  • organization - Acc: 0.8058 - Recall: 0.7575 - F1: 0.7809
  • company - Acc: 0.7688 - Recall: 0.7302 - F1: 0.749
  • scene - Acc: 0.6568 - Recall: 0.5311 - F1: 0.5873
  • government - Acc: 0.7378 - Recall: 0.7976 - F1: 0.7665
  • book - Acc: 0.7984 - Recall: 0.6688 - F1: 0.7279
  • game - Acc: 0.7814 - Recall: 0.8237 - F1: 0.802
  • 運(yùn)行下列命令,進(jìn)行模型預(yù)測(cè)
  • python run_lstm_crf.py --do_predict

    以前五條數(shù)據(jù)為例:

    {“id”: 0, “text”: “四川敦煌學(xué)”。近年來,丹棱縣等地一些不知名的石窟迎來了海內(nèi)外的游客,他們隨身攜帶著胡文和的著作。”}
    {“id”: 1, “text”: “尼日利亞海軍發(fā)言人當(dāng)天在阿布賈向尼日利亞通訊社證實(shí)了這一消息?!眪
    {“id”: 2, “text”: “銷售冠軍:輻射3-Bethesda”}
    {“id”: 3, “text”: “所以大多數(shù)人都是從巴厘島南部開始環(huán)島之旅?!眪
    {“id”: 4, “text”: “備受矚目的動(dòng)作及冒險(xiǎn)類大作《迷失》在其英文版上市之初就受到了全球玩家的大力追捧。”}
    {“id”: 5, “text”: “filippagowski:14歲時(shí)我感覺自己像梵高”}

    提取到的實(shí)體

    {“id”: 0, “l(fā)abel”: {“address”: {“四川敦煌”: [[0, 3]], “丹棱縣”: [[11, 13]]}, “name”: {“胡文和”: [[41, 43]]}}}
    {“id”: 1, “l(fā)abel”: {“government”: {“尼日利亞海軍”: [[0, 5]]}, “position”: {“發(fā)言人”: [[6, 8]]}, “organization”: {“阿布賈”: [[12, 14]]}, “company”: {“尼日利亞通訊社”: [[16, 22]]}}}
    {“id”: 2, “l(fā)abel”: {}}
    {“id”: 3, “l(fā)abel”: {“scene”: {“巴厘島”: [[9, 11]]}}}
    {“id”: 4, “l(fā)abel”: {“game”: {"《迷失》": [[13, 16]]}}}
    {“id”: 5, “l(fā)abel”: {“name”: {“filippagowski”: [[0, 12]], “梵高”: [[24, 25]]}}}

    對(duì)整句話進(jìn)行序列標(biāo)注

    {“id”: 0, “tag_seq”: “B-address I-address I-address I-address O O O O O O O B-address I-address I-address O O O O O O O O O O O O O O O O O O O O O O O O O O O B-name I-name I-name O O O O”, “entities”: [[“address”, 0, 3], [“address”, 11, 13], [“name”, 41, 43]]}
    {“id”: 1, “tag_seq”: “B-government I-government I-government I-government I-government I-government B-position I-position I-position O O O B-organization I-organization I-organization O B-company I-company I-company I-company I-company I-company I-company O O O O O O O O”, “entities”: [[“government”, 0, 5], [“position”, 6, 8], [“organization”, 12, 14], [“company”, 16, 22]]}
    {“id”: 2, “tag_seq”: “O O O O O O O O O O O O O O O O O”, “entities”: []}
    {“id”: 3, “tag_seq”: “O O O O O O O O O B-scene I-scene I-scene O O O O O O O O O”, “entities”: [[“scene”, 9, 11]]}
    {“id”: 4, “tag_seq”: “O O O O O O O O O O O O O B-game I-game I-game I-game O O O O O O O O O O O O O O O O O O O O O O O”, “entities”: [[“game”, 13, 16]]}
    {“id”: 5, “tag_seq”: “B-name I-name I-name I-name I-name I-name I-name I-name I-name I-name I-name I-name I-name O O O O O O O O O O O B-name I-name”, “entities”: [[“name”, 0, 12], [“name”, 24, 25]]}

    可以看出識(shí)別效果還算不錯(cuò)!

    參考

    CLUENER2020:中文細(xì)粒度命名實(shí)體識(shí)別數(shù)據(jù)集來了

    https://github.com/CLUEbenchmark/CLUENER2020

    總結(jié)

    以上是生活随笔為你收集整理的CLUENER 细粒度命名实体识别baseline:BiLSTM-CRF的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。