日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎么構建命名實體識別(NER)任務的標注數(shù)據(jù)

深度學習自然語言處理 ? 來源:PaperWeekly ? 作者:康洪雨 ? 2022-07-26 14:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

最近一段時間在做商品理解的工作,主要內容是從商品標題里識別出商品的一些屬性標簽,包括不限于品牌、顏色、領型、適用人群、尺碼等等。這類任務可以抽象成命名實體識別(Named Entity Recognition, NER)工作,一般用序列標注(Sequence Tagging)的方式來做,是比較成熟的方向。

10da4dea-0ca5-11ed-ba43-dac502259ad0.png

▲ 商品理解示例,品牌:佳豐;口味:蒜香味

本文主要記錄下做這個任務上遇到的問題,踩的坑,模型的效果等。

主要內容:

  1. 怎么構建命名實體識別(NER)任務的標注數(shù)據(jù)
  2. BertCRF 訓練單標簽識別過程及踩坑

  3. BertCRF 訓練超多標簽識別過程及踩坑
  4. CascadeBertCRF 訓練超多標簽識別過程及踩坑

NER任務標注數(shù)據(jù)方法

其實對 NER 任務來說,怎么獲取標注數(shù)據(jù)是比較重要、比較耗時費力的工作。針對商品理解任務來說,想要獲取大量的標注數(shù)據(jù)一般可以分為 3 種途徑:

  1. 花錢外包,靠外包人肉打標,羨慕有錢的公司。

  2. 抓取其他平臺的數(shù)據(jù),這塊也可以分成兩種情況,第一種是既抓標題又抓標簽-標簽值,比如 標題:珍味來(zhenweilai)小黃魚(燒烤味),品牌:珍味來(zhenweilai),口味:燒烤味,得到的數(shù)據(jù)直接可以訓練模型了;第二種是只抓 標簽-標簽值,把所有類目下所有常見的標簽抓下來,不抓標題,然通過一些手段把標簽掛到自己平臺的標題上,構造訓練數(shù)據(jù);第一種抓取得數(shù)據(jù)準,但很難找到資源給抓,即使找到了也非常容易被風控;第二種因為請求量小,好抓一點,但掛標簽這一步的準確度會影響后面模型的效果。

  3. 用自己平臺的商品標題去請求一些開放 NER 的 api,比如阿里云、騰訊云、百度 ai 等,有些平臺的 api 是免費的,有些 api 每天可以調用一定次數(shù),可以白嫖,對于電商領域,阿里云的 NER 效果比其他家好一些。

BertCRF單標簽NER模型

這部分主要記錄 BertCRF 在做單一標簽(品牌)識別任務時踩的一些坑。

先把踩的坑列一下:

  1. 怎么輕量化構建 NER 標注數(shù)據(jù)集。

  2. bert tokenizer 標題轉 id 時,品牌值的 start idx、end idx 和原始的對不上,巨坑。

  3. 單一標簽很容易過擬合,會把不帶品牌的標題里識別出一些品牌,識別出來的品牌也不對。

2.1 輕量化構建標注數(shù)據(jù)集

上面講到構建 NER 標注數(shù)據(jù)的常見 3 種方法,先把第一種就排除,因為沒錢打標;對于第三種,我嘗試了福報廠的 NER api,分基礎版 和 高級版,但評估下來發(fā)現(xiàn)不是那么準確,召回率沒有達到要求,也排除了;

那就剩第二種方案了,首先嘗試了第二種里的第一種情況,既抓標題又抓標簽,很快發(fā)現(xiàn)就被風控了,不管用自己寫的腳本還是公司的采集平臺,都繞不過風控,便放棄了;所以就只抓標簽-標簽值,后面再用規(guī)則的方法掛到商品標題上。

只抓標簽和標簽值相當于構建類目下標簽知識庫了,有了類目限定之后,通過規(guī)則掛靠在商品標題上時,會提高掛靠的準確率。比如“夏季清涼短款連衣裙”,其中包含標簽“裙長”:“短款”,如果不做類目限定,就會用規(guī)則掛出多個標簽“衣長”:“短款”,“褲長”:“短款”,“裙長”:“短款”等等,類目限制就可以把一些非此類目的標簽排除掉。

通過規(guī)則掛靠出的數(shù)據(jù)也會存在一些 bad case,盡管做了類目限制,但也有一定的標錯樣本;組內其他同學在做大規(guī)模對比學習模型,于是用規(guī)則掛靠出的結果標題——標簽:標簽值走一遍對比學習模型,把標題向量和標簽值向量相似得分高的樣本留下當做優(yōu)質標注數(shù)據(jù)。

