HuggingFace 🤗 ile Doğal Dil İşlemeye Giriş

Transformers ile NLP projelerini yapmak hiç bu kadar kolay olmamıştı.

Tirendaz Akademi
10 min readOct 7, 2023
Image by Freepik

ChatGPT, yapay zeka alanda bir oyun değiştirici oldu. Bu yapay zeka aracı, doğal dil işleme alanındaki teknikler ile geliştirildiği sır değil.

Peki doğal dil işleme nedir?

Doğal dil işleme, yapay zekanın bir alt alanıdır ve metin, ses verilerini analiz etmeyi amaçlar. Bu alan, İngilizce olarak kısaca NLP olarak ifade edilir.

NLP teknikleriyle insan dilini anlayabilir, yorumlayabilir ve manipüle edebilirsiniz.

Örneğin, bir e-maili, spam veya değil şeklinde sınıflandırma, sosyal medya gönderilerinin duygu analizini yapma, metin üretme, bir metni özetleme gibi görevleri doğal dil işleme teknikleri ile yapabilirsiniz.

Ama unutmayın doğal dil işleme sadece yazılı metinler ile uğraşmaz. Bu alanın computer vision yani bilgisayar görüşü ve speech recognition yani ses tanıma gibi alanlarda da uygulamaları vardır.

Örneğin bir resmi tanımlamak için metin oluşturma, ya da bir ses verisini metne çevirme gibi görevleri doğal dil işleme teknikleri ile yapabilirsiniz.

Şanslıyız ki doğal dil işleme analizleri yapmak için son zamanlarda harika kütüphaneler geliştirildi.

Bu kütüphanelerden biri de HuggingFace🤗 tarafından geliştirilen Transformers kütüphanesidir.

Transformers nedir?

Transformers, özellikle büyük dil modelleri ile çalışmak için harika bir kütüphanedir.

Sadece bir kaç satır kod yazarak evet yanlış duymadınız sadece bir kaç satır kod ile kolayca doğal dil işleme analizleri yapabilirsiniz.

Bu analizleri yapmak için yapmanız gereken önceden eğitilmiş bir modeli almak ve bu modeli kendi veri setinize göre ayarlamak.

İşte bu kadar.

2017 yılında geliştirilen Transformer mimarisi ile son zamanlarda BERT ve GTP modellerine dayanan birçok model geliştirildi.

Bu modelleri sıfırdan eğitmek için güçlü bilgisayarlar ve zaman gerekir. Amerika'yı tekrar keşfetmeye gerek yok değil mi? Bu önceden eğitilmiş modelleri Transformers kütüphanesi ile alıp kullanabilirsiniz. Böylece zamandan ve paradan tasarruf edersiniz.

Bu yazımızda Transformers ile pratik doğal dil işleme analizlerinin nasıl yapılacağını ele alacağız. Duygu analizi, zero-shot sınıflandırma, metin üretme, metindeki varlıkları bulma, soru-cevap, metin özetleme ve çeviri gibi görevleri pipeline ile nasıl yapılır inceleyeceğiz.

Kısaca Transformers ile 7 temel doğal dil işleme problemini çözeceğiz.

Bu analizler için Google ücretsiz olarak sunduğu Colab’ı kullanacağız. Ama isterseniz VS Code ya da Notebook da kullanabilirsiniz.

Doğal dil işleme analizlerini yaparken çok fazla matematiksel işlem yapıldığı için GPU gereklidir. Şanslıyız ki Colab bize ücretsiz GPU’yu desteği sağlar. Unutmadan ücretsiz GPU kullanmak için Kaggle platformunu da kullanabilirsiniz.

Hadi öncelikle Transformers kütüphanesini yükleyelim. pip ile bu kütüphaneyi yüklemek çok kolay. Yükleme yaparken ekrana çok fazla kod yazılmaması için -q flagını kullanalım.

!pip install -q transformers

Tamam Transformers yüklendi artık bu arkadaş ile analizler yapabiliriz.

Doğal dil işleme analizleri yapmak için en kolay yol pipeline kullanmaktır. Hadi bu sınıfı import edelim.

from transformers import pipeline

Harika, doğal dil işleme görevlerini yapmak her şey hazır. Artık ellerimizi kirletme vakti geldi.

Image by Author

1. Duygu analizi

Öncelikle duygu analizi ile başlayalım. Duygu analizi, pozitif veya negatif gibi bir metnin duygusunu çıkarmaktır. Bu analizi yapmak için pipeline’dan bir örnek alalım.

classifier = pipeline("sentiment-analysis")

Pipeline, duygu analizi için varsayılan bir ön eğitimli modeli ve bu modelin tokenizer’ını HuggingFace 🤗 Hub’dan indirdi ve önbelleğe yükledi. Artık bu objeyi istediğimiz metnin duygusunu çıkarmak için kullanabiliriz.

