Seuraava artikkeli auttaa sinua: Opas selitettävissä olevien nimettyjen entiteettien tunnistamiseen
Nimetty entiteettitunnistus (NER) on yksi minkä tahansa NLP-projektin keskeisistä osista. Voimme nähdä erilaisia esimerkkejä NER:n toteutuksesta, mutta kun on kyse siitä, miten NER-prosessi toimi taustalla tai miten prosessi käyttäytyy datan kanssa, se tarvitsee enemmän selitettävyyttä. Tässä artikkelissa yritämme tehdä nimettyjen entiteettien tunnistamisesta selitettävää ja tulkittavaa, mikä auttaa ymmärtämään sen toimintakonseptia. Tärkeimmät tässä artikkelissa käsiteltävät kohdat on lueteltu alla.
Sisällysluettelo
- Mikä on nimetty entiteettitunnistus (NER)?
- Poimitaan tietoja Kagglesta
- Ladataan tietoja
- Tietojen esikäsittely
- NER mallinnus
- Ennustuksen selittäminen
Aloitetaan ymmärtämällä ensin nimetty kokonaisuuden tunnistus.
Mikä on nimetty entiteettitunnistus (NER)?
Yhdessä artikkelissamme olemme keskustelleet siitä, että nimetyt entiteetit ovat sana kaikissa tekstitiedoissa, jotka ovat todellisessa maailmassa olemassa olevia objekteja. Jotkut esimerkkejä näistä reaalimaailman objekteista ovat minkä tahansa henkilön, paikan tai asian nimiä. Näillä objekteilla on oma identiteettinsä kaikissa tekstitiedoissa. Esimerkiksi Narendra Singh Modi, Mumbai, Plasto vesisäiliö jne. Tällä nimetyllä kokonaisuudella on oma luokkansa, kuten Narendra Modi on henkilön nimi. Nimettyjen entiteettien tunnistusta (NER) voidaan pitää prosessina, jossa kone saadaan tunnistamaan objektit luokkansa ja muiden määritysten mukaan. Myös näiden nimettyjen entiteettien tunnistamista koskevien tietojen kanssa olemme keskustelleet siitä, kuinka voimme toteuttaa NER:n käyttämällä kirjastoja spaCy ja NLTK.
Puhuessamme NER:n sovelluksista huomaamme, että voimme hyödyntää prosessia Tietojen yhteenvedossa asiakirjoista, Hakukoneiden algoritmin optimoinnissa, eri biolääketieteen alaosien tunnistamisessa ja Sisältösuosituksissa.
Tämän artikkelin avulla pyrimme tekemään NER:n käyttöönottoprosessista selkeämmän. Käytämme tähän tarkoitukseen Keras- ja limekirjastoja. Lisäksi keskustelemme siitä, kuinka voimme poimia tietoja Kagglesta Google Colab -ympäristössä. Aloitetaan tietojen purkamisesta
Poimitaan tietoja Kagglesta
Tietojen poimiminen Kagglesta edellyttää, että meillä on tili Kagglen verkkosivustolla. Luodaksemme tilin käytämme tätä linkkiä. Tilin luomisen jälkeen meidän on mentävä tilisivulle. Esimerkiksi tilisivuni osoite on
https://www.kaggle.com/yugeshvermaaim/account
Missä yugeshvermaaim on tilini nimi. Kun olemme saavuttaneet tilisivun, meidän on vieritettävä sivua alas API-osioon.
Tässä osiossa meidän on napsautettava Luo uusi API-tunnus -painiketta. Tämä painike vastaa kaggle.json-nimisen JSON-tiedoston toimittamisesta meille. Tämän tiedoston purkamisen jälkeen meidän on ladattava se Google Colab -ympäristöön. Löydämme pikakuvakkeen tiedoston lataamiseen googlen yhteistyömuistikirjan vasemmasta osiosta.

Tämän paneelin ensimmäinen painike on tiedoston lataamiseen, jonka avulla meidän on lähetettävä kaggle.json-tiedosto. JSON-tiedoston lataamisen jälkeen voimme käyttää seuraavaa komentoa Kagglen asentamiseen ympäristöön.
! pip install kaggle
Asennuksen jälkeen meidän on tehtävä hakemisto. Käyttämällä seuraavaa komentoa voimme tehdä sen:
! mkdir ~/.kaggle
Seuraavaa komentoa käyttämällä voimme kopioida kaggle.jsonin yllä olevaan hakemistoon muodossa,
! cp kaggle.json ~/.kaggle/
Alla annettu koodi tarvitaan luvan antamiseen tiedostojen allokointiin.
! chmod 600 ~/.kaggle/kaggle.json
Nyt NER:n toteutuksessa käytämme Kagglen dataa ner_datasset, joka löytyy tästä linkistä. Nämä tiedot sisältävät annotoidun korpusuksen nimetyn kokonaisuuden tunnistamista varten, ja niitä voidaan käyttää kokonaisuuden luokittelussa.
Näiden tietojen purkamiseksi meidän on kopioitava API-komento, joka voidaan kerätä uuden kannettavan paneelin oikealla puolella olevista kolmipistepaneeleista.

Tietojemme osalta sillä on seuraava API-komento:
kaggle datasets download -d abhinavwalia95/entity-annotated-corpus
Tämä komento voidaan suorittaa Google Colabissa.
!kaggle datasets download -d abhinavwalia95/entity-annotated-corpus
Lähtö:

Tämä koottu tiedosto on zip-tiedosto, joka voidaan purkaa seuraavalla komennolla.
! pura entity-annotated-corpus
Lähtö:

