Sådan bygger du brugerdefineret NER-model med kontekstbaserede Word-indlejringer på mundtlige sprog

I dag har vi en enorm mængde ustrukturerede data fra forskellige kilder som sociale medier, nyhedsartikler, samtaledata osv. Disse data er fyldt med rig information, omend oplysningerne er svære at hente, og dette er en af ​​de større udfordringer af NLP (Natural Language Processing).

Det er her Navngivet enhedsgenkendelse spiller ind. I denne artikel kommer vi i gang med NER (navngivet enhedsgenkendelse). Vi vil implementere brugerdefineret NER ved hjælp af Allennlp-rammer på et hindi-datasæt, der har "Vejr" -udtryk, der er mærket med enheder.

Bliv fortrolig med Navngivet Enhedsgenkendelse (NER)

NER er en sekvensmærkningsopgave, hvor vi forsøger at hente den kontekstuelle betydning af ord ved hjælp af ordindlejringer. Vi bruger NER-modellen til udtræk af oplysninger til at klassificere navngivne enheder fra ustruktureret tekst i foruddefinerede kategorier. Navngivne enheder er genstande i den virkelige verden, såsom en persons navn, placering, vartegn osv.

NER spiller en nøglerolle i informationsudtrækning fra dokumenter (f.eks. E-mails), samtaledata osv. Faktisk er de to hovedkomponenter i en samtale bot's NLU Intent Classification og Entity Extraction. NER i samtaleagenter bruges til anerkendelse af enheder og udtræk af oplysninger til at hente informationer som dato, placering, e-mail, telefonnummer osv.

At have konteksten i tankerne er en integreret del af forskellige NLP-opgaver. I NER er det virkelig vigtigt at have kendskab til kontekst, som ikke kunne opnås ved traditionelle ordindlejringer som (GLOVE, fasttext, Word2Vec osv.). Her tildeler disse indlejringer kun en repræsentation pr. Ord, mens forskellige ord i virkeligheden har forskellig betydning afhængigt af hvor de bruges og i hvilken kontekst de bruges. Nu skal vi se, hvordan kontekstualiseret ordindlejring med en ELMO-model giver effektive kontekstuelle oplysninger.

ELMo (Indlejringer fra sprogmodeller)

ELMO-arkitektur

ELMO forstår både betydningen af ​​ordene og den kontekst, hvori de findes, i modsætning til GLOVE-indlejringer, der kun fanger betydningen af ​​ordene og ikke er opmærksomme på konteksten.

ELMO tildeler indlejringer til ord, der er baseret på de kontekster, de er brugt i - til både at fange ordets betydning i den sammenhæng samt at hente anden kontekstuel information.

I stedet for at bruge en fast indlejring for hvert ord som i GLOVE, ser ELMo på hele sætningen, før de tildeler hvert ord en indlejring. Den bruger en tovejs LSTM, der er trænet i specifikke opgaver til at oprette disse ordindlejringer.

ELMO leverede et betydeligt skridt hen imod foruddannelse inden for rammerne af Natural Language Processing (NLP). Elmo LSTM kan trænes på et massivt datasæt på ethvert sprog for at fremstille brugerdefinerede sprogmodeller og derefter genbruges som en komponent i andre modeller, der har til opgave at NLU (Natural Language Understanding).

ELMO fik sin dygtighed ved at blive trænet til at forudsige det næste ord i en række ord - en opgave kaldet sprogmodellering, som er vigtig for NLU (Natural Language Understanding). Dette er praktisk til at lave sprogmodeller, fordi vi har store mængder tekstdata, som en sådan model kan lære af, uden behov for etiketter.

Kontekstualiserede ordindlejringer kan give ord forskellige indlejringer baseret på den betydning, de bærer i sætningens sammenhæng. (kilde: The Illustrated BERT, ELMo og co. (Hvordan NLP Cracked Transfer Learning) af jay alammar)

ELMo-papiret introducerer dybe kontekstualiserede ordindlejringer, der modellerer både komplekse karakteristika ved ordbrug, som syntaks og semantik, og hvordan de varierer på tværs af sproglige sammenhænge. Papiret illustrerer, hvordan deres foruddannede kontekstuelle sprogindlejringer kan føjes til eksisterende modeller for at forbedre den aktuelle teknik på tværs af udfordrende NLP-problemer. For at få en dybere forståelse af det samme skal du læse papiret

Træning af en NER-model i AllenNLP

Folk hos AllenNLP kom ud med konceptet af kontekstualiserede ord-indlejringer ELMO i det papir Dyb kontekstualiserede ordrepræsentationer. Nu skal vi bruge AllenNLP-rammen til vores NER-opgave.

Installation

  1. Oprettelse af et conda-miljø med python
conda create -n allennlp python = 3.6

2. Aktivering af miljøet.

kilde aktivere allennlp

3. Vi vil installere fra kilden.

git klon https://github.com/allenai/allennlp.git
cd allennlp
pip install -r krav.txt

For at træne en model i Allenlp Framework, er vi nødt til at implementere en DatasetReader til at læse data og en model efter vores valg, som i dette tilfælde er en CRFTagger-model.

  1. Læsning af dataene med DatasetReader

De data, vi har, er BILOU-tagget og er i CoNLL-format. En CoNLL-formateret data har et ord pr. Linje med enheder adskilt med et mellemrum og den næste sætning adskilles af en linje. I BILOU-mærkningsskema B (Begyndelse), I (Indvendig), L (Sidste), O (Udenfor), U (Enhed).

O्या O
कल B-dato
Og L-dato
में O
धूप U-weather_type
आएगी O
Uर U-placering
में O
मौसम O
की O
थिति्थिति O
O्या O
है O

