POS-tunnisteet NLTK:n avulla ja lohkominen NLP:ssä [ESIMERKKI]

⚡ Älykäs yhteenveto

POS-tunnisteessa jokaiselle lauseen sanalle annetaan sanaluokka, kun taas paloittelussa tunnistetut sanat ryhmitellään merkityksellisiksi lauseiksi, kuten substantiivilausekkeiksi, lisäämällä pinnallisen rakenteen, jonka NLTK rakentaa säännöllisillä lausekkeilla. Python.

  • 🏷️ POS-merkintä: Jokainen sana saa kielioppitunnuksen, kuten NN, VB tai JJ, kontekstistaan.
  • 🌿 tiivistämistä: Tagitetut sanat ryhmitellään lauseiksi, prosessia kutsutaan myös pinnalliseksi jäsentämiseksi.
  • 🔤 Työnkulku: Tokenisoi teksti ensin, lisää sitten pos_tag ja jäsennä RegexpParser-kieliopilla.
  • 📊 Tunnisteiden laskeminen: Counter ja FreqDist paljastavat tagien ja sanojen frekvenssit ominaisuuksien suunnittelua varten.
  • 🔗 Kollokaatiot: Kaksi- ja kolmesosaiset sanaparit ja -kolmikot tallentavat vahvempia tekstiominaisuuksia.
  • 🤖 Tekoälyn käyttö: Koneoppiminen ja HMM-pohjaiset tägit käsittelevät monitulkintaisia ​​sanoja todennäköisyyden perusteella.

POS-merkintä NLTK:lla ja paloittelu NLP:ssä

POS-merkintä

POS-merkintä (Sanoluokkien merkitseminen) on prosessi, jossa tietyn puheenosan sanat merkitään tekstimuodossa niiden määritelmän ja kontekstin perusteella. Se vastaa tekstin lukemisesta tietyllä kielellä ja tietyn tunnuksen (sanaluokat) määrittämisestä kullekin sanalle. Sitä kutsutaan myös kieliopilliseksi merkitsemiseksi.

Opetellaanpa NLTK:n puheluokkaesimerkin avulla:

Input: Everything to permit us.
Output: [('Everything', NN),('to', TO), ('permit', VB), ('us', PRP)]

POS-tunnisteen esimerkin vaiheet

  • Tokenize teksti (word_tokenize)
  • Käytä pos_tag-metodia yllä olevaan vaiheeseen, eli nltk.pos_tag(tokenize_text)

NLTK POS -tunnisteiden esimerkkejä on lueteltu alla:

Lyhenne Merkitys
CC rinnastuskonjunktio
CD kardinaalinumero
DT määrääjä
EX eksistentiaalista siellä
FW vieras sana
IN prepositio / alisteinen konjunktio
JJ adjektiivi
JJR adjektiivi, komparatiivi
JJS adjektiivi, superlatiivi
LS lista markkinoilla
MD modaalinen
NN substantiivi, yksikkö
NNS substantiivi monikossa
NNP erisnimi, yksikkö
NNPS erisnimi, monikko
PDT ennalta määrääjä
POS omistuspääte
PRP persoonapronomini
PRP $ omistuspronomini
RB adverbi
RBR adverbi, komparatiivi
RBS adverbi, superlatiivi
RP hiukkanen
TO ääretön merkki
UH huudahdus
VB verbi
GBV verbi gerundi
VBD verbi imperfekti
VBN verbi partisiippi
VBP verbi, preesensissä, ei yksikön 3. persoonassa
VBZ verbi, preesensissä, yksikön 3. persoonassa
wdt wh-määrittäjä
WP wh-pronomini
WRB wh-adverbi

Yllä oleva NLTK POS -tagiluettelo sisältää kaikki NLTK POS -tagit. NLTK POS -taggaajaa käytetään kielioppitietojen liittämiseen lauseen jokaiseen sanaan. Kaikkien POS NLTK -pakettien asennus, tuonti ja lataus on nyt valmis.

Mitä on chunking NLP:ssä?

