Perangkat Bahasa Alami - Menggabungkan Pemberi Tag

Menggabungkan Pemberi Tag

Menggabungkan penanda atau rantai penanda satu sama lain adalah salah satu fitur penting dari NLTK. Konsep utama di balik penggabungan tagger adalah, jika satu pemberi tag tidak tahu cara memberi tag pada sebuah kata, kata itu akan diteruskan ke tagger yang dirantai. Untuk mencapai tujuan ini,SequentialBackoffTagger memberi kami Backoff tagging fitur.

Pemberian Tag Backoff

Seperti yang diceritakan sebelumnya, penandaan mundur adalah salah satu fitur penting dari SequentialBackoffTagger, yang memungkinkan kita untuk menggabungkan pemberi tag dengan cara yang jika satu pemberi tag tidak tahu cara memberi tag pada sebuah kata, kata tersebut akan diteruskan ke pemberi tag berikutnya dan seterusnya sampai tidak ada penanda mundur yang tersisa untuk diperiksa.

Bagaimana cara kerjanya?

Sebenarnya, setiap subclass dari SequentialBackoffTaggerdapat mengambil argumen kata kunci 'backoff'. Nilai argumen kata kunci ini adalah contoh lain dari aSequentialBackoffTagger. Sekarang kapanpun iniSequentialBackoffTaggerkelas diinisialisasi, daftar internal penanda backoff (dengan dirinya sendiri sebagai elemen pertama) akan dibuat. Selain itu, jika pemberi tag backoff diberikan, daftar internal pemberi tag backoff ini akan ditambahkan.

Pada contoh di bawah ini, kami mengambil DefaulTagger sebagai tagger backoff dalam resep Python di atas yang telah kita latih UnigramTagger.

Contoh

Dalam contoh ini, kami menggunakan DefaulTaggersebagai pemberi tag backoff. KapanpunUnigramTagger tidak dapat menandai kata, tagger backoff, yaitu DefaulTagger, dalam kasus kami, akan menandainya dengan 'NN'.

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)

Keluaran

0.9061975746536931

Dari keluaran di atas, Anda dapat mengamati bahwa dengan menambahkan tagger backoff keakuratannya meningkat sekitar 2%.

Menyimpan tagger dengan acar

Seperti yang telah kita lihat bahwa melatih tagger sangat tidak praktis dan juga membutuhkan waktu. Untuk menghemat waktu, kita dapat membuatkan tagger terlatih untuk digunakan nanti. Pada contoh di bawah ini, kita akan melakukan ini ke tagger yang sudah terlatih bernama‘Uni_tagger’.

Contoh

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)

Kelas NgramTagger

Dari diagram hierarki yang dibahas di unit sebelumnya, UnigramTagger diwarisi dari NgarmTagger kelas tetapi kami memiliki dua subclass lagi dari NgarmTagger kelas -

Subkelas BigramTagger

Sebenarnya sebuah ngram adalah kelanjutan dari n item, oleh karena itu, seperti namanya, BigramTaggersubclass melihat dua item. Item pertama adalah kata yang diberi tag sebelumnya dan item kedua adalah kata yang diberi tag saat ini.

Subclass TrigramTagger

Pada catatan yang sama tentang BigramTagger, TrigramTagger subclass melihat pada tiga item yaitu dua kata yang diberi tag sebelumnya dan satu kata yang diberi tag saat ini.

Praktis jika kita melamar BigramTagger dan TrigramTaggersubclass secara individual seperti yang kami lakukan dengan subclass UnigramTagger, keduanya berkinerja sangat buruk. Mari kita lihat pada contoh di bawah ini:

Menggunakan BigramTagger Subclass

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)

Keluaran

0.44669191071913594

Menggunakan Subclass TrigramTagger

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)

Keluaran

0.41949863394526193

Anda dapat membandingkan kinerja UnigramTagger, yang kami gunakan sebelumnya (memberikan akurasi sekitar 89%) dengan BigramTagger (memberikan akurasi sekitar 44%) dan TrigramTagger (memberikan akurasi sekitar 41%). Alasannya adalah Bigram dan Trigram taggers tidak dapat mempelajari konteks dari kata pertama dalam sebuah kalimat. Di sisi lain, kelas UnigramTagger tidak peduli dengan konteks sebelumnya dan menebak tag paling umum untuk setiap kata, sehingga dapat memiliki akurasi dasar yang tinggi.

Menggabungkan pemberi tag ngram

Dari contoh di atas, terlihat jelas bahwa Bigram dan Trigram taggers dapat berkontribusi jika kita menggabungkannya dengan backoff tagging. Pada contoh di bawah ini, kami menggabungkan penanda Unigram, Bigram, dan Trigram dengan penandaan backoff. Konsepnya sama dengan resep sebelumnya saat menggabungkan UnigramTagger dengan tagger backoff. Satu-satunya perbedaan adalah kita menggunakan fungsi bernama backoff_tagger () dari tagger_util.py, yang diberikan di bawah ini, untuk operasi backoff.

def backoff_tagger(train_sentences, tagger_classes, backoff=None):
   for cls in tagger_classes:
      backoff = cls(train_sentences, backoff=backoff)
   return backoff

Contoh

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)

Keluaran

0.9234530029238365

Dari keluaran di atas, kita dapat melihatnya meningkatkan akurasi sekitar 3%.