113cb4d0-0ca5-11ed-ba43-dac502259ad0.png

▲ 輕量化構建NER標注數(shù)據(jù)

通過以上步驟,不需要花費很多人力,自己一人就可以完成整個流程,減少了很多人工標注、驗證的工作;得到的數(shù)據(jù)也足夠優(yōu)質。

2.2 正確打標label index

NER 任務和文本分類任務很像,文本分類任務是句子或整篇粒度,NER 是 token 或者 word 粒度的文本分類。

所以 NER 任務的訓練數(shù)據(jù)和文本分類任務相似,但有一點點不同。對于文本分類任務,一整個標題有 1 個 label。

114a8e2a-0ca5-11ed-ba43-dac502259ad0.png

▲ 文本分類任務token和label對應關系

對于 NER 任務,一整個標題有一串 label,每個 tokend 都有一個 label。在做品牌識別時,設定 label 有 3 種取值。

"UNK":0," B_brand":1,"I_brand":2,其中 B_brand 代表品牌的起始位置,I_brand 代表品牌的中間位置。

1158ac6c-0ca5-11ed-ba43-dac502259ad0.png

▲品牌NER任務token和label對應關系

搞清了 NER 任務的 label 形式之后,接下來就是怎么正確的給每個樣本打上 label,一般先聲明個和 title 長度一樣的全 0 列表,遍歷,把相應位置置 1 或者 2 就可以得到樣本 label,下面是一個基礎的例子

a={
"title":"潘頓特級初榨橄欖油",
"att_name":"品牌",
"att_value":"潘頓",
"start_idx":0,
"end_idx":2
}
defset_label(text):
title=text['title']
label=[0]*len(title)
foridxinrange(text['start_idx'],text['end_idx']):
ifidx==text['start_idx']:
label[idx]=1
else:
label[idx]=2
returnlabel
text_label=set_label(a)
print(text_label)

但這里需要把 title 進行 tokenizer id 化,bert tokenizer 之后的 id 長度可能會和原來的標題長度不一致,包含有些英文會拆成詞綴,空格也會被丟棄,導致原始的 start_idx 和 end_idx 發(fā)生偏移,label 就不對了。

這里先說結論:強烈建議使用 list(title)全拆分標題,再使用 tokenizer.convert_tokens_to_ids 的方式 id 化!??!

剛開始沒有使用上面那種方式,用的是 tokenizer(title)進行 id 化再計算偏移量,重新對齊 label,踩了 2 個坑

  1. tokenizer 拆分英文變成詞綴,start index 和 end index 會發(fā)生偏移,盡管有offset_mapping 可以記錄偏移的對應關系,但真正回退偏移時還會遇到問題;

  2. 使用 tokenizer(title)的方式,預測的時候會遇到沒法把 id 變成 token;比如下面這個例子,
fromtransformersimportAutoTokenizer
tokenizer=AutoTokenizer.from_pretrained('../bert_pretrain_model')
input_id=tokenizer('呫頓')['input_ids']
token=[tokenizer.convert_ids_to_tokens(w)forwininput_id[1:-1]]
#['[UNK]','頓']

因為“呫”是生僻字,使用 convert_ids_to_tokens 是沒法知道原始文字是啥的,有人可能會說,預測出 index 之后,直接去標題里拿字不就行了,不用 convert_ids_to_tokens;上面說過,預測出來的 index 和原始標題的文字存在 offset,這樣流程就變成

1182f120-0ca5-11ed-ba43-dac502259ad0.png

▲ 使用tokenizer id化label對應關系

所以,還是強烈建議使用 list(title)全拆分標題,再使用 tokenizer.convert_tokens_to_ids 的方式 id 化?。?!

這樣就不存在偏移的問題,start idx 和 end idx 不會變化,預測的時候不需要使用 convert_ids_to_tokens,直接用 index 去列表里 token list 取字

正確打標 label 非常重要,不然訓練的模型就會很詭異。建議在代碼里加上校驗語句,不管使用哪種方法,有考慮不全的地方,就會報錯

assertattribute_value==title[text['start_idx']:text['end_idx']]

2.3 BertCRF模型結構

Pytorch 寫 BertCRF 很簡單,可能會遇到 CRF 包安裝問題,可以不安裝,直接把 crf.py 文件拷貝到項目里引用。