Hadi bir metin alalım ve bu metnin duygusunu bulalım.

text = "It's great to learn NLP for me"

Şimdi pipeline’ımız ile bu metnin duygusunu bulalım.

classifier(text)

# Output:
[{'label': 'POSITIVE', 'score': 0.999805748462677}]

Bu komutu çalıştırdığımızda metnin etiketi ve skoru ekrana yazılır. Bu çıktı bize metnin yüzde 99 olasılıkla pozitif olduğunu söylüyor.

Çok basit değil mi?

İsterseniz çıktıyı Pandas DataFrame formatına çevirebiliriz.

import pandas as pd
outputs = classifier("It's great to learn NLP for me.")
pd.DataFrame(outputs)

İşte etiket ve skor karşımıza geldi. Harika değil mi? Bir kaç satır kod ile duygu analizini yaptık.

Şimdi başka bir pipeline kullanarak zero-shot sınıflandırma nasıl yapılır bakalım.

2. Zero-Shot Sınıflandırma

Diyelim ki etiketi olmayan verileriniz var bu verileri sınıflandırmak istiyorsunuz. Bu analizi yapmak için bir zero-shot pipeline kullanabiliriz.

Genellikle ön eğitimli modeller eğitilirken etiketli veriler kullanılır. Size iyi haberim şu ki sınıflandırma yaparken modelin eğitildiği verilerin etiketlerini kullanmayabilirsiniz.

Bunun nasıl yapıldığını göstermek için hadi zero-shot-classification için bir pipeline alalım.

classifier = pipeline("zero-shot-classification")

Tamam, pipeline’ımızı ayarladık. Hadi sınıflama yapmak için bir metin alalım.

text = "This is a tutorial about Hugging Face."

Süper, metnimiz hazır. Şimdi aday etiketlerimizi belirleyelim.

candidate_labels = ["tech", "education", "business"]

Muhteşem, etiketlerimizi belirledik ve bir değişkene atadık. Şimdi pipeline’ımıza metni ve etiketleri verelim ve tahminleri DataFrame formatına çevirelim.

classifier(text, candidate_labels)
outputs = classifier(text, labels)
pd.DataFrame(outputs)

Gördüğünüz gibi etiketlerin olasılıkları yazıldı. En yüksek olasılıklı etiket education çıktı.

Dikkat ederseniz verimize göre modeli fine-tune etmeden tahmin yaptık. Pipeline direk olarak olasılık değerlerini hesapladı.

Hatırlayın, modelde etiketler yoktu etiketleri biz belirledik. Bundan dolayı bu analize zero-shot sınıflandırma denir.

Tamam, kendimiz etiketleri belirleyerek nasıl tahminler yaptırabileceğimizi gördük.

Hadi devam edelim ve metin üretme görevi nasıl yapılır bakalım.

3. Metin Üretme

İtiraf edelim hepimiz ChatGPT gibi yapay zeka araçları ile metin üretiyoruz.

Ama bazen bir konu hakkında kendiniz metin üretmek isteyebilirsiniz. Metin üretmenin amacı anlamlı cümleler oluşturmaktır. Bunu yapmak için önce bir pipeline oluşturalım.

generator = pipeline("text-generation")

Şimdi bu modele bir prompt verelim. Bunun için bir prompt oluşturalım.

prompt= "This tutorial will walk you through how to"

Şimdi bu promptu modele verelim ve metni otomatik olarak tamamlamasını isteyelim.

outputs = generator(prompt)
print(outputs)

# Output:
[{'generated_text': "This tutorial will walk you through how to create a basic application that allows you to start with a simple login experience through a browser window or similar.\n\nCreating a Simple App using Django's Web UI\n\nFirst, we'll build a simple app"}]

Gördüğünüz gibi pipeline’daki ön tanımlı model ile metin tamamlandı.

İsterseniz metnin uzunluğunu belirleyebilirsiniz. Hadi metnin uzunluğunu 50 ile sınırlandıralım. Ayrıca çıktının ilk bileşenini alalım. Böylece çıktıyı daha iyi görürüz.

outputs = generator(prompt, max_length=50)
print(outputs[0]['generated_text'])

# Output:
This tutorial will walk you through how to design your "troubleshooting" console (also known as "console manager"). All you have to do is configure your Console Manager via:

Veee ön tanımlı modele göre metin üretildi. Burada rasgele bir metin ürettik. Bu komutu her çalıştırdığımızda farklı bir metin üretilir.

İsterseniz farklı bir model ile metin üretebilirsiniz. HuggingFace 🤗 Hub da bir çok kullanabileceğiniz model var.

Hadi model hub’a gidelim.

HuggingFace 🤗 Hub

Sol taraftan metin üretme görevini seçelim. Model olarak GPT tabanlı bir model kullanmak isteyelim.

