【NLP】使用BERT完成NLP任務(wù)
在日常生活中新聞具備有多的信息,在AINWIN互聯(lián)網(wǎng)輿情企業(yè)風(fēng)險(xiǎn)事件的識別和預(yù)警 比賽中參賽選手需要根據(jù)新聞識別主體和新聞類型。
比賽官網(wǎng)(報(bào)名即可下載數(shù)據(jù)集):http://ailab.aiwin.org.cn/competitions/48
比賽給定了的1w條左右的訓(xùn)練數(shù)據(jù),以及部分企業(yè)主體名稱的匯總。接下來我們看如何一步一步完成本場比賽的。
比賽思路
對比賽要求進(jìn)行分析后,可以將賽題任務(wù)具體劃分為:
任務(wù)1: 企業(yè)主體抽取:抽取出新聞中主要的企業(yè)名稱,并與完整的企業(yè)名稱進(jìn)行對應(yīng);(NER任務(wù))任務(wù)2: 新聞類型分類:根據(jù)新聞的內(nèi)容將新聞的類型進(jìn)行具體分類;(文本分類任務(wù))
完成思路:
將任務(wù)1和任務(wù)2,分開完成; 將任務(wù)1和任務(wù)2,一起用Bert建模;
任務(wù)1:使用TFIFD完成
對文本進(jìn)行分詞:
import jieba
def strcut(s):
seg_list = jieba.cut(s)
return ' '.join(list(seg_list))
train_title = train_data['NEWS_TITLE'].apply(strcut)
TFIDF + 線性模型:
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(ngram_range=(1,1))
train_title_ttidf = tfidf.fit_transform(train_title)
驗(yàn)證集分類精度約89%。
任務(wù)1:使用BERT分類
進(jìn)行token處理:
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
train_encoding = tokenizer(list(tr_x), truncation=True, padding=True, max_length=128)
val_encoding = tokenizer(list(val_x), truncation=True, padding=True, max_length=128)
讀取模型并定義優(yōu)化器:
import torch
from transformers import AutoModelForSequenceClassification, AdamW, get_linear_schedule_with_warmup
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)
optim = AdamW(model.parameters(), lr=5e-5)
total_steps = len(train_loader) * 1
任務(wù)2:使用正則匹配
通過公司主體與數(shù)據(jù)集中字符串匹配:
for row in train_data.iloc[:100].iterrows():
match1 = company_name[company_name['name'].apply(lambda x: x in row[1].NEWS_TITLE)]
if match1.shape[0] > 0:
match1.loc[:, 'name_len'] = match1['name'].apply(len)
match1 = match1.sort_values(by='name_len')
match1 = match1.iloc[-1]['name']
else:
match1 = ''
match2 = company_name[company_name['name_short'].apply(lambda x: x in row[1].NEWS_TITLE)]
if match2.shape[0] > 0 and match1 == '':
match2.loc[:, 'name_len'] = match2['name_short'].apply(len)
match2 = match2.sort_values(by='name_len')
match2 = match2.iloc[-1]['name']
else:
match2 = ''
識別結(jié)果:
標(biāo)題: 東陽光(600673.SH):控股股東一致行動人宜昌東陽光藥業(yè)質(zhì)押2500萬股
主體標(biāo)簽: 宜昌東陽光藥業(yè)股份有限公司
主體識別結(jié)果: 宜昌東陽光藥業(yè)股份有限公司
標(biāo)題: 千億市值蒸發(fā)超九成,康美藥業(yè)財(cái)務(wù)造假坑了誰?
主體標(biāo)簽: 康美藥業(yè)股份有限公司
主體識別結(jié)果: 康美藥業(yè)股份有限公司
任務(wù)2:BERT 序列標(biāo)注
加載BERT序列標(biāo)注模型:
import torch
from transformers import BertForTokenClassification, AdamW, get_linear_schedule_with_warmup
model = BertForTokenClassification.from_pretrained('bert-base-chinese', num_labels=7)
device = torch.device("cuda:1" if torch.cuda.is_available() else "cpu")
model.to(device)
識別結(jié)果:
標(biāo)題:山東省政府辦公廳就平邑縣玉榮商貿(mào)有限公司石膏礦坍塌事故發(fā)出通報(bào)
機(jī)構(gòu): 山東省政府辦公廳
機(jī)構(gòu): 平邑縣玉榮商貿(mào)有限公司
標(biāo)題:[新聞直播間]黑龍江:龍煤集團(tuán)一煤礦發(fā)生火災(zāi)事故
位置: 黑龍江
機(jī)構(gòu): 龍煤集團(tuán)
代碼&數(shù)據(jù)
比賽報(bào)名地址:http://ailab.aiwin.org.cn/competitions/48
文章完整代碼:https://github.com/datawhalechina/competition-baseline
往期精彩回顧
本站qq群851320808,加入微信群請掃碼:
評論
圖片
表情
