Skip to content

Kişisel Asistanınız ile Yeni Keşiflere Hazır Olun!

License

Notifications You must be signed in to change notification settings

Susam-Sokagi/Muze-Asistani

Repository files navigation

Open Source Love svg3 acik-hack-2020 made-with-python made-with-python GitHub visitors


GitHub contributors GitHub commit activity GitHub code size in bytes GitHub repo size GitHub language count GitHub last commit GitHub


GitHub Pipenv locked Python version GitHub Pipenv locked dependency version GitHub Pipenv locked dependency version GitHub Pipenv locked dependency version GitHub Pipenv locked dependency version GitHub Pipenv locked dependency version


Logo

Müze Asistanı

Açık Hack '20

Demo · Sunum · Model

Kullanım · QR Kod

Hata Bildir

İçindekiler

Proje Hakkında

Problem

Müzelerde ziyaretçilerin eserler ve tarihi olaylar hakkında bilgi edinmede sıkıntı çekmesi, bilgi edinmek için kişi veya kaynak bulmakta zorlanılması. Bu yüzden müze memnuniyetinin düşmesine ve kötü görüşler oluşmasına sebep olur.

Proje Fikri

Müze ziyaretçileri ile interaktif iletişime geçen ve müze hakkında bilgi sağlayan bir bireysel asistan geliştirmeyi hedefliyoruz.

BERT

2018 yılında, Google Bidirectional Encoder Representations from Transformers, kısaca BERT olarak bahsedilen modelini duyurdu. Adından da anlaşıldığı üzere cümleyi hem soldan sağa hem de sağdan sola olarak değerlendiriyor. Bu özelliği ile diğer modellere kıyasla, anlamı ve kelimelerin birbiriyle olan ilişkileri daha iyi çıkarmayı planlıyor ve bunu başarıyor.

BERT, çift-yönlü olması dışında Masked Language Modeling (MLM) ve Next Sentence Prediction (NSP) adı verilen iki teknikle eğitiliyor. İlk teknikte, cümle içerisindeki kelimeler arasındaki ilişki üzerinde durulurken, ikinci teknik olan NSP’de ise cümleler arasındaki ilişki kurulur. Training esnasında ikili olarak gelen cümle çiftinde, ikinci cümlenin ilk cümlenin devamı olup olmadığı tahmin edilir. Bu teknikten önce ikinci cümlelerin %50'si rastgele değiştirilir, %50'si ise aynı şekilde bırakılır. Training esnasındaki optimizasyon, bu iki tekniğin kullanılırken ortaya çıkan kaybın minimuma indirilmesidir.

BERT 800M kelime hazinesine sahip olan BookCorpus ve 2.5B kelime hazinesine sahip olan Wikipedia veriseti kullanılarak bert_large ve bert_base adı verilen 2 temel modele sahiptir. BERT kendi başına GLM adı verilen, birden fazla problemde kullanılabilecek şekilde tasarlanmış bir model.

Neden BERT ?

  • Çift yönlü kodlayıcı, BERT’i OpenAI GPT’den ve ELMo’dan ayırır.
  • 24 Transformer bloğu, 1024 gizli katmanı ve 340M parametresi ile oldukça büyük bir modeldir.
  • BooksCorpus (800 milyon kelime) ve İngilizce Wikipedia (2.5 milyar kelime) dahil, toplam 3.3 milyar kelimelik bir korpus üzerinden 40 epoch ile önceden eğitilmiştir.
  • Herhangi bir kelimenin sağındaki ve solundaki kelimelerle olan ilişkisini çok iyi kavrıyor ve MLM ve NSP sayesinde içeriği iyi bir şekilde öğreniyor.
  • Türkçe dil desteğine sahip, önceden eğitilmiş bir modeldir.

Tüm bu sebeplerden kaynaklı olarak biz Google tarafından geliştirilen BERT modelini kullanıyoruz.

BERT ile Soru-Cevap

Bu projenin merkezi soru-cevap işlemine dayanmaktadır. Modelimizin çalışmasını inceleyecek olursak.

soru = "Tablonun boyutu"

acıklama_metni = '''Mona Lisa tablosunda resmedilmiş kişinin gerçek ismi Lisa Gherardini.
 Mona Lisa, “benim kadınım Lisa” anlamına geliyor. 
 Orijinal tablonun boyutları 77×53 cm. '''

Açıklama metinimiz ve sorumuzu tanımladık. Önceden eğitilmiş modelimiz sayesinde sorunun cevabını bulmaya çalışacağız. Bunun için model ve tokenizer işlemlerini yapmamız gerekmektedir.

output_dir = 'model'
model = BertForQuestionAnswering.from_pretrained(output_dir)
tokenizer = BertTokenizer.from_pretrained(output_dir)