Yllä olevassa voimme tehdä muutoksia kiinnostuksemme mukaan tiedostojen purkamiseen Kagglesta. Tämän tiedon poiminnan jälkeen olemme valmiita ottamaan käyttöön NER:n. Aloitetaan lataamalla tiedot.
Ladataan tietoja
tuo pandat pd-datana = pd.read_csv(“ner_dataset.csv”, encoding=”latin1″).fillna(method=”ffill”)
Tarkistetaan tietoja
data.head()
Lähtö:

data.describe()
Lähtö:

Yllä olevasta kuvauksesta voimme havaita, että lauseissa on 47 959 lausetta ja 35 178 ainutlaatuista sanaa, joissa on käytettävissä 42 puheen osaa ja 17 esine- tai tunnisteluokkaa.

Yllä oleva kuva on esimerkki tietojoukon lauseesta 4. Jotta se toimisi, olen määritellyt funktion, joka voi lisätä kaikki sanat lauseen muodostamiseksi sen numeron mukaan. Kiinnostuneet lukijat voivat löytää toiminnon täältä.
Tarkastetaan näiden sanojen tunnisteet:
tulosta (tarrat[3])
Lähtö:

Tietojen esikäsittely
Tässä osiossa aloitamme rakentamalla sanaston, joka sisältää noin 10 000 sanaa. Alla oleva kuva esittelee sanastoa.
tulostaa(sanasto) len(sanasto)
Lähtö:

Tämän osion toinen vaihe on sekvenssin täyttäminen yhteiseen pituuteen.
tulosta(sana2idx) tulosta(tag2idx)
Lähtö:

Tehtyämme yhteispituisen pad-sekvenssin olemme valmiita jakamaan tietomme.
kohteesta sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, shuffle=False)
Näiden tietojen esikäsittelyvaiheiden jälkeen olemme valmiita NER-mallinnukseen.
NER mallinnus
NER-mallinnuksessa olemme käyttäneet kaksisuuntaista LSTM-mallia, jossa on 0,1 toistuvaa pudotusta, ja käännöksessä olen käyttänyt etenemiskeskiarvoa optimoinnina. Mallin sovittamisessa olemme käyttäneet 5 aikakausia. Koko menettelyn koodi löytyy täältä.
Seuraavan koodin avulla voimme kouluttaa verkostoamme.
historia = model.fit(X_train, y_train.reshape(*y_train.shape, 1), erän_koko=32, epochs=5, validation_split=0.1, verbose=1)
Mallin harjoittamisen jälkeen olemme valmiita selittämään ennusteita.
Ennustuksen selittäminen
Kuten edellä on käsitelty, teemme NER-prosessista ymmärrettävämmän LIME-kirjaston avulla. Tämä kirjasto on avoimen lähdekoodin kirjasto, joka tekee tekoälystä ja koneoppimisesta ymmärrettävämpää. Ennen kuin alamme selittää NER:n, meidän on asennettava tämä kirjasto. Eli5-kirjastoa voidaan käyttää myös limekirjastoon rakennetun funktion käyttämiseen. Asennus voidaan tehdä käyttämällä seuraavia koodirivejä.
!pip install lime
Lähtö:

!pip install eli5
Lähtö:

Asennuksen jälkeen olemme valmiita selittämään NER-mallinnuksen ennusteen. Selittääksemme NER:n LIME:n avulla meidän on tehtävä ongelmamme moniluokkainen luokitteluongelma.
Katsotaanpa 100. otosta tekstitiedoistamme.
indeksi = 99 etiketti = etiketit[index]
teksti = lauseita[index]
print(teksti) print() print(” “.join([f”{t} ({l})” for t, l in zip(text.split(), label)]))
Lähtö:

Aloitetaan NER-mallinnuksen ennusteen selittäminen. Tätä varten olemme määrittäneet luokan nimeltä NERExplainerGenerator, jossa olemme määrittäneet funktion nimeltä get_predict_function, joka antaa ennusteet LIME-kirjastojen funktioille TextExplainer.
Yllä olevasta esimerkistä käytämme kuudetta sanaa ja luomme vastaavan ennustusfunktion. LIME:n MaskExplainer-moduulin avulla voimme alustaa LIME-algoritmin samplerin.
from eli5.lime.samplers import MaskingTextSampler word_index = 6preced_func = selittäjä_generaattori.get_predict_function(word_index=word_index) sampler = MaskingTextSampler( korvaus=”UNK”, max_replace=0.7, token_pattern=Ei mitään, bow=False)
Näytteen tulostaminen näytteenottimella.
näytteet, samankaltaisuus = sampler.sample_near(text, n_samples=6) print(samples)
Lähtö:

TextExplainer-moduulin alustaminen LIMEstä ennusteen selittämiseksi.
from eli5.lime import TextExplainer te = TextExplainer( sampler=sampler, position_dependent=True, random_state=42 ) te.fit(text, ennustaa_toiminto)
Sen asentamisen jälkeen olemme valmiita käyttämään TestExplaineria.
te.explain_prediction( target_names=list(explainer_generator.idx2tag.values()), top_targets=4 )
Lähtö:

Yllä olevassa tuotoksessa voimme nähdä, että olemme tehneet NER-mallinnuksen selitettävimmäksi. Tuloksessa voimme nähdä, että sana Indian on korostettu voimakkaasti, mikä tarkoittaa, että Intia on todennäköisemmin minkä tahansa kohteen nimeksi ja tietojoukossa on Intia usein maan nimenä.
Viimeiset sanat
Tässä artikkelissa olemme keskustelleet siitä, kuinka voimme suorittaa nimettyjen entiteettien tunnistuksen Keras-kirjaston avulla ja kuinka voimme käyttää LIME-kirjastoa tehdäksemme siitä selkeämmän. Saimme tietää kuinka nimettyjen entiteettien tunnistus toimii ja miten se käyttäytyy datan kanssa.
Viitteet: