Lemmatisaatio Sanaluokkien Tunnistamisen Avulla
Englannin kielessä on runsaasti sanoja, jotka voivat toimia useina sanaluokkina eri merkityksissä. Esimerkiksi "running" voi olla verbi ("He is running.") tai substantiivi ("Running is fun.").
Kuten olemme jo nähneet, lemmatisaattori voi palauttaa sanan oikeaan perusmuotoon vain, jos se tietää sanan sanaluokan kyseisessä kontekstissa. Sanaluokkien tunnistus (POS tagging) tarjoaa tämän kontekstin, mikä tekee lemmatisaatiosta tarkempaa.
Lemmatisaatio sanaluokkien tunnistuksen avulla NLTK:ssa
Koska olemme jo tutustuneet molempiin tekniikoihin erikseen, on aika yhdistää ne. On kuitenkin yksi tärkeä seikka huomioitavana: pos_tag-funktion ja WordNet Lemmatizer -työkalun odottamien sanaluokkien tunnisteiden muoto eroavat toisistaan.
NLTK:n pos_tag-funktio käyttää Penn Treebank -tunnistejoukkoa, joka sisältää laajan valikoiman tunnisteita yksityiskohtaiseen kieliopilliseen luokitteluun. WordNet Lemmatizer puolestaan odottaa sanaluokkien tunnisteita yksinkertaistetussa muodossa, joka vastaa WordNetin omaa luokittelua. Se erottaa ainoastaan substantiivit ('n'), verbit ('v'), adjektiivit ('a' tai 's' satelliittiadjektiiveille) ja adverbit ('r').
Muunnosprosessi sisältää yksityiskohtaisten Penn Treebank -tunnisteiden muuttamisen laajemmiksi kategorioiksi, jotka WordNet tunnistaa. Esimerkiksi sekä 'VBD' (verbin imperfekti) että 'VBG' (gerundi tai nykyhetken partisiippi) Penn Treebankista muutetaan 'v' (verbi) -muotoon, kun niitä käytetään WordNet Lemmatizerissa.
Kirjoitetaan funktio tätä tarkoitusta varten:
from nltk.corpus import wordnet as wn
def get_wordnet_pos(treebank_tag):
if treebank_tag.startswith('J'):
return wn.ADJ
elif treebank_tag.startswith('V'):
return wn.VERB
elif treebank_tag.startswith('R'):
return wn.ADV
else:
# Default to noun if no match is found or starts with 'N'
return wn.NOUN
Tämä funktio tarkistaa yksinkertaisesti Penn Treebank -tunnisteen ensimmäisen kirjaimen: jos se on 'J', palautetaan WordNet-tunniste adjektiiveille; jos 'V', verbeille; jos 'R', adverbeille. Kaikissa muissa tapauksissa, mukaan lukien kun tunniste alkaa 'N' tai ei täsmää mihinkään määriteltyyn ehtoon, palautetaan oletuksena WordNet-tunniste substantiiveille.
Koodissa näkyvät ADJ, VERB ja muut vakiot ovat peräisin WordNetistä. Niiden arvot ovat ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.
Tämän funktion avulla suoritetaan lemmatisaatio POS-tunnisteiden kanssa:
123456789101112131415161718192021222324252627282930313233from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize from nltk import pos_tag from nltk.corpus import wordnet as wn import nltk nltk.download('wordnet') nltk.download('averaged_perceptron_tagger_eng') nltk.download('punkt_tab') # Initialize the lemmatizer lemmatizer = WordNetLemmatizer() # Function to map NLTK's POS tags to the format used by the WordNet lemmatizer def get_wordnet_pos(treebank_tag): if treebank_tag.startswith('J'): return wn.ADJ elif treebank_tag.startswith('V'): return wn.VERB elif treebank_tag.startswith('R'): return wn.ADV else: # Default to noun if no match is found or starts with 'N' return wn.NOUN text = "The leaves on the tree were turning a bright red, indicating that fall was leaving its mark." text = text.lower() tokens = word_tokenize(text) tagged_tokens = pos_tag(tokens) # Lemmatize each token with its POS tag lemmatized_tokens = [lemmatizer.lemmatize(token, get_wordnet_pos(tag)) for token, tag in tagged_tokens] print("Original text:", text) print("Lemmatized text:", ' '.join(lemmatized_tokens))
Kuten huomaat, ensin suoritimme sanaluokkien tunnistuksen käyttämällä pos_tag()-funktiota, minkä jälkeen käytimme list comprehension -rakennetta luodaksemme listan lemmatisoiduista sanoista soveltamalla lemmatize()-metodia nykyiseen tokeniin ja oikein muotoiltuun tunnisteeseen (käyttäen funktiotamme get_wordnet_pos(tag)) argumentteina. Emme tarkoituksella poistaneet stop-sanoja osoittaaksemme, että koodi käsittelee tehokkaasti kaikki tokenit.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 3.45
Lemmatisaatio Sanaluokkien Tunnistamisen Avulla
Pyyhkäise näyttääksesi valikon
Englannin kielessä on runsaasti sanoja, jotka voivat toimia useina sanaluokkina eri merkityksissä. Esimerkiksi "running" voi olla verbi ("He is running.") tai substantiivi ("Running is fun.").
Kuten olemme jo nähneet, lemmatisaattori voi palauttaa sanan oikeaan perusmuotoon vain, jos se tietää sanan sanaluokan kyseisessä kontekstissa. Sanaluokkien tunnistus (POS tagging) tarjoaa tämän kontekstin, mikä tekee lemmatisaatiosta tarkempaa.
Lemmatisaatio sanaluokkien tunnistuksen avulla NLTK:ssa
Koska olemme jo tutustuneet molempiin tekniikoihin erikseen, on aika yhdistää ne. On kuitenkin yksi tärkeä seikka huomioitavana: pos_tag-funktion ja WordNet Lemmatizer -työkalun odottamien sanaluokkien tunnisteiden muoto eroavat toisistaan.
NLTK:n pos_tag-funktio käyttää Penn Treebank -tunnistejoukkoa, joka sisältää laajan valikoiman tunnisteita yksityiskohtaiseen kieliopilliseen luokitteluun. WordNet Lemmatizer puolestaan odottaa sanaluokkien tunnisteita yksinkertaistetussa muodossa, joka vastaa WordNetin omaa luokittelua. Se erottaa ainoastaan substantiivit ('n'), verbit ('v'), adjektiivit ('a' tai 's' satelliittiadjektiiveille) ja adverbit ('r').
Muunnosprosessi sisältää yksityiskohtaisten Penn Treebank -tunnisteiden muuttamisen laajemmiksi kategorioiksi, jotka WordNet tunnistaa. Esimerkiksi sekä 'VBD' (verbin imperfekti) että 'VBG' (gerundi tai nykyhetken partisiippi) Penn Treebankista muutetaan 'v' (verbi) -muotoon, kun niitä käytetään WordNet Lemmatizerissa.
Kirjoitetaan funktio tätä tarkoitusta varten:
from nltk.corpus import wordnet as wn
def get_wordnet_pos(treebank_tag):
if treebank_tag.startswith('J'):
return wn.ADJ
elif treebank_tag.startswith('V'):
return wn.VERB
elif treebank_tag.startswith('R'):
return wn.ADV
else:
# Default to noun if no match is found or starts with 'N'
return wn.NOUN
Tämä funktio tarkistaa yksinkertaisesti Penn Treebank -tunnisteen ensimmäisen kirjaimen: jos se on 'J', palautetaan WordNet-tunniste adjektiiveille; jos 'V', verbeille; jos 'R', adverbeille. Kaikissa muissa tapauksissa, mukaan lukien kun tunniste alkaa 'N' tai ei täsmää mihinkään määriteltyyn ehtoon, palautetaan oletuksena WordNet-tunniste substantiiveille.
Koodissa näkyvät ADJ, VERB ja muut vakiot ovat peräisin WordNetistä. Niiden arvot ovat ADJ = 'a', ADJ_SAT = 's', ADV = 'r', NOUN = 'n', VERB = 'v'.
Tämän funktion avulla suoritetaan lemmatisaatio POS-tunnisteiden kanssa:
123456789101112131415161718192021222324252627282930313233from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize from nltk import pos_tag from nltk.corpus import wordnet as wn import nltk nltk.download('wordnet') nltk.download('averaged_perceptron_tagger_eng') nltk.download('punkt_tab') # Initialize the lemmatizer lemmatizer = WordNetLemmatizer() # Function to map NLTK's POS tags to the format used by the WordNet lemmatizer def get_wordnet_pos(treebank_tag): if treebank_tag.startswith('J'): return wn.ADJ elif treebank_tag.startswith('V'): return wn.VERB elif treebank_tag.startswith('R'): return wn.ADV else: # Default to noun if no match is found or starts with 'N' return wn.NOUN text = "The leaves on the tree were turning a bright red, indicating that fall was leaving its mark." text = text.lower() tokens = word_tokenize(text) tagged_tokens = pos_tag(tokens) # Lemmatize each token with its POS tag lemmatized_tokens = [lemmatizer.lemmatize(token, get_wordnet_pos(tag)) for token, tag in tagged_tokens] print("Original text:", text) print("Lemmatized text:", ' '.join(lemmatized_tokens))
Kuten huomaat, ensin suoritimme sanaluokkien tunnistuksen käyttämällä pos_tag()-funktiota, minkä jälkeen käytimme list comprehension -rakennetta luodaksemme listan lemmatisoiduista sanoista soveltamalla lemmatize()-metodia nykyiseen tokeniin ja oikein muotoiltuun tunnisteeseen (käyttäen funktiotamme get_wordnet_pos(tag)) argumentteina. Emme tarkoituksella poistaneet stop-sanoja osoittaaksemme, että koodi käsittelee tehokkaasti kaikki tokenit.
Kiitos palautteestasi!