Tanımlama işleminin ardından oluşturduğumuz fonksiyon aracılığı ile sorunun cevabını bulmaya çalışacağız.

answer, score = answer_question(soru, acıklama_metni)

Modelin bize verdiği cevap "77×53 cm ."

Modelin cevabı nasıl bulduğundan bahsetmek gerekirse,

baslangıc ve son

Verilen metinin içerisinden, her bir token'ın cevab cümlesini için başlangıç ve bitiş belirlemesi gerekmektedir. Soru ile metin uyumlu ise cevap dönecektir. Değil ise dönmeyecektir. Soru ve metin uyumlu olsa bile kelimelerin arasındaki ilişki cevap olma olasılını değiştirecektir.

Takım

GitHub contributors

Oğuzcan Turan Meva Akkaya Y. Burak Akkaş
SusamSokagi SusamSokagi SusamSokagi
Derin Öğrenme Geliştirici Derin Öğrenme Geliştirici Full Stack Geliştirici
github.com/canturan10 github.com/akkayameva github.com/burakakkas
linkedin.com/canturan10 linkedin.com/akkayameva linkedin.com/burakakkas
can.turan.10@gmail.com akkayameva@gmail.com burakakkas55@gmail.com

Başlangıç

Ön Şartlar

GitHub Pipenv locked Python version GitHub Pipenv locked dependency version GitHub Pipenv locked dependency version GitHub Pipenv locked dependency version GitHub Pipenv locked dependency version GitHub Pipenv locked dependency version

Bu, yazılımı kullanmak için gerekli olan kütüphaneleri yüklemelisiniz.

pip install -r requirements.txt

Veya

pip install Flask
pip install Flask-SQLAlchemy
pip install opencv-python
pip install transformers
pip install python-telegram-bot
pip install torch
pip install pyzbar

Kurulum

Web Uygulaması

Kullanılan Veri Tabanı ve Model'in doğru şekilde tanımlanması gerekmektedir. app.py dosyası içerisinde veritabanı ve model aşağıdaki gibi tanımlanır.

################ Tanımlama ################

logging.getLogger().setLevel(logging.INFO)

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

output_dir = 'model'
model = BertForQuestionAnswering.from_pretrained(output_dir)
tokenizer = BertTokenizer.from_pretrained(output_dir)

Web uygulamasının çalışması için '5000' portunun açık olması gerekmektedir. Eğer port müsait değilse,

if __name__ == '__main__':
    app.run(debug='true')

web uygulamamızı çalıstırmak için ihtiyaç duyduğumuz bu kod satırı açık olan portunuz ile aşağıdaki gibi güncellenebilir.

if __name__ == '__main__':
    app.run(debug='true', port=5050)

Sonrasında web uygulamamız çalışacaktır.

 * Serving Flask app "app.py"
 * Environment: development
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Telegram Botu

Kullanılan Model ve Telegram Bot Token'ının doğru şekilde tanımlanması gerekmektedir. bot.py dosyası içerisinde token ve model aşağıdaki gibi tanımlanır.

################ Tanımlama ################

logging.getLogger().setLevel(logging.INFO)
PHOTO, QUESTION = range(2)

TOKEN = "token"
updater = Updater(TOKEN, use_context=True)

output_dir = 'model'
model = BertForQuestionAnswering.from_pretrained(output_dir)
tokenizer = BertTokenizer.from_pretrained(output_dir)

Veri tabanı bağlantımızı sağlamak için aşağıdaki şekilde bağlantıyı sağlamalıyız.

################ DB Baglantısı ###############

connection = sqlite3.connect('database.db', check_same_thread=False)
cursor = connection.cursor()

Telegram botu oluşturma ve token elde etmek için buradan ilgili sayfaya ulaşabilirsiniz.

Sonrasından Telegram Botumuz çalışacaktır.

Kullanım

Tanıtım Videosu

Videoyu izlemek için gif'e tıklayabirsin. Yada buradan ulaşabilirsin.

Tanıtım Videosu Web

Tanıtım Videosu Telegram

Tanıtım Videosu Panel

QR Kod

Objelere ait QR kodlardan seçtiklerimiz aşağıdadır. Diğerlere buradan erişebilirsiniz.

Mona Lisa Tablosu

Çingene Kızı Mozaiği

Torquetum

Kaşıkçı Elması

Lisans

GitHub

Bu proje MIT lisanslıdır.

Referanslar

Projenin geliştirilmesinde kullanılan kaynaklar aşağıdaki gibidir.

İletişim

Proje veya model ile ilgili sorun yaşarsanız bizlere ulaşabilirsiniz.

Teşekkür

Projemizin gelişiminde bizlere yardımcı olan sevgili mentörlerimize teşekkürü borç biliriz.

Copyright © 2020 Susam Sokağı.