<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          輕松上手,通過(guò)微調(diào)Transformers完成命名實(shí)體識(shí)別任務(wù)

          共 5757字,需瀏覽 12分鐘

           ·

          2021-04-02 12:44

          大數(shù)據(jù)文摘授權(quán)轉(zhuǎn)載自THU數(shù)據(jù)派
          作者:Lars Kjeldgaard
          翻譯:王闖(Chuck)
          校對(duì):和中華

          在本文中,我們將介紹如何通過(guò)簡(jiǎn)單微調(diào)(fine-tune)任意預(yù)訓(xùn)練的(pretrained)自然語(yǔ)言處理transformer,來(lái)完成任意語(yǔ)言中的命名實(shí)體識(shí)別(Named-Entity Recognition, NER)任務(wù)。
           
          為什么這個(gè)話題值得你關(guān)注?因?yàn)镹ER是一項(xiàng)強(qiáng)大的自然語(yǔ)言處理任務(wù),在諸多領(lǐng)域都有實(shí)際應(yīng)用,在Towards Data Science之前的帖子中已有詳細(xì)介紹。然而要想得到不錯(cuò)的NER模型效果,通常需要基于預(yù)訓(xùn)練的transformer對(duì)NER模型進(jìn)行特定語(yǔ)言或領(lǐng)域的微調(diào),這在計(jì)算資源有限的情況下,是比較可行的辦法,而且能看到實(shí)際效果。
           
          為了展示如何做到,我們使用python的NERDA包調(diào)用BERT transformer對(duì)NER模型進(jìn)行微調(diào)。
           
          NERDA是一套通用的NER系統(tǒng),可用于以最少的代碼量對(duì)任意語(yǔ)言的NER任務(wù)和任意transformer進(jìn)行微調(diào)。
           

          命名實(shí)體識(shí)別簡(jiǎn)介

           
          如果你還不熟悉NER,請(qǐng)查看維基百科上的定義:
           
          命名實(shí)體識(shí)別(也稱(chēng)(命名)實(shí)體標(biāo)識(shí),實(shí)體片取或?qū)嶓w提取)是用于信息提取的自然語(yǔ)言處理子任務(wù),旨在將非結(jié)構(gòu)化文本中提到的命名實(shí)體定位并分到預(yù)定義的類(lèi)別,例如人名,組織機(jī)構(gòu)名,地名,醫(yī)療代碼,時(shí)間,數(shù)量,貨幣值,百分比等。
           
          我們可以通過(guò)一個(gè)NER任務(wù)的例子來(lái)作進(jìn)一步解釋。
           
          任務(wù):在文本中標(biāo)識(shí)人名和組織機(jī)構(gòu)名:
           
          Jim bought 300 shares of Acme Corp.
           
          解答:人名:'Jim',組織機(jī)構(gòu)名:'Acme Corp.'
           
          若你想獲得本文中提到的其他概念和技術(shù)的介紹,請(qǐng)移步文末“參考資料”部分,那里我們列了許多Towards Data Science先前的帖子。
           

          工具箱

           
          現(xiàn)在,我們要實(shí)際上手為NER微調(diào)transformer了。
           
          無(wú)論你選擇哪一種transformer和目標(biāo)語(yǔ)言,我們這里介紹的步驟都是通用的。
           
          我們將利用python的NERDA包來(lái)完成這項(xiàng)工作。

          “NERDA” Python包的官方徽標(biāo),由Ekstra Bladet新聞提供
           
          NERDA擁有為NER任務(wù)進(jìn)行transformers微調(diào)的易用接口。它基于流行的機(jī)器學(xué)習(xí)框架PyTorch和Hugging Face transformers。
           
          NERDA是開(kāi)源的,可在Python Package Index(PyPI)上獲得。它可通過(guò)如下方式安裝:
           
          pip install NERDA

          數(shù)據(jù)集
           
          我們將使用帶有NER標(biāo)注的CoNLL-2003英文數(shù)據(jù)集來(lái)訓(xùn)練和驗(yàn)證我們的模型。

          首先,我們下載數(shù)據(jù)集并加載預(yù)定義且拆分過(guò)的訓(xùn)練數(shù)據(jù)和驗(yàn)證數(shù)據(jù)。
           
          from NERDA.datasets import get_conll_data, download_conll_data download_conll_data()training = get_conll_data('train')validation = get_conll_data('valid')

          CoNLL-2003使用以下類(lèi)型的命名實(shí)體(相當(dāng)標(biāo)準(zhǔn)的類(lèi)別)進(jìn)行操作:
           
          1. 人名(PER)
          2. 組織機(jī)構(gòu)名(ORG)
          3. 地名(LOC)
          4. 其他(MISC)
          5. 未命名實(shí)體(O)

          CoNLL-2003數(shù)據(jù)集中的每一條觀測(cè)值都是一個(gè)經(jīng)過(guò)分詞的句子,每個(gè)分詞都帶有一個(gè)命名實(shí)體標(biāo)簽。

          下面,你將看到CoNLL數(shù)據(jù)集中隨機(jī)取出的一個(gè)句子示例,同時(shí)列出了其分詞與對(duì)應(yīng)的命名實(shí)體標(biāo)簽([標(biāo)簽])。
           
          Germany [B-LOC]'s [O]representative [O]to [O] the [O]European [B-ORG] Union [I-ORG] 's [O]veterinary [O] committee [O]Werner [B-PER] Zwingmann [I-PER]said [O]on [O] Wednesday [O]...

          數(shù)據(jù)集采用了IOB標(biāo)注方式。
           
          IOB標(biāo)注法的意思是,以'B-'標(biāo)記命名實(shí)體開(kāi)頭的單詞,以'I-'標(biāo)記命名實(shí)體中間的單詞。
           
          在上面的示例中,“Germany”標(biāo)記為地名(LOC),“European Union”標(biāo)記為組織機(jī)構(gòu)名(ORG),“ Werner Zwingmann”標(biāo)識(shí)為人名(PER)。
           

          建模

           
          第一步,我們?yōu)槿蝿?wù)指定可用的NER標(biāo)簽(不包括特殊的O(Outside,表示不在短語(yǔ)中)標(biāo)簽)。
           
          tag_scheme = [ 'B-PER','I-PER','B-ORG','I-ORG','B-LOC','I-LOC','B-MISC','I-MISC' ]

          接下來(lái),我們必須做出選擇,要微調(diào)Hugging Face上眾多transformers中的哪一個(gè)。這里我們以u(píng)ncased multilingual BERT transformer為例(常見(jiàn)選擇之一)。
           
          transformer = 'bert-base-multilingual-uncased'
           
          同時(shí),我們?yōu)榫W(wǎng)絡(luò)層及模型訓(xùn)練本身提供一套基本的超參數(shù)配置。
           
          # hyperparameters for networkdropout = 0.1# hyperparameters for trainingtraininghyperparameters = {'epochs' : 4,'warmup_steps' : 500,'train_batch_size': 13,'learning_rate': 0.0001}

          整合

           
          現(xiàn)在,使用NERDA模型接口將各個(gè)部分整合到一個(gè)完整的模型配置中。

          from NERDA.models import NERDAmodel = NERDA(dataset_training = training,dataset_validation = validation,tag_scheme = tag_scheme, tag_outside = 'O',transformer = transformer,dropout = dropout,hyperparameters = training_hyperparameters)
           
          在底層NERDA實(shí)現(xiàn)了一個(gè)torch神經(jīng)網(wǎng)絡(luò),該神經(jīng)網(wǎng)絡(luò)建立在所選的transformer(在本例中為BERT)上。默認(rèn)情況下,網(wǎng)絡(luò)架構(gòu)將類(lèi)似于Hvingelby等人2020年發(fā)表的論文中提出的模型之一。(如果你愿意,也可以提出自己的網(wǎng)絡(luò)架構(gòu))。
           
          為了訓(xùn)練模型并微調(diào)BERT transformer,接下來(lái)唯一要做的就是調(diào)用train方法。

          model.train()
           
          注意:這將花上一些時(shí)間,具體取決于特征的維度(如果你想略過(guò)模型訓(xùn)練,則可以直接使用NERDA中提供的預(yù)訓(xùn)練模型)。
           
          到這就大功告成了。現(xiàn)在,我們已經(jīng)為NER微調(diào)了屬于自己的一個(gè)基于BERT的最優(yōu)效果 (state-of-the-art)模型。
           
          讓我們看看該模型在獨(dú)立測(cè)試集上的表現(xiàn)(通過(guò)F1得分評(píng)估)。

          >>> test = get_conll_data('test')>>> model.evaluate_performance(test)級(jí)別F1-分?jǐn)?shù)B-PER 0.963 I-PER 0.987 B-ORG 0.887 I-ORG 0.866 B-LOC 0.922 I-LOC 0.817 B- MISC 0.823 I-MISC 0.680 AVG_MICRO 0.907

          “ AVG_MICRO”:跨實(shí)體標(biāo)簽的F1分?jǐn)?shù)的微平均值(micro-averaged F1-score)。
           
          如你所見(jiàn),模型表現(xiàn)看起來(lái)很棒。
           
          現(xiàn)在,我們可以使用該模型來(lái)識(shí)別新文本中的命名實(shí)體,例如:

          >>> model.predict_text('Cristiano Ronaldo plays for Juventus FC')([['Cristian', 'Ronaldo', 'plays', 'for', 'Juventus', 'FC']], [['B-PER', 'I-PER', 'O', 'O', 'B-ORG', 'I-ORG']])
           
          該模型(正確地)將“ Cristiano Ronaldo”(足球運(yùn)動(dòng)員)標(biāo)識(shí)為人名,并將“ Juventus FC”(足球俱樂(lè)部)標(biāo)識(shí)為組織機(jī)構(gòu)名。
           

          微調(diào)任意Transformer

           
          Hugging Face上目前已提供了超過(guò)5000種transformer模型。那么你應(yīng)該微調(diào)哪一個(gè)呢?我們不想讓你失望,但答案是:這要視情況而定。天下沒(méi)有免費(fèi)的午餐。Transformer模型都有各自的優(yōu)缺點(diǎn)。此外,當(dāng)你挑選transformer的時(shí)候,也要相應(yīng)照顧到到計(jì)算資源的預(yù)算,和節(jié)能環(huán)保的意識(shí)。
           
          如前所述,BERT通常是一個(gè)不錯(cuò)的選擇。但是,與BERT相比,后起之秀ELECTRA則輕巧許多,計(jì)算效率更高,并且在NER任務(wù)上仍然表現(xiàn)出色。
           
          無(wú)論你選擇哪種transformer,NERDA都提供支持。在上面的代碼示例中,如果想要把transformer從BERT改成ELECTRA,只需要更改transformer參數(shù),即:

          model = NERDA(...,transformer = 'google/electra-small-discriminator',...)
           

          微調(diào)任意語(yǔ)言

           
          NERDA可以用于微調(diào)任意語(yǔ)言的transformer,比如使用你自己的數(shù)據(jù)集。為了微調(diào)NER中丹麥語(yǔ)的transformer,我們可以利用DaNE數(shù)據(jù)集,該數(shù)據(jù)集由帶有NER注釋的丹麥語(yǔ)句子組成。
           
          為實(shí)現(xiàn)此目的,你只需要在前一個(gè)代碼示例中做出非常簡(jiǎn)單的改變:

          from NERDA.datasets import get_dane_datamodel = NERDA(...,dataset_training = get_dane_data('train'),dataset_validation = get_dane_data('dev'),...)
           
          如果你沒(méi)有任何(或是還不夠)所需語(yǔ)言的經(jīng)過(guò)NER標(biāo)注的訓(xùn)練數(shù)據(jù),那么你可以利用doccano之類(lèi)的工具來(lái)批量標(biāo)注新文本。
           
          出乎意料的是,NERDA對(duì)特定語(yǔ)言的微調(diào)并不需要你想像那么多的帶標(biāo)注的數(shù)據(jù),因?yàn)镹ERDA可以利用transformer中已經(jīng)存在的知識(shí)。例如,丹麥NER數(shù)據(jù)集DaNE包含的句子雖不超過(guò)5500個(gè),卻足以訓(xùn)練NERDA模型,性能還不錯(cuò)。
           

          關(guān)于NERDA

           
          NERDA是丹麥小報(bào)Ekstra Bladet在“新聞智能平臺(tái)(PIN)”開(kāi)發(fā)活動(dòng)中的一部分成果。PIN是一個(gè)業(yè)界研究項(xiàng)目,合作方包括丹麥技術(shù)大學(xué),哥本哈根大學(xué)和哥本哈根商學(xué)院,獲得了丹麥創(chuàng)新基金的資助。該項(xiàng)目的起止時(shí)間為2020年至2023年,用于研發(fā)新聞發(fā)布的推薦系統(tǒng)和自然語(yǔ)言處理系統(tǒng),其部分研究成果已開(kāi)源,如NERDA。
           
          原文標(biāo)題:
          Easy Fine-Tuning of Transformers for Named-Entity Recognition
          原文鏈接:
          https://towardsdatascience.com/easy-fine-tuning-of-transformers-for-named-entity-recognition-d72f2b5340e3

          參考資料: 

          https://github.com/ebanalyse/NERDA

          https://huggingface.co/

          https://pytorch.org/

          https://github.com/google-research/bert

          “DaNE: A Named Entity Ressource for Danish”, Hvingelby et. al (2020):http://www.lrec-conf.org/proceedings/lrec2020/pdf/2020.lrec-1.565.pdf

          https://github.com/google-research/electra

          https://towardsdatascience.com/what-are-transformers-and-how-can-you-use-them-f7ccd546071a

          https://towardsdatascience.com/bert-explained-state-of-the-art-language-model-for-nlp-f8b21a9b6270

          https://towardsdatascience.com/understanding-electra-and-training-an-electra-language-model-3d33e3a9660d

           
          編輯:于騰凱
          校對(duì):林亦霖


          點(diǎn)「在看」的人都變好看了哦!
          瀏覽 49
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  爱爱视频免费看日本 | 欧美日韩亚洲成人论坛 | 成人激情四射视频婷婷丁香网 | 五月激情啪啪 | 欧洲精品在线免费观看 |