Zestaw narzędzi języka naturalnego - Unigram Tagger

Co to jest Unigram Tagger?

Jak sama nazwa wskazuje, unigram tagger to tagger, który używa tylko jednego słowa jako kontekstu do określenia tagu POS (Part-of-Speech). Krótko mówiąc, Unigram Tagger to tagger kontekstowy, którego kontekstem jest pojedyncze słowo, czyli Unigram.

Jak to działa?

NLTK udostępnia moduł o nazwie UnigramTaggerw tym celu. Zanim jednak zagłębimy się w jego działanie, zapoznajmy się z hierarchią za pomocą poniższego diagramu -

Z powyższego schematu wynika, że UnigramTagger jest dziedziczona z NgramTagger który jest podklasą ContextTagger, który dziedziczy z SequentialBackoffTagger.

Działanie UnigramTagger wyjaśniono za pomocą następujących kroków -

  • Jak widzieliśmy, UnigramTagger dziedziczy z ContextTagger, implementuje context()metoda. Tocontext() metoda przyjmuje te same trzy argumenty, co choose_tag() metoda.

  • Wynik context()method będzie słowem tokenem, który będzie dalej używany do tworzenia modelu. Po utworzeniu modelu token słowny jest również używany do wyszukiwania najlepszego tagu.

  • W ten sposób, UnigramTagger zbuduje model kontekstu z listy tagowanych zdań.

Szkolenie Unigram Taggera

NLTK UnigramTaggermożna trenować, podając listę oznaczonych zdań w momencie inicjalizacji. W poniższym przykładzie użyjemy otagowanych zdań korpusu banku drzew. Będziemy używać pierwszych 2500 zdań z tego korpusu.

Przykład

Najpierw zaimportuj moduł UniframTagger z nltk -

from nltk.tag import UnigramTagger

Następnie zaimportuj korpus, którego chcesz użyć. Tutaj używamy korpusu banków drzew -

from nltk.corpus import treebank

Teraz weź zdania w celach szkoleniowych. Bierzemy pierwsze 2500 zdań w celach szkoleniowych i oznaczymy je -

train_sentences = treebank.tagged_sents()[:2500]

Następnie zastosuj UnigramTagger na zdaniach używanych do celów szkoleniowych -

Uni_tagger = UnigramTagger(train_sentences)

Weź kilka zdań, równych lub mniejszych, przyjętych w celach szkoleniowych, tj. 2500, w celu sprawdzenia. Tutaj bierzemy pierwsze 1500 do celów testowych -

test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sents)

Wynik

0.8942306156033808

Tutaj uzyskaliśmy około 89-procentową dokładność dla taggera, który wykorzystuje wyszukiwanie pojedynczych słów do określenia tagu POS.

Kompletny przykład wdrożenia

from nltk.tag import UnigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Uni_tagger = UnigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)

Wynik

0.8942306156033808

Zastępowanie modelu kontekstu

Z powyższego diagramu przedstawiającego hierarchię dla UnigramTagger, znamy wszystkie taggery, które dziedziczą po ContextTagger, zamiast trenować samodzielnie, może skorzystać z gotowego modelu. Ten gotowy model jest po prostu słownikiem Pythona mapującym klucz kontekstowy do znacznika. I dlaUnigramTagger, klawisze kontekstu to pojedyncze słowa, a dla innych NgramTagger podklasy, będą to krotki.

Możemy przesłonić ten model kontekstu, przekazując inny prosty model do UnigramTaggerzajęcia zamiast przechodzenia zestawu treningowego. Zrozummy to za pomocą prostego przykładu poniżej -

Przykład

from nltk.tag import UnigramTagger
from nltk.corpus import treebank
Override_tagger = UnigramTagger(model = {‘Vinken’ : ‘NN’})
Override_tagger.tag(treebank.sents()[0])

Wynik

[
   ('Pierre', None),
   ('Vinken', 'NN'),
   (',', None),
   ('61', None),
   ('years', None),
   ('old', None),
   (',', None),
   ('will', None),
   ('join', None),
   ('the', None),
   ('board', None),
   ('as', None),
   ('a', None),
   ('nonexecutive', None),
   ('director', None),
   ('Nov.', None),
   ('29', None),
   ('.', None)
]

Ponieważ nasz model zawiera „Vinken” jako jedyny klucz kontekstowy, na powyższym wyjściu można zauważyć, że tylko to słowo ma tag, a każde inne słowo ma jako tag Brak.

Ustawienie minimalnego progu częstotliwości

Aby zdecydować, który tag jest najbardziej prawdopodobny w danym kontekście, plik ContextTaggerklasa używa częstotliwości występowania. Zrobi to domyślnie, nawet jeśli słowo kontekstu i tag występują tylko raz, ale możemy ustawić minimalny próg częstotliwości, przekazująccutoff wartość do UnigramTaggerklasa. W poniższym przykładzie przekazujemy wartość odcięcia w poprzedniej recepturze, w której trenowaliśmy UnigramTagger -

Przykład

from nltk.tag import UnigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Uni_tagger = UnigramTagger(train_sentences, cutoff = 4)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)

Wynik

0.7357651629613641