classBertCRF(nn.Module):
def__init__(self,num_labels):
super(BertCRF,self).__init__()
self.config=BertConfig.from_pretrained('../xxx/config.json')
self.bert=BertModel.from_pretrained('../xxx')
self.dropout=nn.Dropout(self.config.hidden_dropout_prob)
self.classifier=nn.Linear(self.config.hidden_size,num_labels)
self.crf=CRF(num_tags=num_labels,batch_first=True)
defforward(
self,
input_ids=None,
attention_mask=None,
token_type_ids=None,
labels=None,
):
outputs=self.bert(
input_ids,
attention_mask=attention_mask,
token_type_ids=token_type_ids,
)
sequence_output=outputs[0]
sequence_output=self.dropout(sequence_output)
logits=self.classifier(sequence_output)
outputs=(logits,)
iflabelsisnotNone:
loss=self.crf(emissions=logits,tags=labels,mask=attention_mask)
outputs=(-1*loss,logits)
returnoutputs

2.4 緩解過擬合問題

只做一個標簽(品牌)識別時,訓練集是 標題-品牌值 pair 對,每個樣本都有品牌值。由于品牌長尾現(xiàn)象嚴重,這里對熱門品牌的數(shù)據(jù)進行了采樣,1 個品牌最少包含 100 個標題,最多包含 300 個標題,數(shù)據(jù)分布如下

118eedf4-0ca5-11ed-ba43-dac502259ad0.png

模型關鍵參數(shù)

max_seq_length=50
train_batch_size=256
epochs=3
learning_rate=1e-5
crf_learning_rate=5e-5

第一版模型訓練之后,驗證集 F1 0.98,通過分析驗證數(shù)據(jù)的 bad case,發(fā)現(xiàn)模型對包含品牌的標題預測效果還不錯,但是對不包含品牌的標題,幾乎全軍覆沒,都會抽出 1、2 個字出來,模型過擬合了。而且抽出的字一般都是標題前 1、2 個字,這與商品品牌一般都在標題前面有關。

針對過擬合問題及表現(xiàn)的現(xiàn)象,嘗試了 2 種方法:

  1. 既然對沒有品牌的標題一般都抽出前 1、2 個字,那在訓練的時候把品牌從前面隨機插入到標題中間、尾部等位置,是不是可以緩解。

  2. 構建訓練集的時候加入一些負樣本,負樣本里 label 都是 0,不包含品牌,正負樣本比 1:1。

法 1 訓練之后,沒有解決問題,而且過擬合問題更加嚴重了

法 2 訓練之后,過擬合問題解決了,增加了近 1 倍樣本,訓練時間翻倍。

BertCRF 模型訓練完之后,通過分析 bad case,會發(fā)現(xiàn)有的數(shù)據(jù)模型預測是對的,標注時標錯了,模型有一定的糾錯能力,transformer 強??!

美國新安怡(fsoothielp)安撫奶嘴。標注品牌:”soothie“;預測品牌:“新安怡(fsoothielp)”

美羚富奶羊羊羊粉 2 段。標注品牌:“羊羊羊”,預測品牌:“美羚”

針對 BertCRF 在 Finetune 時有 2 種方式,一種是 linear probe,只訓練 CRF 和線性層,凍結 Bert 預訓練參數(shù),這種方式訓練飛快;另一種是不凍結 Bert 參數(shù),模型所有參數(shù)都更新,訓練很慢。

一般在 Bert 接下游任務時,我都會選擇第二種全部訓練的方式,不凍結參數(shù),雖然訓練慢,但擬合能力強;尤其是用 bert-base 這類預訓練模型時,這些模型在電商領域直接適配并不會很好,更新 bert 預訓練參數(shù),能讓模型向電商標題領域進行遷移。

BertCRF多標簽NER模型

這部分主要記錄 BertCRF 訓練超多標簽識別時,遇到的問題,模型的效果等。

先把踩的坑列一下:

  1. 爆內存問題,因為要訓練多標簽,所以訓練數(shù)據(jù)很多,千萬級別,dataloader 過程中內存不夠。

  2. 爆顯存問題,CRF 的坑,下面會細說。

  3. 訓練完的模型,預測時召回能力不強,準確率夠用。

多標簽和單標簽時,模型的結構不變,和上面的代碼一模一樣。

3.1 爆內存問題

和單標簽一樣,也對每個標簽值進行了采樣,減少標簽值的長尾分布現(xiàn)象。1 個標簽值最少包含 100 個標題,最多包含 300 個標題。數(shù)據(jù)分布如下

11c8cb3c-0ca5-11ed-ba43-dac502259ad0.png

一個標簽有多個標簽值,比如“顏色”:“紅”,“黃”,“綠”,...等。一個標簽有 2 個 label 值,B 代表起始位置,I 代表終止位置,所以整體有 1212 + 1 個類別,1 代表 UNK。