tiivistämistä NLP:ssä pienistä tietopaloista ryhmitellään suuriksi yksiköiksi. Paloittelun ensisijainen käyttötarkoitus on "substantiivilausekkeiden" ryhmittely. Sitä käytetään lauseen rakenteen lisäämiseen seuraamalla POS-merkintöjä yhdistettynä säännöllisiin lausekkeisiin. Tuloksena olevaa sanaryhmää kutsutaan "paloiksi". Sitä kutsutaan myös pinnalliseksi jäsentämiseksi.

Pinnallisessa jäsennyksessä juurien ja lehtien välissä on enintään yksi taso, kun taas syväjäsennys käsittää useamman kuin yhden tason. Pinnallista jäsennystä kutsutaan myös kevyeksi jäsennykseksi tai palaparsinnaksi.

Purkamisen säännöt

Ei ole olemassa ennalta määriteltyjä sääntöjä, mutta voit yhdistellä niitä tarpeen ja vaatimusten mukaan. Oletetaan esimerkiksi, että sinun on merkittävä lauseesta substantiivi, verbi (imperfekti), adjektiivi ja rinnastuskonjunktio. Voit käyttää alla olevaa sääntöä:

chunk:{***?}

Seuraava taulukko näyttää, mitä eri symbolit tarkoittavat:

Symbolin nimi Tuotetiedot
. Mikä tahansa merkki paitsi uusi rivi
* Yhdistä 0 tai useampi toisto
? Ottelu 0 tai 1 toistoa

Kirjoitetaan nyt koodi ymmärtääksemme säännön paremmin.

from nltk import pos_tag
from nltk import RegexpParser
text ="learn php from guru99 and make study easy".split()
print("After Split:",text)
tokens_tag = pos_tag(text)
print("After Token:",tokens_tag)
patterns= """mychunk:{***?}"""
chunker = RegexpParser(patterns)
print("After Regex:",chunker)
output = chunker.parse(tokens_tag)
print("After Chunking",output)

lähtö:

After Split: ['learn', 'php', 'from', 'guru99', 'and', 'make', 'study', 'easy']
After Token: [('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN'), ('and', 'CC'), ('make', 'VB'), ('study', 'NN'), ('easy', 'JJ')]
After Regex: chunk.RegexpParser with 1 stages:
RegexpChunkParser with 1 rules:
       '***?'>
After Chunking (S
  (mychunk learn/JJ)
  (mychunk php/NN)
  from/IN
  (mychunk guru99/NN and/CC)
  make/VB
  (mychunk study/NN easy/JJ))

Päätelmä yllä olevasta Puhetunnisteen osasta Python Esimerkki on, että ”make” on verbi, jota ei sisällytetä sääntöön, joten sitä ei ole merkitty tunnisteella mychunk.

Käyttö Case of Chunking

Paloittelua käytetään kokonaisuuksien tunnistamiseen. Kokonaisuus on se osa lausetta, jonka avulla kone saa arvon mille tahansa intentiolle.

Example:
Temperature of New York.
Here Temperature is the intention and New York is an entity.

Toisin sanoen paloittelua käytetään tokenien osajoukkojen valitsemiseen. Seuraa alla olevaa koodia ymmärtääksesi, miten paloittelua käytetään tokenien valitsemiseen. Tässä esimerkissä näet graafin, joka vastaa substantiivilausekkeen paloittelua.

 import nltk
text = "learn php from guru99"
tokens = nltk.word_tokenize(text)
print(tokens)
tag = nltk.pos_tag(tokens)
print(tag)
grammar = "NP: {
?*}" cp =nltk.RegexpParser(grammar) result = cp.parse(tag) print(result) result.draw() # It will draw the pattern graphically which can be seen in Noun Phrase chunking

lähtö:

['learn', 'php', 'from', 'guru99']  -- These are the tokens
[('learn', 'JJ'), ('php', 'NN'), ('from', 'IN'), ('guru99', 'NN')]   -- These are the pos_tag
(S (NP learn/JJ php/NN) from/IN (NP guru99/NN))        -- Noun Phrase Chunking

Substantiivi lause Chunking Graph

Substantiivi Fraasi chunking Graph

