Transformers documentation

Metin sınıflandırma

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Metin sınıflandırma

Metin sınıflandırma, metne bir etiket veya sınıf atayan yaygın bir NLP görevidir. En büyük şirketlerden bazıları, çeşitli pratik uygulamalar için metin sınıflandırmayı üretim ortamında çalıştırır. Metin sınıflandırmanın en popüler biçimlerinden biri, metin dizisine 🙂 olumlu, 🙁 olumsuz veya 😐 nötr gibi bir etiket atayan duygu analizi (sentiment analysis)dir.

Bu kılavuz size şunları gösterecektir:

  1. DistilBERT modelini, bir film eleştirisinin olumlu mu yoksa olumsuz mu olduğunu belirlemek üzere IMDb veri setinde ince ayarlayın.
  2. İnce ayarlanmış modelinizi çıkarım için kullanın.

Bu görevle uyumlu tüm mimarileri ve denetim noktalarını görmek için görev sayfasını kontrol etmenizi öneririz.

Başlamadan önce, gerekli tüm kütüphanelerin yüklendiğinden emin olun:

pip install transformers datasets evaluate accelerate

Modelinizi yükleyip toplulukla paylaşabilmeniz için Hugging Face hesabınıza giriş yapmanızı öneririz. İstendiğinde giriş yapmak için token'ınızı girin:

>>> from huggingface_hub import notebook_login

>>> notebook_login()

IMDb veri setini yükle

🤗 Datasets kütüphanesinden IMDb veri setini yükleyerek başlayın:

>>> from datasets import load_dataset

>>> imdb = load_dataset("stanfordnlp/imdb")

Sonra bir örneğe göz atın:

>>> imdb["test"][0]
{
    "label": 0,
    "text": "I love sci-fi and am willing to put up with a lot. Sci-fi movies/TV are usually underfunded, under-appreciated and misunderstood. I tried to like this, I really did, but it is to good TV sci-fi as Babylon 5 is to Star Trek (the original). Silly prosthetics, cheap cardboard sets, stilted dialogues, CG that doesn't match the background, and painfully one-dimensional characters cannot be overcome with a 'sci-fi' setting. (I'm sure there are those of you out there who think Babylon 5 is good sci-fi TV. It's not. It's clichéd and uninspiring.) While US viewers might like emotion and character development, sci-fi is a genre that does not take itself seriously (cf. Star Trek). It may treat important issues, yet not as a serious philosophy. It's really difficult to care about the characters here as they are not simply foolish, just missing a spark of life. Their actions and reactions are wooden and predictable, often painful to watch. The makers of Earth KNOW it's rubbish as they have to always say \"Gene Roddenberry's Earth...\" otherwise people would not continue watching. Roddenberry's ashes must be turning in their orbit as this dull, cheap, poorly edited (watching it without advert breaks really brings this home) trudging Trabant of a show lumbers into space. Spoiler. So, kill off a main character. And then bring him back as another actor. Jeeez! Dallas all over again.",
}

Bu veri setinde iki alan vardır:

  • text: film eleştirisinin metni.
  • label: olumsuz bir yorum için 0 veya olumlu bir yorum için 1 olan bir değer.

Ön işleme

Bir sonraki adım, text alanını ön işlemek için bir DistilBERT tokenizer yüklemektir:

>>> from transformers import AutoTokenizer

>>> tokenizer = AutoTokenizer.from_pretrained("distilbert/distilbert-base-uncased")

text dizelerini belirteçlere ayıran ve dizileri DistilBERT'in maksimum giriş uzunluğunu aşmayacak şekilde kısaltan bir ön işleme işlevi oluşturun:

>>> def preprocess_function(examples):
...     return tokenizer(examples["text"], truncation=True)

Tüm veri setine ön işleme fonksiyonunu uygulamak için 🤗 Datasets map fonksiyonunu kullanın. map işlemini hızlandırmak için batched=True ayarını yaparak veri setinin birden çok öğesini aynı anda işleyebilirsiniz:

tokenized_imdb = imdb.map(preprocess_function, batched=True)

Şimdi DataCollatorWithPadding kullanarak örneklerden oluşan bir batch oluşturun. Veri setinin tamamını maksimum uzunluğa kadar doldurmak yerine, collation sırasında cümleleri batch içindeki en uzun uzunluğa dinamik olarak doldurmak daha verimlidir.

>>> from transformers import DataCollatorWithPadding

>>> data_collator = DataCollatorWithPadding(tokenizer=tokenizer)

Değerlendir

Eğitim sırasında bir metrik kullanmak, modelinizin performansını değerlendirmek için genellikle faydalıdır. 🤗 Evaluate kütüphanesiyle bir değerlendirme yöntemini hızla yükleyebilirsiniz. Bu görev için accuracy metrikini yükleyin (metrik yükleme ve hesaplama hakkında daha fazla bilgi için 🤗 Evaluate hızlı turuna bakın):

>>> import evaluate

>>> accuracy = evaluate.load("accuracy")

Ardından, tahminlerinizi ve etiketlerinizi compute işlevine geçirerek doğruluğu hesaplayan bir işlev oluşturun:

>>> import numpy as np


>>> def compute_metrics(eval_pred):
...     predictions, labels = eval_pred
...     predictions = np.argmax(predictions, axis=1)
...     return accuracy.compute(predictions=predictions, references=labels)

compute_metrics fonksiyonunuz artık hazır ve eğitiminizi kurarken ona geri döneceksiniz.

Eğit

Modelinizi eğitmeye başlamadan önce, id2label ve label2id ile beklenen kimliklerin etiketlere eşlenmesini oluşturun:

>>> id2label = {0: "NEGATIVE", 1: "POSITIVE"}
>>> label2id = {"NEGATIVE": 0, "POSITIVE": 1}

Trainer ile bir modeli ince ayar yapma konusunda deneyiminiz yoksa, temel öğreticiyi burada inceleyebilirsiniz!

Artık modelinizi eğitmeye hazırsınız! AutoModelForSequenceClassification ile DistilBERT'i, beklenen etiket sayısı ve etiket eşlemeleriyle birlikte yükleyin:

>>> from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer

>>> model = AutoModelForSequenceClassification.from_pretrained(
...     "distilbert/distilbert-base-uncased", num_labels=2, id2label=id2label, label2id=label2id
... )

Bu noktada yalnızca üç adım kaldı:

  1. Eğitim hiperparametrelerinizi TrainingArguments içinde tanımlayın. Tek zorunlu parametre, modelin nereye kaydedileceğini belirleyen output_dir'dir. Modeli Hub'a push_to_hub=True ayarlayarak yükleyeceksiniz (modelinizi yüklemek için Hugging Face'e giriş yapmış olmanız gerekir). Her epoch'un sonunda Trainer, doğruluğu değerlendirir ve eğitim checkpoint'ini kaydeder.
  2. Eğitim argümanlarını, model, veri seti, tokenizer, veri toplayıcı ve compute_metrics fonksiyonuyla birlikte Trainer'a iletin.
  3. Modelinizi ince ayar yapmak için train() çağrın.
>>> training_args = TrainingArguments(
...     output_dir="my_awesome_model",
...     learning_rate=2e-5,
...     per_device_train_batch_size=16,
...     per_device_eval_batch_size=16,
...     num_train_epochs=2,
...     weight_decay=0.01,
...     eval_strategy="epoch",
...     save_strategy="epoch",
...     load_best_model_at_end=True,
...     push_to_hub=True,
... )

>>> trainer = Trainer(
...     model=model,
...     args=training_args,
...     train_dataset=tokenized_imdb["train"],
...     eval_dataset=tokenized_imdb["test"],
...     processing_class=tokenizer,
...     data_collator=data_collator,
...     compute_metrics=compute_metrics,
... )

>>> trainer.train()

Trainer, tokenizer parametresini ona geçirdiğinizde varsayılan olarak dinamik dolgu uygular. Bu durumda bir veri toplayıcıyı (data collator) açıkça belirtmenize gerek yoktur.

Eğitim tamamlandıktan sonra, modelinizi herkesin kullanabilmesi için push_to_hub() yöntemiyle Hub'a paylaşın:

>>> trainer.push_to_hub()

Metin sınıflandırma için bir modelin nasıl ince ayarlanacağına dair daha ayrıntılı bir örnek için ilgili PyTorch defterine göz atın.

Çıkarım

Harika, bir model ayarladıktan sonra artık çıkarım için kullanabilirsiniz!

Çıkarım (inference) çalıştırmak istediğiniz bazı metin alın:

>>> text = "This was a masterpiece. Not completely faithful to the books, but enthralling from beginning to end. Might be my favorite of the three."

Eğitimini tamamladığınız modeli çıkarım için denemenin en basit yolu, onu bir pipeline() içinde kullanmaktır. Modelinizle duygu analizi için bir pipeline örneği oluşturun ve metninizi ona iletin:

>>> from transformers import pipeline

>>> classifier = pipeline("sentiment-analysis", model="stevhliu/my_awesome_model")
>>> classifier(text)
[{'label': 'POSITIVE', 'score': 0.9994940757751465}]

İsterseniz pipeline sonuçlarını manuel olarak da yeniden üretebilirsiniz:

Metni tokenleştirin ve PyTorch tensörlerini döndürün:

>>> from transformers import AutoTokenizer

>>> tokenizer = AutoTokenizer.from_pretrained("stevhliu/my_awesome_model")
>>> inputs = tokenizer(text, return_tensors="pt")

Girdilerinizi modele iletin ve logits değerlerini döndürün:

>>> import torch
>>> from transformers import AutoModelForSequenceClassification

>>> model = AutoModelForSequenceClassification.from_pretrained("stevhliu/my_awesome_model")
>>> with torch.no_grad():
...     logits = model(**inputs).logits

En yüksek olasılığa sahip sınıfı alın ve modelin id2label eşlemesini kullanarak bunu bir metin etiketine dönüştürün:

>>> predicted_class_id = logits.argmax().item()
>>> model.config.id2label[predicted_class_id]
'POSITIVE'
Update on GitHub