單類別負采樣后訓練數(shù)據(jù)總共 200w 左右,多類別時沒負采樣訓練數(shù)據(jù) 900 多 w,數(shù)據(jù)量多了 4 倍,原有的 dataset 沒有優(yōu)化內存,到多標簽這里就爆內存了。

把特征處理的模塊從__init__里轉移到__getitem__函數(shù)里,這樣就可以減少很多內存使用了

舊版本的 dataset 函數(shù)

classMyDataset(Dataset):
def__init__(self,text_list,tokenizer,max_seq_len):
self.input_ids=[]
self.token_type_ids=[]
self.attention_mask=[]
self.labels=[]
self.input_lens=[]
self.len=len(text_list)
fortextintqdm(text_list):
input_ids,input_mask,token_type_ids,input_len,label_ids=feature_process(text,tokenizer,max_seq_len)
self.input_ids.append(input_ids)
self.token_type_ids.append(token_type_ids)
self.attention_mask.append(input_mask)
self.labels.append(label_ids)
self.input_lens.append(input_len)
def__getitem__(self,index):
tmp_input_ids=torch.tensor(self.input_ids[index]).to(device)
tmp_token_type_ids=torch.tensor(self.token_type_ids[index]).to(device)
tmp_attention_mask=torch.tensor(self.attention_mask[index]).to(device)
tmp_labels=torch.tensor(self.labels[index]).to(device)
tmp_input_lens=torch.tensor(self.input_lens[index]).to(device)
returntmp_input_ids,tmp_attention_mask,tmp_token_type_ids,tmp_input_lens,tmp_labels
def__len__(self):
returnself.len

新版本的 dataset 函數(shù)

classMyDataset(Dataset):
def__init__(self,text_list,tokenizer,max_seq_len):
self.text_list=text_list
self.len=len(text_list)
self.tokenizer=tokenizer
self.max_seq_len=max_seq_len
def__getitem__(self,index):
raw_text=self.text_list[index]
input_ids,input_mask,token_type_ids,input_len,label_ids=feature_process(raw_text,
self.tokenizer,
self.max_seq_len)
tmp_input_ids=torch.tensor(input_ids).to(device)
tmp_token_type_ids=torch.tensor(token_type_ids).to(device)
tmp_attention_mask=torch.tensor(input_mask).to(device)
tmp_labels=torch.tensor(label_ids).to(device)
tmp_input_lens=torch.tensor(input_len).to(device)
returntmp_input_ids,tmp_attention_mask,tmp_token_type_ids,tmp_input_lens,tmp_labels
def__len__(self):
returnself.len

可以看到新版本比舊版本減少了 5 個超大的 list,爆內存的問題就解決了,雖然這塊會有一定的速度損失。

3.2 爆顯存問題

當標簽個數(shù)少時,BertCRF 模型最大 tensor 是 bert 的 input,包含 input_ids,attention_mask,token_type_ids三個tensor,維度是(batch size,sequence length,hidden_size=768),對于商品標題數(shù)據(jù) sequence length=50,顯存占用大小取決于 batch size,僅做品牌識別,16G 顯存 batch size=300,32G 顯存 batch size=700。

但當標簽個數(shù)多時,BertCRF 模型最大 tensor 來自 CRF 這貨了,這貨具體原理不展開,后面會單獨寫一期,只講下這貨代碼里的超大 tensor。

CRF 在做 forward 時,函數(shù)_compute_normalizer 里的 next_score shape 是(batch_size, num_tags, num_tags),當做多標簽時,num_tags=1212,(batch_size, 1212, 1212)>>(batch_size, 50, 768),這個 tensor 遠遠大于 bert 的輸入了,多標簽時,16G 顯存 batch size=32,32G 顯存 batch size=80

#shape:(batch_size,num_tags,num_tags)
next_score=broadcast_score+self.transitions+broadcast_emissions

排查到爆顯存的原因之后,也沒找到好的優(yōu)化辦法,CRF 這貨在多標簽時太慢了,又占顯存。

3.3 模型效果

經過近 4 天的顯卡火力全開之后,1k+ 類別的模型訓練完成了。使用測試數(shù)據(jù)對模型進行驗證,得到 3 個結論

  1. 模型沒有過擬合,盡管訓練數(shù)據(jù)沒有負樣本

  2. 模型預測準確率高,但召回能力不強

  3. 模型對單標簽樣本預測效果好,多標簽樣本預測不全,僅能預測 1~2 個,和 2 類似

先說一下模型為什么沒有出現(xiàn)單標簽時的過擬合問題,因為在近 1k 個標簽模型訓練時,學習難度直接上去了,模型不會很快的收斂,單標簽時任務過于簡單,容易出現(xiàn)過擬合。