Kaaviosta voimme päätellä, että ”learn” ja ”guru99” ovat kaksi eri tokenia, mutta ne luokitellaan substantiivilausekkeiksi, kun taas token ”from” ei kuulu substantiivilausekkeeseen. Paloittelua käytetään eri tokeneiden luokittelemiseen samaan palaseen. Tulos riippuu valitusta kieliopista. Lisäksi NLTK:n palasiksijakoa käytetään kuvioiden taggaamiseen ja tekstikorpusten tutkimiseen.

POS-tunnisteiden laskeminen

Olemme keskustelleet erilaisista pos_tag arvoja aiemmin. Tässä opiskelet, kuinka nämä tagit lasketaan. Tagien laskeminen on ratkaisevan tärkeää tekstin luokittelussa ja ominaisuuksien valmistelussa luonnollisen kielen operaatioita varten. Kirjoitamme ensin toimivan koodin ja selitämme sitten vaiheet.

from collections import Counter
import nltk
text = "Guru99 is one of the best sites to learn WEB, SAP, Ethical Hacking and much more online."
lower_case = text.lower()
tokens = nltk.word_tokenize(lower_case)
tags = nltk.pos_tag(tokens)
counts = Counter( tag for word,  tag in tags)
print(counts)

lähtö:

Counter({'NN': 5, ',': 2, 'TO': 1, 'CC': 1, 'VBZ': 1, 'NNS': 1, 'CD': 1, '.': 1, 'DT': 1, 'JJS': 1, 'JJ': 1, 'JJR': 1, 'IN': 1, 'VB': 1, 'RB': 1})

Koodin tarkennus:

  1. Käytä kokoelmamoduulin Counter-pakettia. Counter on sanakirjan alaluokka, joka tallentaa elementit avaimina ja niiden lukumäärät arvoina.
  2. Tuo nltk tokenisoidaksesi tekstin.
  3. Kirjoita teksti, jonka pos_tag haluat laskea.
  4. Muunna kaikki sanat pieniksi kirjaimiksi ennen tokenisointia.
  5. Vie sanat word_tokenize-funktion läpi ja laske kunkin merkin pos_tag.
  6. Counter laskee sitten kunkin tagin kokonaisesiintymisten määrän tekstissä.

Taajuuden jakelu

Frekvenssijakauma viittaa siihen, kuinka monta kertaa kokeen tulos toistuu. Sitä käytetään kunkin sanan esiintymistiheyden löytämiseen dokumentissa. Se käyttää FreqDist luokka, jonka määrittelee nltk.todennäköisyys moduuli. Määrää kasvatetaan yhdellä joka kerta, kun näyte esiintyy.

Minkä tahansa sanan kohdalla voimme tarkistaa, kuinka monta kertaa se esiintyi dokumentissa. Esimerkiksi:

  • Laskutapa: freq_dist.count('and') palauttaa 'and'-operaattorin esiintymiskertojen lukumäärän. Sitä kutsutaan count-metodiksi.
  • Taajuusmenetelmä: freq_dist.freq('and') palauttaa annetun näytteen taajuuden.

Kirjoitamme pienen ohjelman, joka laskee kunkin sanan esiintymistiheysjakauman tekstissä.

import nltk
a = "Guru99 is the site where you can find the best tutorials for Software Testing     Tutorial, SAP Course for Beginners. Java Tutorial for Beginners and much more. Please     visit the site guru99.com and much more."
words = nltk.tokenize.word_tokenize(a)
fd = nltk.FreqDist(words)
fd.plot()

Koodin selitys:

  1. Tuo nltk-moduuli.
  2. Kirjoita teksti, jonka sanajakauman haluat löytää.
  3. Tokenisoi jokainen tekstin sana, joka toimii syötteenä nltk:n FreqDist-moduulille.
  4. Syötä jokainen sana nltk.FreqDist-muuttujaan listan muodossa.
  5. Piirrä sanat graafiin plot()-funktiolla.

HUOMAUTUS: matplotlib on asennettava kaavion näkemiseksi. Se laskee jokaisen sanan esiintymisen tekstissä ja auttaa tekstipohjaisessa mielipideanalyysissä. Keskeinen termi on ”tokenize”: tokenisoinnin jälkeen jokaista sanaa tarkistetaan sen määrittämiseksi, kuinka monta kertaa se esiintyi.