En DatasetReader læser en fil og konverterer den til en samling af forekomster. Her skal vi bruge conll2003 datasætlæser ved at finpusse den lidt efter vores krav, da vi kun har NER-mærkede data, og denne læser accepterer et conll2003 datasæt, der har pos, NERand chunk tags også.

”En DatasetReader læser data fra et eller andet sted og konstruerer et datasæt. Alle parametre, der er nødvendige for at læse data bortset fra filstien, skal overføres til konstruktøren af ​​DatasetReader. ”- AllenNLP-dokumentation.

Vi har et vejrdatasæt med tre enheds placering, vejr type og dato. Vi er nødt til at implementere to metoder de følgende to metoder til at læse og foretage tokeniserede tilfælde.

Læs()

Metoden læst () får data. Med AllenNLP kan du indstille stien til datafilerne (stien til en JSON-fil for eksempel). Vi læser enhver tekst og hver etiket fra datasættet og indpakker den med text_to_instance (), som vist nedenfor.

text_to_instance ()

Denne metode "gør hvad som helst tokenisering eller behandling er nødvendigt for at gå fra tekstindtastning til et tilfælde".

2. Lad os nu gå videre til Model-del

Vi vil bruge CRFTagger-modellen, der findes i Allennlp Framework. Vi kan bruge modellen som den er. CRFTagger koder en sekvens af tekst med en Seq2SeqEncoder og bruger derefter en betinget tilfældig feltmodel til at forudsige et tag for hvert token i sekvensen.

Her har vi en Bi-LSTM + CRF-model.

Selvom bi-lstm kan fange begrebsmæssig betydning inden for ord, er vi stadig nødt til at finde en forbindelse mellem tags. Da dette kan være et problem for NER, hvor du aldrig vil (f.eks.) Have et "start af en dato" -mærke efterfulgt af et "inde i et sted" -tag. Her kommer betinget tilfældigt felt til at hjælpe og finde afhængigheder mellem tags.

Det betingede vilkårlige felt med "lineær kæde", vi implementerer, har en num_tags x num_tags matrix af overgangsomkostninger, hvor overgange [i, j] repræsenterer sandsynligheden for at overføre fra j-th-tag til det i-th-tag.

Ud over de tags, vi forsøger at forudsige, har vi specielle "start" og "slut" tags, som vi tilføjer før og efter hver sætning for at fange "overgangen" mellem sætninger.

Derudover accepterer CRF et valgfrit sæt begrænsninger, der afviser "ugyldige" overgange (hvor "ugyldig" afhænger af, hvad du prøver at modellere.) For eksempel har vores NER-data forskellige tags, der repræsenterer begyndelsen, midten og slutningen af ​​hver entitetstype. Vi vil gerne ikke tillade, at et "begyndelse af en datoenhed" -tag følges af et "slut på lokationsenhedskode", som forklaret nedenfor.

Hvis vi undersøger vores data i den første sætning, der kombinerer कल (B-dato)
दोपहर (L-date), kan vi få datoen som कल दोपहर. For kontekstuel passende egnethed kan कल (B-dato) imidlertid ikke kombineres med (U-vejr_type), da det er nødvendigt for कल (B-dato) at blive fulgt med दोपहर (L-dato). Dette opnås ved hjælp af CRF.

O्या O
कल B-dato
Og L-dato
में O
धूप U-weather_type
आएगी O
Uर U-placering
में O
मौसम O
की O
थिति्थिति O
O्या O
है O

For en dybere forståelse af modellen kan du tjekke:

Oprettelse af en konfigurationsfil

Vi har brug for en konfigurationsfil til at specificere alt, hvad der kræves for at træne modellen. Vi er nødt til at specificere banen til toget, Val, fastText-indlejring, ELMo-vægte og indstillingsfiler. Hvil alle felter er selvberettigede.

Endelig kan vi begynde at træne

Nu er vi klar til at træne NER-modellen. Til det har vi brug for et par filer.

  1. Trænings- og valideringsdata.
  2. Hindi ELMo-vægte og indstillingsfil. Vi kan bruge en ELMo-model, der er trænet på hindi-wiki-data. Vi forsyner dig med ELMo-indlejringer på hindi, trænet på Wikidump.
  3. fastText indbyggede hindi.

Du kan finde alle filerne her.

Under træning sporer vi nøjagtigheden efter hver epoke, og de bedste vægte gemmes. Vi kan begynde at træne ved at kalde “toget” -metoden ved at overføre den til model config-filen og model output stien.

$ allennlp togsti / til / config / fil -s sti / til / output / mappe
Måling efter træningens afslutning

Her kan du se, at vi får forskellige målinger efter træning. Så nu kan du også lege med datasættet for at få gode resultater på de valideringsdata, der findes her. God træning !!!!!

Forudsigelse

Når træningen er afsluttet, kan vi foretage forudsigelser ved at kalde “forudsige” metoden ved at overføre den til den gemte modelsti og en testfil, som vist nedenfor.

allennlp forudsige \
    sti / til / model.tar.gz \
    sti / til / test.txt \

Når du kører dette, får du forskellige logits, tags. Alle ord med der forudsagte tags vises.

Ressourcer til dybere forståelse

  1. Bi-LSTM + CRF med karakterindlejringer til NER og POS
  2. Det illustrerede BERT, ELMo og co. (Hvordan NLP Cracked Transfer Learning)
  3. Bi-LSTM + CRF med pytorch
  4. Allennlp-dokumentation

Konklusion

Jeg håber, at du var i stand til at få et omfattende greb om, hvordan du implementerer en NER med kontekstualiserede indlejringer (ELMo) ved hjælp af AllenNLP, og få hands-on med det samme.

Hvis du nød denne artikel, kan du hjælpe os med at sprede ordet med de håbefulde NLP-udviklere. Følg os, del og giv os et klap.