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