驗證模型效果時,先定義怎么算正確:假設一個標題包含 3 個標簽,預測時要把這 3 個標簽都識別出來,并且標簽值也要對的上,才算正確;怎么算錯誤:識別的標簽個數(shù)少于真實的標簽個數(shù),識別的標簽值和真實的對不上都算錯誤。

使用 105w 驗證數(shù)據(jù),整體準確率 803388/1049268=76.5%,如果把預測不全,但預測對的樣本也算進來的話,準確率(803388+76589)/1049268=83.9%。

對 bad case 進行分析,模型對于 1 個標題中含有多個標簽時,識別效果不好,表現(xiàn)現(xiàn)象是識別不全,一般只識別出 1 個標簽,統(tǒng)計驗證數(shù)據(jù)里標簽個數(shù)和樣本個數(shù)的關系,這個指標算是標簽個數(shù)維度的召回率

多標簽樣本是指一個標題中包含多個標簽,比如下面這個商品包含 5 個標簽。


標題:“吊帶潮流優(yōu)雅純色氣質收腰高腰五分袖喇叭袖連體褲 2018 年夏季”。


標簽:袖長:五分袖;上市時間:2018年夏季;風格:優(yōu)雅;圖案:純色;腰型:高腰。

11f1a5ca-0ca5-11ed-ba43-dac502259ad0.png

可以看到對于標簽數(shù)越多的標題,模型的識別效果越不好,然后我分析了訓練數(shù)據(jù)的標簽個數(shù)個樣本數(shù)的關系,可以看到在訓練數(shù)據(jù)里,近 90% 的樣本僅只有一個標簽,模型對多標簽識別效果不好主要和這個有關系。

所以在構建數(shù)據(jù)集時,可以平衡一下樣本數(shù),多加一些多標簽的樣本到訓練集,這樣對多標簽樣本的適配能力也會增強。

但多標簽樣本本身收集起來會遇到困難,于是我又發(fā)現(xiàn)了一個新的騷操作

沒法獲得更多的多標簽樣本提升模型的召回能力咋辦呢?模型不是對單標簽樣本很牛 b 嘛,那在預測的時候,每次如果有標簽提取出來,就從標題里把已經預測出的標簽值刪掉,繼續(xù)預測,循環(huán)預測,直到預測是空終止。

第一次預測

input title:吊帶潮流優(yōu)雅純色氣質收腰高腰五分袖喇叭袖連體褲2018年夏季
predict label:袖長:五分袖

把五分袖從標題里刪除,進行第二次預測

input title:吊帶潮流優(yōu)雅純色氣質收腰高腰喇叭袖連體褲2018年夏季
predict label:上市時間:2018年夏季

把2018年夏季從標題里刪除,進行第三次預測

input title:吊帶潮流優(yōu)雅純色氣質收腰高腰喇叭袖連體褲
predict label:風格:優(yōu)雅

把優(yōu)雅從標題里刪除,進行第四次預測

input title:吊帶潮流純色氣質收腰高腰喇叭袖連體褲
predict label:圖案:純色

把純色從標題里刪除,進行第五次預測

吊帶潮流氣質收腰高腰喇叭袖連體褲
predict label:腰型:高腰

把高腰從標題里刪除,進行第六次預測

input title:吊帶潮流氣質收腰喇叭袖連體褲
predict label:預測為空

可以看到,標簽被一個接一個的準確預測出,這種循環(huán)預測是比較耗時的,離線可以,在線吃不消;能找到更多 多標簽數(shù)據(jù)補充到訓練集里是正確的方向。

多標簽 CRF 爆顯存,只能設定小 batch size 慢慢跑的問題不能解決嘛?當然可以,卷友們提出了一種多任務學習的方法,CRF 只學習 token 是不是標簽實體,通過另一個任務區(qū)分 token 屬于哪個標簽類別。

CascadeBertCRF多標簽模型

4.1 模型結構

在標簽數(shù)目過多時,BertCRF 由于 CRF 這貨的問題,導致模型很耗顯存,訓練也很慢,這種方式不太科學,也會影響效果。

從標簽過多這個角度出發(fā),卷友們提出把 NER 任務拆分成多任務學習,一個任務負責識別 token 是不是實體,另一個任務判斷實體屬于哪個類別。

這樣 NER 任務的 lable 字典就只有"B"、"I"、"UNK"三個值了,速度嗖嗖的;而判斷實體屬于哪個類別用線性層就可,速度也很快,模型顯存占用很少。

1220e808-0ca5-11ed-ba43-dac502259ad0.png

▲ 左單任務NER模型;右多任務NER模型