GPT kadar etkili ama biraz daha küçük distilgpt2 modelini arama kısmına yazalım.

Model kartta, bu modelin GPT2'nin daha küçük versiyonu olduğu yazıyor. Model hakkında diğer bilgileri bu karttan görebilirsiniz.

DistilGPT2

Hadi bu modeli kopyalayalım ve indirmek için pipeline kullanalım.

generator = pipeline("text-generation", model="distilgpt2")

Harika, modelimiz analiz için hazır. Hadi şimdi bu modele göre bir metin üretelim.

prompt= "This tutorial will walk you through how to"
outputs = generator(prompt, max_length=50)
print(outputs[0]['generated_text'])

# Output:
""""
This tutorial will walk you through how to achieve more details with the tutorials shown below.

Please also notice these links have the new default code:
1. Change the default code to the first command.
2. Change the default code to
"""

Gördüğünüz gibi spesifik bir model kullanarak verdiğimiz prompta göre metin üretildi.

Harika, metin üretme pratik şekilde nasıl yapılır gördük.

Hadi devam edelim ve varlık ismi tanıma denen NER görevini nasıl yapılır bakalım.

4. Named Entity Recognition (NER)

NER Analizi

Doğal dil işleme dünyasında ürünler, yerler, insanlar gibi gerçek dünya objeleri named entities yani isimlendirilmiş varlıklar olarak adlandırılır.

Bu objeleri, metinden çıkarmaya ise named entity recognition yani varlık ismi tespiti denir.

Bu yazıda bu analize kısaca NER diyelim.

NER ile bir metindeki isim, yer, ürün gibi objeleri etiketleyebiliriz.

Hadi basit bir metin alalım ve bu metindeki objelerin etiketlerini çıkarmak isteyelim.

Öncelikle NER analizi yapmak için bir pipeline oluşturalım.

ner = pipeline("ner", grouped_entities=True)

Tamam ön tanımlı modeli indirdik. Şimdi bir metin alalım.

text = "My name is Tirendaz from Turkey. HuggingFace is a nice platform."

Hadi bu metni pipeline’a verelim.

ner_tagger = pipeline(
"ner",
# Modelin tahminlere göre kelimeleri gruplaması için
aggregation_strategy="simple")

Ardından bulunan daha iyi görmek için sonuçları DataFrame formatına çevirelim.

import pandas
pd.DataFrame(outputs)

Gördüğünüz gibi metinde geçen yer, kişi, organizasyon isimleri bulundu.

Pipeline ile NER analizi yapmak ne kadar kolay oldu değil mi? Sadece bir kaç satır kod ile analizi bitirdik.

Hadi devam edelim ve soru-cevap analizleri nasıl yapılır bakalım.

5. Soru-Cevap

Soru-cevap projelerini yapmak için context olarak adlandırılan bir metin parçasını ve bir soruyu modele veririz. Model metne göre sorunun cevabını döndürür.

Bunu göstermek için hadi bir pipeline oluşturalım.

reader = pipeline("question-answering")

Şimdi bir metin alalım.

text = "My name is Tirendaz and I love Berlin."

Ardından bir soru oluşturalım.

question="Where do I like?"

Tamam, metin ve soru değişkenlerimizi oluşturduk. Şimdi bu değişkenleri pipeline’ımıza verelim.

outputs = reader( question=question, context=text)

Hadi sonucu daha iyi görmek için verileri DataFrame çevirelim.

pd.DataFrame([outputs])

Gördüğünüz gibi soru verdiğimiz metne göre cevaplandırıldı. Cevabın yeri bile gösterildi.

Harika değil mi? Pipeline ile soru cevap görevlerini bu şekilde yapıyoruz.

Dikkat ederseniz mantık hep aynı. Bir görev için pipeline oluştur. Bu pipeline ile analizi yap.

Hadi metin özetleme nasıl yapılır bakalım.

6. Metin Özetleme

Metin özetlemenin amacı bildiğiniz gibi uzun metinleri özetlemek. Bunun için modele bir metin veririz ve model, metnin özet bir versiyonunu bize verir.

Bu görev, diğer NLP görevlerinden daha kompleks. Ama bu görevi pipeline ile yapmak çok kolay. Bunu göstermek için öncelikle bir pipeline oluşturalım.

summarizer = pipeline("summarization")

Ardından bir metin alalım. Örneğin, Wikipedia’daki MrBeast başlığından bir parça kullanalım.

