Natural Language Toolkit - Kombinieren von Taggern
Tagger kombinieren
Das Kombinieren oder Verketten von Taggern untereinander ist eines der wichtigen Merkmale von NLTK. Das Hauptkonzept beim Kombinieren von Taggern besteht darin, dass ein Tagger, der nicht weiß, wie man ein Wort markiert, an den verketteten Tagger übergeben wird. Um diesen Zweck zu erreichen,SequentialBackoffTagger bietet uns die Backoff tagging Merkmal.
Backoff-Tagging
Wie bereits erwähnt, ist das Backoff-Tagging eines der wichtigsten Merkmale von SequentialBackoffTaggerDies ermöglicht es uns, Tagger so zu kombinieren, dass, wenn ein Tagger nicht weiß, wie man ein Wort markiert, das Wort an den nächsten Tagger usw. übergeben wird, bis keine Backoff-Tagger mehr zu überprüfen sind.
Wie funktioniert es?
Eigentlich jede Unterklasse von SequentialBackoffTaggerkann ein 'backoff'-Schlüsselwortargument annehmen. Der Wert dieses Schlüsselwortarguments ist eine weitere Instanz von aSequentialBackoffTagger. Wann immer diesSequentialBackoffTaggerWenn die Klasse initialisiert wird, wird eine interne Liste von Backoff-Taggern (mit sich selbst als erstem Element) erstellt. Wenn ein Backoff-Tagger angegeben wird, wird außerdem die interne Liste dieser Backoff-Tagger angehängt.
Im folgenden Beispiel nehmen wir DefaulTagger als Backoff-Tagger im obigen Python-Rezept, mit dem wir das trainiert haben UnigramTagger.
Beispiel
In diesem Beispiel verwenden wir DefaulTaggerals Backoff-Tagger. Wann immer dieUnigramTagger kann kein Wort markieren, Backoff-Tagger, dh DefaulTaggerIn unserem Fall wird es mit 'NN' markiert.
from nltk.tag import UnigramTagger
from nltk.tag import DefaultTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
back_tagger = DefaultTagger('NN')
Uni_tagger = UnigramTagger(train_sentences, backoff = back_tagger)
test_sentences = treebank.tagged_sents()[1500:]
Uni_tagger.evaluate(test_sentences)
Ausgabe
0.9061975746536931
Anhand der obigen Ausgabe können Sie feststellen, dass durch Hinzufügen eines Backoff-Taggers die Genauigkeit um etwa 2% erhöht wird.
Tagger mit Gurke speichern
Wie wir gesehen haben, ist das Training eines Taggers sehr umständlich und braucht auch Zeit. Um Zeit zu sparen, können wir einen geschulten Tagger für die spätere Verwendung auswählen. Im folgenden Beispiel werden wir dies mit unserem bereits trainierten Tagger namens tun‘Uni_tagger’.
Beispiel
import pickle
f = open('Uni_tagger.pickle','wb')
pickle.dump(Uni_tagger, f)
f.close()
f = open('Uni_tagger.pickle','rb')
Uni_tagger = pickle.load(f)
NgramTagger-Klasse
Aus dem in der vorherigen Einheit diskutierten Hierarchiediagramm UnigramTagger wird geerbt von NgarmTagger Klasse, aber wir haben zwei weitere Unterklassen von NgarmTagger Klasse -
BigramTagger-Unterklasse
Tatsächlich ist ein ngramm eine Teilsequenz von n Elementen, daher, wie der Name schon sagt, BigramTaggerUnterklasse betrachtet die beiden Elemente. Das erste Element ist das vorherige markierte Wort und das zweite Element ist das aktuelle markierte Wort.
TrigramTagger-Unterklasse
Aus dem gleichen Grund von BigramTagger, TrigramTagger Die Unterklasse befasst sich mit den drei Elementen, dh zwei vorherigen markierten Wörtern und einem aktuellen markierten Wort.
Praktisch, wenn wir uns bewerben BigramTagger und TrigramTaggerUnterklassen einzeln wie bei der UnigramTagger-Unterklasse weisen beide eine sehr schlechte Leistung auf. Lassen Sie uns in den folgenden Beispielen sehen:
Verwenden der BigramTagger-Unterklasse
from nltk.tag import BigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Bi_tagger = BigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Bi_tagger.evaluate(test_sentences)
Ausgabe
0.44669191071913594
Verwenden der TrigramTagger-Unterklasse
from nltk.tag import TrigramTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
Tri_tagger = TrigramTagger(train_sentences)
test_sentences = treebank.tagged_sents()[1500:]
Tri_tagger.evaluate(test_sentences)
Ausgabe
0.41949863394526193
Sie können die Leistung von UnigramTagger, die wir zuvor verwendet haben (mit einer Genauigkeit von ca. 89%), mit BigramTagger (mit einer Genauigkeit von ca. 44%) und TrigramTagger (mit einer Genauigkeit von ca. 41%) vergleichen. Der Grund ist, dass Bigram- und Trigram-Tagger den Kontext nicht aus den ersten Wörtern in einem Satz lernen können. Auf der anderen Seite kümmert sich die UnigramTagger-Klasse nicht um den vorherigen Kontext und errät das häufigste Tag für jedes Wort, wodurch eine hohe Grundliniengenauigkeit erzielt werden kann.
Ngram-Tagger kombinieren
Aus den obigen Beispielen geht hervor, dass Bigram- und Trigram-Tagger einen Beitrag leisten können, wenn wir sie mit Backoff-Tagging kombinieren. Im folgenden Beispiel kombinieren wir Unigram-, Bigram- und Trigram-Tagger mit Backoff-Tagging. Das Konzept ist das gleiche wie im vorherigen Rezept, während der UnigramTagger mit dem Backoff-Tagger kombiniert wird. Der einzige Unterschied besteht darin, dass wir die unten angegebene Funktion backoff_tagger () aus tagger_util.py für den Backoff-Betrieb verwenden.
def backoff_tagger(train_sentences, tagger_classes, backoff=None):
for cls in tagger_classes:
backoff = cls(train_sentences, backoff=backoff)
return backoff
Beispiel
from tagger_util import backoff_tagger
from nltk.tag import UnigramTagger
from nltk.tag import BigramTagger
from nltk.tag import TrigramTagger
from nltk.tag import DefaultTagger
from nltk.corpus import treebank
train_sentences = treebank.tagged_sents()[:2500]
back_tagger = DefaultTagger('NN')
Combine_tagger = backoff_tagger(train_sentences,
[UnigramTagger, BigramTagger, TrigramTagger], backoff = back_tagger)
test_sentences = treebank.tagged_sents()[1500:]
Combine_tagger.evaluate(test_sentences)
Ausgabe
0.9234530029238365
Aus der obigen Ausgabe können wir ersehen, dass sie die Genauigkeit um etwa 3% erhöht.