Cascade 的意思是級聯(lián)。就是把 BERT 的 token 向量過一遍 CRF 之后,再過一遍 Dense 層分類。但這里面有一些細節(jié)。

訓練時,BERT 的 tokenx 向量過一遍 Dense 層分類,但不是所有 token 都計算 loss,是把 CRF 預測是實體的 token 拿出來算 loss,CRF 預測不是實體的不計算 loss,一個實體有多個 token,每個 token 都計算 loss;預測時,把實體的每個 token 分類結果拿出來,設計了三種類別獲取方式。

比如“蒜香味”在模型的 CRF 分支預測出是實體,標簽對應 "B"、"I"、"I";接下要解析這個實體屬于哪個類別,在 Dense 分支預測的結果可能會有四種

  1. “蒜香味”對應的 Dense 結果是 “unk”、“unk”、“unk”,沒識別出實體類別

  2. “蒜香味”對應的 Dense 結果是 “口味”、“口味”、“口味”,每個 token 都對

  3. “蒜香味”對應的 Dense 結果是 “unk”、"口味"、"口味",有的 token 對,有的token 沒識別出

  4. “蒜香味”對應的 Dense 結果是 “unk”、“品牌”、“口味”,有的 token 對了,有的 token 沒識別出,有的 token 錯了

針對上面 4 中結果,可以看到 4、3、2 越來越嚴謹。在評估模型效果時,采用 2 是最嚴的,就是預測的 CRF 結果要對,Dense 結果中每個 token 都要對,才算完全正確;3 和 4 越來越寬松。

4.2 模型代碼

importtorch
fromcrfimportCRF
fromtorchimportnn
fromtorch.nnimportCrossEntropyLoss
fromtransformersimportBertModel,BertConfig
classCascadeBertCRF(nn.Module):
def__init__(self,bio_num_labels,att_num_labels):
super(CascadeBertCRF,self).__init__()
self.config=BertConfig.from_pretrained('../bert_pretrain_model/config.json')
self.bert=BertModel.from_pretrained('../bert_pretrain_model')
self.dropout=nn.Dropout(self.config.hidden_dropout_prob)
self.bio_classifier=nn.Linear(self.config.hidden_size,bio_num_labels)#crf預測字是不是標簽
self.att_classifier=nn.Linear(self.config.hidden_size,att_num_labels)#預測標簽屬于哪個類別
self.crf=CRF(num_tags=bio_num_labels,batch_first=True)
defforward(
self,
input_ids=None,
attention_mask=None,
token_type_ids=None,
bio_labels=None,
att_labels=None,
):
outputs=self.bert(
input_ids,
attention_mask=attention_mask,
token_type_ids=token_type_ids,
)
sequence_output=outputs[0]
sequence_output=self.dropout(sequence_output)
bio_logits=self.bio_classifier(sequence_output)#(batchsize,sequencelength,bio_num_labels)
num_bio=bio_logits.shape[-1]
reshape_bio_logits=bio_logits.view(-1,num_bio)#(batchsize*sequencelength,bio_num_labels)
pred_bio=torch.argmax(reshape_bio_logits,dim=1)#ner預測的bio結果
no_zero_pred_bio_index=torch.nonzero(pred_bio)#取出ner結果非0的token
att_logits=self.att_classifier(sequence_output)#(batchsize,sequencelength,att_num_labels)
num_att=att_logits.shape[-1]#att_num_labels
att_logits=att_logits.view(-1,num_att)#(batchsize*sequencelength,att_num_labels)
outputs=(bio_logits,att_logits)
ifbio_labelsisnotNoneandatt_labelsisnotNone:
select_att_logits=torch.index_select(att_logits,0,no_zero_pred_bio_index.view(-1))
select_att_labels=torch.index_select(att_labels.contiguous().view(-1),0,no_zero_pred_bio_index.view(-1))
loss_fct=CrossEntropyLoss()
select_att_loss=loss_fct(select_att_logits,select_att_labels)
bio_loss=self.crf(emissions=bio_logits,tags=bio_labels,mask=attention_mask)
loss=-1*bio_loss+select_att_loss
outputs=(loss,-1*bio_loss,bio_logits,select_att_loss,att_logits)
returnoutputs

4.3 模型效果

上面提到評估 Dense 的結果會遇到 4 種情況,使用第 4 種方式進行指標評估;NER 的識別效果和上面一致。

使用 105w 驗證數(shù)據(jù),整體準確率 792386/1049268=75.5%,比 BertCRF 低 1 個點;把預測不全,但預測對的樣本也算進來的話,準確率(147297+792386)/1049268=89.6%,比 BertCRF 高 5 個點;