text =""" James Stephen Donaldson[b] (born May 7, 1998), known professionally as MrBeast (or Jimmy Donaldson), is an American YouTuber, entrepreneur and philanthropist. He is credited with pioneering a genre of YouTube videos that centers on expensive stunts and challenges.[12] With over 184 million subscribers as of September 18, 2023,[13] he is the most-subscribed individual user on the platform and the second-most-subscribed channel overall,[14][15] and has ranked on the Forbes list for the highest paid YouTube creator in 2022.[16]
Donaldson grew up in Greenville, North Carolina. He began posting videos to YouTube in early 2012, at the age of 13,[17] under the handle MrBeast6000. His early content ranged from Let's Plays to "videos estimating the wealth of other YouTubers".[18] He went viral in 2017 after his "counting to 100,000" video earned tens of thousands of views in just a few days, and he has become increasingly popular ever since, with most of his videos gaining tens of millions of views.[18] His videos, typically involving challenges and giveaways, became increasingly grand and extravagant.[19] Once his channel took off, Donaldson hired some of his childhood friends to co-run the brand. As of 2023, the MrBeast team is made up of over 250 people, including Donaldson himself.[20][21] Other than MrBeast, Donaldson runs the YouTube channels Beast Reacts, MrBeast Gaming, MrBeast 2 (formerly MrBeast Shorts),[22] and the philanthropy channel Beast Philanthropy.[23][24] He formerly ran MrBeast 3 (initially MrBeast 2), which is now inactive.[25][26] As of 2023, he is the highest paid YouTuber,[27] and has an estimated net worth of $500 million.[28]
Donaldson is the founder of MrBeast Burger and Feastables; and a co-creator of Team Trees, a fundraiser for the Arbor Day Foundation that has raised over $23 million;[29][30] and Team Seas, a fundraiser for Ocean Conservancy and The Ocean Cleanup that has raised over $30 million.[31] Donaldson won the Creator of the Year award four times at the Streamy Awards in 2020, 2021, 2022, and 2023; he also won the Favorite Male Creator award twice at the Nickelodeon Kids' Choice Awards in 2022 and 2023. In 2023, Time magazine named him as one of the world's 100 most influential people."""

Tamam özetlenecek metnimiz, text değişkenine atadık. Şimdi pipeline kullanarak özetleme yapalım.

outputs = summarizer(
text,
# Maksimum uzunluğu belirleyelim:
max_length=60,
# Çıktıdaki ekstra boşlukları kaldıralım:
clean_up_tokenization_spaces=True)

Tamam metnin özetini yaptırdık. Şimdi çıktıdaki ilk boyutun özet metnini görelim.

print(outputs[0]['summary_text'])

# Output:
"""
James Stephen Donaldson, known as MrBeast, is an American YouTuber, entrepreneur and philanthropist. He is credited with pioneering a genre of YouTube videos that centers on expensive stunts and challenges. With over 184 million subscribers as of September 18, 2023, he is the most
"""

Gördüğünüz gibi metin özetlenmiş oldu. Özet çok kötü değil mi? Pipeline ile özetleme görevini de bu şekilde yapmış olduk.

Hadi devam edelim ve en son çeviri görevi nasıl yapılır bakalım.

7. Çeviri

Çeviride bildiğiniz gibi bir dildeki bir metin alınır ve diğer dildeki bir metne çevrilir.

Bu görev bir seq-to-seq yani diziden diziye görevidir. Yani modele bir dizi veririz ve modelden bir dizi alırız.

Bunu göstermek için hadi bir pipeline alalım.

translator = pipeline("translation_en_to_de")

Tamam, pipeline’ımızı oluşturduk. Hadi devam edelim ve bir metin alalım.

text = "I hope you enjoy it."

Ve bu metnin çevirisini yapalım.

outputs = translator(text, clean_up_tokenization_spaces=True)
print(outputs[0]['translation_text'])

# Output:
Ich hoffe, Sie genießen es

Süper, gördüğünüz gibi çeviri yapıldı.

Sizde, istediğiniz bir dilden başka bir dile çeviri yapabilirsiniz.

Örneğin Türkçeden İngilizceye mi çeviri yapmak istiyorsunuz o zaman model hub gidin, bu görevi yapan modeli bulun ve pipeline’da bu modeli kullanın. İşte bu kadar basit.

Sonuç

HuggingFace 🤗 doğal dil işleme analizleri için harika bir platform. Bu platform içindeki Transformers kütüphanesi ile doğal dil işleme projelerinizi kolayca yapabilirsiniz.

Bu blog yazısında Transformers içindeki pipeline’lar ile doğal dil işleme görevleri, bir kaç kod satırı ile nasıl yapılır gördük.

HuggingFace 🤗 ekosistemi ile doğal dil işlemenin inceliklerini öğrenmek için Udemy kursumuzu şiddetle tavsiye ederim.

Aşağıdaki yazılar da dikkatinizi çekebilir.

Bu derste kullandığım notebook ’un linkine buradan ulaşabilirsiniz.

Hadi bağlanalım YouTube, Twitter, Instagram, Linkedin.

Gelecek makalelerde görüşmek üzere. Şimdilik hoşça kalın.

--

--