Kolokaatiot: Biggramit ja trigrammit

Kollokaatiot ovat sanapareja, jotka esiintyvät yhdessä useita kertoja dokumentissa. Se lasketaan suhteessa näiden parien lukumäärään dokumentin kokonaissanamäärään.

Tarkastellaan sanoja kuten ultraviolettisäteet ja infrapunasäteet. Sanoja ultravioletti ja säteet ei käytetä erikseen, joten niitä voidaan käsitellä rinnakkaissanana. Toinen esimerkki on tietokonetomografia (TT), koska emme sano TT:tä ja skannausta erikseen. Rinnakkaissanat voidaan luokitella kahteen tyyppiin:

  • Biggrams: kahden sanan yhdistelmä
  • Trigrammit: kolmen sanan yhdistelmä

Bigrammit ja trigrammit tarjoavat merkityksellisempiä ja hyödyllisempiä ominaisuuksia esimerkiksi ominaisuustiedostolle.traction vaiheessa. Nämä ovat erityisen hyödyllisiä tekstipohjaisessa mielipideanalyysissä.

Bigrams-esimerkki Code:

import nltk
text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.bigrams(Tokens))
print(output)

lähtö:

[('Guru99', 'is'), ('is', 'totally'), ('totally', 'new'), ('new', 'kind'), ('kind', 'of'), ('of', 'learning'), ('learning', 'experience'), ('experience', '.')]

Trigrammiesimerkki Code:

Joskus on tärkeää nähdä kolmen sanan pari lauseessa tilastollista analyysiä ja esiintymistiheysten laskemista varten. Tällä on jälleen ratkaiseva rooli muodostumisessa NLP (luonnollisen kielen käsittely) ominaisuuksia sekä tekstipohjaista mielipiteen ennustamista. Samaa koodia käytetään trigrammien laskemiseen.

import nltk
text = "Guru99 is a totally new kind of learning experience."
Tokens = nltk.word_tokenize(text)
output = list(nltk.trigrams(Tokens))
print(output)

lähtö:

[('Guru99', 'is', 'totally'), ('is', 'totally', 'new'), ('totally', 'new', 'kind'), ('new', 'kind', 'of'), ('kind', 'of', 'learning'), ('of', 'learning', 'experience'), ('learning', 'experience', '.')]

Tunnisteiden merkitseminen

Lauseen merkitseminen tarkoittaa tunnisteiden, kuten verbin tai substantiivin, lisäämistä lauseen kontekstin perusteella. POS-tunnisteiden tunnistaminen on monimutkaista, joten yleisten tunnisteiden lisääminen manuaalisesti ei ole mahdollista, koska joillakin sanoilla on moniselitteisiä merkityksiä lauserakenteesta riippuen. Tekstin muuntaminen luetteloksi on tärkeä vaihe ennen tunnisteiden lisäämistä, koska jokainen sana toistetaan ja lasketaan tietylle tunnisteelle.

import nltk
text = "Hello Guru99, You have to build a very good site, and I love visiting your site."
sentence = nltk.sent_tokenize(text)
for sent in sentence:
	 print(nltk.pos_tag(nltk.word_tokenize(sent)))

Code Selitys:

  1. Code tuoda nltk (luonnollinen Language Toolkit, joka sisältää alimoduuleja, kuten lauseen tokenize ja sanan tokenize).
  2. Teksti, jonka tunnisteet tulostetaan.
  3. Lauseen tokenisointi.
  4. Toteutetaan for-silmukka, jossa sanat tokenisoidaan lauseesta ja kunkin sanan tagi tulostetaan tulosteena.

Korpuksessa on kahdenlaisia ​​POS-tunnisteita:

1. Sääntöpohjainen POS-tunniste: Epäselvän merkityksen omaavien sanojen kohdalla käytetään kontekstuaaliseen tietoon perustuvaa sääntöpohjaista lähestymistapaa. Se tehdään analysoimalla edellisen tai seuraavan sanan merkitys. Siksi sanat merkitään tietyn kielen kielioppisääntöjen, kuten isojen alkukirjainten ja välimerkkien, mukaisesti. Esimerkiksi Brillin tagger.