標簽個數(shù)和預測標簽個數(shù)的對照關系:

124b7078-0ca5-11ed-ba43-dac502259ad0.png

CascadeBertCRF 模型的召回率比 BertCRF 要低,但模型的準確率會高一些。CascadeBertCRF 相比 BertCRF,主要是提供了一種超多實體識別的訓練思路,且模型的效果沒有損失,訓練速度和推理速度有大幅提高。

把實體從標題里刪掉訓練預測的方法也同樣適用 CascadeBertCRF。


審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)集

    關注

    4

    文章

    1240

    瀏覽量

    26264
  • 標簽
    +關注

    關注

    0

    文章

    161

    瀏覽量

    18677

原文標題:NER | 商品標題屬性識別探索與實踐

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    自動駕駛占用網絡還需要數(shù)據(jù)標注嗎?

    能夠通過空間體素化的方式來感知世界,甚至可以識別那些從未見過的異形障礙物,那它是不是不再需要傳統(tǒng)意義上的數(shù)據(jù)標注了?事實上,占據(jù)網絡不僅沒有取消標注,反而將
    的頭像 發(fā)表于 04-17 08:53 ?424次閱讀
    自動駕駛占用網絡還需要<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>標注</b>嗎?

    大模型時代自動駕駛標注有什么特殊要求?

    在自動駕駛的發(fā)展歷程中,數(shù)據(jù)標注一直被視為算法進化的基石。然而,隨著大模型時代的到來,這一領域正經歷著重構。 過去,標注員的任務是簡單地在二維照片上畫框,標記出車輛和行人的位置。但現(xiàn)在
    的頭像 發(fā)表于 03-01 09:09 ?3198次閱讀
    大模型時代自動駕駛<b class='flag-5'>標注</b>有什么特殊要求?

    自動駕駛數(shù)據(jù)標注是所有信息都要標注嗎?

    [首發(fā)于智駕最前沿微信公眾號]數(shù)據(jù)標注對于自動駕駛來說,就像是老師教小朋友知識,數(shù)據(jù)標注可以讓車輛學習辨別道路交通信息的能力。攝像頭、雷達、激光雷達(LiDAR)拍下來的只是一堆原始信
    的頭像 發(fā)表于 12-04 09:05 ?1226次閱讀
    自動駕駛<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>標注</b>是所有信息都要<b class='flag-5'>標注</b>嗎?

    算法工程師不愿做標注工作,怎么辦?

    對于算法而言,圖像標注是一項關鍵性工作,越是大量的新數(shù)據(jù)標注,對于算法的性能提升越有幫助。但是圖像標注是一項極其費時費力的工作,特別是遇到稍微復雜的場景時,長時間的重復工作,會讓
    的頭像 發(fā)表于 12-02 17:56 ?717次閱讀
    算法工程師不愿做<b class='flag-5'>標注</b>工作,怎么辦?

    復旦微電子被列入實體清單(Footnote 4)后發(fā)布公開信 已構建可持續(xù)發(fā)展格局

    在美國時間的9月12日,美國商務部工業(yè)與安全局(BIS)再次無理制裁,將我國23 家實體列入實體清單。此次的23家中國實體包括有13家半導體企業(yè)、3家生物技術公司及多家科研院所;包括有復旦微電子等
    的頭像 發(fā)表于 09-15 11:28 ?3421次閱讀

    淺析多模態(tài)標注對大模型應用落地的重要性與標注實例

    ”的關鍵工序——多模態(tài)標注重要性日益凸顯。 一、什么是多模態(tài)標注? 多模態(tài)標注是指對文本、圖像、語音、視頻、點云等異構數(shù)據(jù)進行跨模態(tài)語義關聯(lián)的標注
    的頭像 發(fā)表于 09-05 13:49 ?2828次閱讀

    小語種OCR標注效率提升10+倍:PaddleOCR+ERNIE 4.5自動標注實戰(zhàn)解析

    摘要 :小語種OCR研發(fā)的核心瓶頸在于高質量標注數(shù)據(jù)的稀缺與高昂成本。本文介紹一種創(chuàng)新的自動化標注方案,利用 PaddleOCR 進行文本檢測與裁剪,并調用 ERNIE 4.5 大模型進行雙重預測
    的頭像 發(fā)表于 08-29 11:26 ?3889次閱讀
    小語種OCR<b class='flag-5'>標注</b>效率提升10+倍:PaddleOCR+ERNIE 4.5自動<b class='flag-5'>標注</b>實戰(zhàn)解析

    請問AICube所需的目標檢測數(shù)據(jù)標注可以使用什么工具?

    請問AICube所需的目標檢測數(shù)據(jù)標注可以使用什么工具? 我使用labelimg進行標注,標注后的數(shù)據(jù)集改好文件名后導入不進去。一直卡在
    發(fā)表于 08-11 08:07

    自動駕駛數(shù)據(jù)標注主要是標注什么?

    的結構化標簽。這些標簽不僅構成了模型訓練與評估的數(shù)據(jù)基礎,也直接影響系統(tǒng)在實際道路環(huán)境中的識別、理解和決策能力。準確、系統(tǒng)的數(shù)據(jù)標注能夠有效提升感知算法的魯棒性與泛化能力,因此
    的頭像 發(fā)表于 07-30 11:54 ?1685次閱讀
    自動駕駛<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>標注</b>主要是<b class='flag-5'>標注</b>什么?

    天津市智能數(shù)據(jù)標注產業(yè)基地揭牌

    近日,天津市智能數(shù)據(jù)標注產業(yè)基地揭牌儀式在天津市津南區(qū)華錄未來科技園成功舉辦。天津市數(shù)據(jù)局副局長周勝昔,天津市津南區(qū)副區(qū)長劉焱,易華錄黨委副書記、董事、總經理肖益,總裁特別顧問何曉楠出席。
    的頭像 發(fā)表于 07-23 11:29 ?1318次閱讀

    什么是自動駕駛數(shù)據(jù)標注?如何好做數(shù)據(jù)標注?

    [首發(fā)于智駕最前沿微信公眾號]在自動駕駛系統(tǒng)的開發(fā)過程中,數(shù)據(jù)標注是一項至關重要的工作。它不僅決定了模型訓練的質量,也直接影響了車輛感知、決策與控制的性能表現(xiàn)。隨著傳感器種類和數(shù)據(jù)量的劇增,有效
    的頭像 發(fā)表于 07-09 09:19 ?1712次閱讀
    什么是自動駕駛<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>標注</b>?如何好做<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>標注</b>?

    端到端數(shù)據(jù)標注方案在自動駕駛領域的應用優(yōu)勢

    10-20TB,其中需要標注數(shù)據(jù)占比超過60%。在這樣的背景下,端到端數(shù)據(jù)標注方案應運而生,正在重塑自動駕駛的數(shù)據(jù)生產范式。 端到端
    的頭像 發(fā)表于 06-23 17:27 ?1216次閱讀

    數(shù)據(jù)標注與大模型的雙向賦能:效率與性能的躍升

    ??在人工智能蓬勃發(fā)展的時代,大模型憑借其強大的學習與泛化能力,已成為眾多領域創(chuàng)新變革的核心驅動力。而數(shù)據(jù)標注作為大模型訓練的基石,為大模型性能提升注入關鍵動力,是模型不可或缺的“養(yǎng)料。大模型則憑借
    的頭像 發(fā)表于 06-04 17:15 ?2266次閱讀
    <b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>標注</b>與大模型的雙向賦能:效率與性能的躍升

    AI時代 圖像標注不要沒苦硬吃

    識別算法的性能提升依靠大量的圖像標注,傳統(tǒng)模式下,需要人工對同類型數(shù)據(jù)集進行一步步手動拉框,這個過程的痛苦只有做過的人才知道。越多素材的數(shù)據(jù)集對于算法的提升越有幫助,常規(guī)情況下,一個2
    的頭像 發(fā)表于 05-20 17:54 ?654次閱讀
    AI時代   圖像<b class='flag-5'>標注</b>不要沒苦硬吃

    東軟集團入選國家數(shù)據(jù)數(shù)據(jù)標注優(yōu)秀案例

    近日,東軟飛標醫(yī)學影像標注平臺在國家數(shù)據(jù)局發(fā)布數(shù)據(jù)標注優(yōu)秀案例集名單中排名第一(案例名稱“多模態(tài)醫(yī)學影像智能數(shù)據(jù)
    的頭像 發(fā)表于 05-09 14:37 ?1462次閱讀
    漠河县| 虹口区| 牡丹江市| 外汇| 大洼县| 措美县| 安徽省| 图木舒克市| 清苑县| 高州市| 固始县| 松原市| 临猗县| 阳东县| 靖边县| 五常市| 洛阳市| 西林县| 石屏县| 斗六市| 榆社县| 四平市| 邳州市| 乌拉特中旗| 将乐县| 尼玛县| 岳池县| 慈利县| 江山市| 庆元县| 太保市| 利辛县| 鄱阳县| 凤庆县| 新化县| 福贡县| 龙海市| 宝兴县| 岑巩县| 临沧市| 洞口县|