2. Stokastinen POS-tunniste: Tässä menetelmässä käytetään lähestymistapoja, kuten frekvenssiä tai todennäköisyyttä. Jos sana on enimmäkseen merkitty tietyllä tagilla harjoitusjoukossa, sille annetaan kyseinen tagi testilauseessa. Sanan tagi riippuu paitsi omasta tagistaan ​​myös edellisestä tagista, joten tämä menetelmä ei ole aina tarkka.

POS-merkintä piilotetulla Markov-mallilla

Tagien lisäämisongelmia voidaan mallintaa myös piilotetun Markov-mallin (HMM) avulla. Se käsittelee syötetokenit havaittavana sarjana, kun taas tagit katsotaan piilotetuiksi tiloiksi, ja tavoitteena on määrittää piilotettujen tilojen sarja. Esimerkiksi x = x1,x2,…,xn, jossa x on merkkijono ja y = y1,y2,y3,y4…yn on piilotettu sarja.

Kuinka piilotettu Markovin malli (HMM) toimii?

HMM käyttää yhteisjakaumaa P(x, y), jossa x on syötetokenien sarja ja y on tagisarja. Tagisarja x:lle on argmax yli y1…yn ja p(x1,x2,…xn,y1,y2,y3,…). Olemme luokitelleet tagit tekstistä, mutta tällaisten tagien tilastolliset tiedot ovat tärkeitä, joten seuraavaksi lasketaan nämä tagit tilastollista tutkimusta varten.

UKK

POS-tunnisteet merkitsevät jokaisen yksittäisen sanan sen sanaluokalla, kuten substantiivilla tai verbillä. Paloittelu menee askeleen pidemmälle ja ryhmittelee tunnisteilla merkityt sanat lausekkeiksi, kuten substantiivilausekkeiksi, mikä antaa lauseelle pinnallisen rakenteen.

Pintajäsennys, jota kutsutaan myös paloitteluun tai kevyeen jäsentämiseen, pitää juurien ja lehtien välillä enintään yhden tason. Se tunnistaa lausekkeiden rajat rakentamatta täyttä jäsennyspuuta, mikä tekee siitä nopeamman kuin syväjäsennys.

Sanaryhmien jakaminen lausekkeiksi, jolloin järjestelmä voi tunnistaa entiteettejä, kuten ihmisiä, sijainteja, päivämääriä tai tuotteita. Nimettyjen entiteettien tunnistus perustuu näihin osiin, jotta voidaan selvittää, mitä entiteettejä on.tracmerkityksellisiä arvoja raakatekstistä.

nltk.pos_tag()-funktio määrittää sanaluokkatunnisteet. Ensin tokenisoidaan teksti word_tokenize-funktiolla ja sitten token-luettelo välitetään pos_tag-funktiolle, joka palauttaa jokaisen sanan paritettuna tunnisteineen, kuten NN, VB tai JJ.

Kyllä. Nykyaikaiset koneoppimisella ja syvillä neuroverkoilla koulutetut tekoälytunnisteet ratkaisevat monitulkintaisia ​​sanoja oppimalla kontekstia laajoista korpuksista, mikä saavuttaa paremman tarkkuuden kuin sääntöpohjaiset menetelmät reaalimaailman tekstissä.

Stokastiset tägit käyttävät harjoitusdatasta opittua todennäköisyyttä. Koneoppiminen arvioi, kuinka todennäköinen kukin tägi on sanalle ympäröivien tägien perusteella, ja valitsee sitten sekvenssin, jolla on suurin kokonaistodennäköisyys.

Lisäksi NLTKsuosittuja vaihtoehtoja ovat mm. spacy nopeisiin tuotantoputkiin, Stanford CoreNLP ja Hugging Face Transformers muuntajapohjaiseen merkitsemiseen.

Palakieliopissa piste vastaa mitä tahansa merkkiä paitsi rivinvaihtoa, tähti vastaa nollaa tai useampaa toistoa ja kysymysmerkki vastaa nollaa tai yhtä toistoa edellisestä POS-tagikuviosta.

Tiivistä tämä viesti seuraavasti: