ODTÜ Bilgisayar Topluluğu ODTÜ Bilgisayar Topluluğu

Udemy Özel Sorusu

Udemy

Silikon vadisi merkezli Udemy adındaki şirketimizin amacı internet üzerinden öğrenmeyi ve öğretmeyi herkes icin çok kolay hale getirmek. Bunun için belirli konularda bilgi birikimi olan herhangi bir insanın kolaylıkla dersler açabilmesini sağlayan bir platform yaptık. Kendisini geliştirmek isteyen kullanıcılar da udemy.com üzerinden ilgili oldukları alanlarda dersler alabiliyorlar.

Udemy'de karşılaştğımız en önemli zorluklardan birisi insanları ilgi duydukları alanlarda derslerle buluşturmak. Bunun için kullanıcılardan ilgi alanlarını birden fazla etiketler halinde belirtmelerini istiyoruz. Örnek olarak benim ilgi alanlarım (etiketlerim): startups, web2.0 , technology , education , entrepreneurship , mathematics, chess.

İlgi alanları toplanırken ne kadar benzer kelimeler için önerilerde bulunsak da yazabilecekleri kelimelerin önü açık. Dolayısıyla kullanıcılar istedikleri kelimeyi yazabiliyorlar. Örnek olarak: http://www.udemy.com/join/email.html sayfasına bakabilirsiniz.

Benzer bir şekilde kullanıcılarda açtıkları her dersin hitap ettiği ilgi alanlarını girmelerini istiyoruz. Buna ek olarak kullanıcılardan dersi 2 seviyelik bir yapıda (Akademik > Matematik gibi) kategorilemelerini istiyoruz. Kategoriler, ilgi alanarının aksine, önceden belirlenmiş toplam 11 ana kategori ve 232 alt kategoriden oluşan bir listeden seciliyor. Örnek olarak http://www.udemy.com/course/create.html sayfasına bakabilirsiniz.

İlgi alanları verisi kullanıcılara dersler önermek için oldukça iyi bir veri olmasına rağmen şoyle bir probleme sahip. İlgi alanlarını kullanıcılar istedikleri gibi girebildikleri için birbirine anlam olarak benzeyen birçok ayrı kelimeler görebiliyorlar. Örneğin entrepreneur, entrepreneurs, entrepreneurship gibi gelimeler ayni ilgi alanını belirtseler de teknik olarak farklı girdiler. Ayrica startup, web 2.0, silicon valley gibi kelimeler de kabaca ayni ilgi alanını temsil ediyorlar. Bu durum kullanıcılardan doğrudan alınan ilgi alanlarının semantik olarak kullanılmasını oldukça güçleştiriyor.

Bu problemi çözmek için bu ilgi alanlarını dersler icin açılan kategorilerle eşleştirmek istiyoruz. Bu eşleştirmede her etiket en az 1 en fazla 3 adet kategoriye farklı ağırlıklarla eşleştirilebilir. Bu ağırlıkların herbirinin [0.0-1.0] aralığında olması ve her etiket icin toplamlarının 1.00'ı aşmaması gerekiyor.

Örneğin 'Social Marketing' etieti aşağıdaki kategorilere eşleştirilebilir.
'Business and Professional:Marketing and Advertising',0.6
'Technology and Internet:Social Media',0.4

Yarışmacılardan istenen yaklasik 900.000 adet etiket icin en iyi kategori eşleştirmesini yapmaları.

Bu eşleştirmeyi yapmak için yarışmacılar ilişkisel bir veritabanında duran aşağıdaki tablolardan yararlanabilirler:

udemy.sql için tıklayınız.

0. tag: [id,title]
Tüm etiketlerin listesi

1. course_category: [id,mainCategory,subCategory]
İki sevieyelik kategorilerin listesi (sql)

2. user_has_tag: [userId,tagId]
Hangi kullanıcının hangi ilgi alanlarını seçtiklerini gösteren tablo (sql)

3. course_has_tag: [courseId,tagId]
Hangi ders için hangi ilgi alanlarının girildiği verisini tutan tablo (sql)

4. course: [id,courseCategoryId]
Derslerin hangi kategoriye ait olduğunu gösteren tablo (sql)

5. course_has_user: [courseId,userId]
Hangi kullanıcının hangi dersi aldığını tutan tablo (sql)

İstenen çıktı:

Hangi etiketin (tag) hangi kategorilere hangi ağırlıkta eşleştirildiklerini tutan tablo (sql olarak)
{tagId,courseCategoryId,weight}

Ek olarak bu eşleştirmeyi nasıl yaptığınıza dair en fazla 1000 karakterlik bir açıklama ve kullandığınız kod parçalarını istiyoruz.

Değerlendirme

Eşleştirmeler değerlendirilirken aşağıdaki üc ayrı puanlama sistemi kullanılıp, bu puanlarin toplamı alınacaktır.

A) 100 adet rastgele seçilmiş etiketi Udemy çalışanları olarak birer kategoriye sokacağız. O etiket icin sizin koyduğunuz kategorilerden biri bizim koyduğumuz kategoriyle eşleşirse, eşleşen katogriye verilen ağırlığın yarısı kadar puan alacaksınız.
Bu kategoriden etiket başına en fazla 0.5, toplamda da en fazla 50 puan alınabilir.

B) 30 adet rastgele seçilmiş dersin kategorilerini, o dersin etiketleri için yarışmacının eşleştirdiği kategorilerle karşılaştıracağız. Dersin kategorisiyle tutan her etiket eşleştirmesindeki kategori için, o eşleştirmenin ağırlığı kadar puan alacaksiniz. Daha sonra bu puan o dersin etiket sayısına bölünecek.
Bu kategoriden ders başına en fazla 1.0, toplamda da en fazla 30 puan alınabilir.

C) Eşleştirme yönteminizi inceleyip 0-20 arasında bir puan vereceğiz. Bu puanlandırmada esas olan kullanılan algoritmaların karmaşıklığı değil, ne kadar kolay tekrar edilebilir ve otomatikleştirilebilir olduklarıdır. Örneğin top bu eşlestirmeyi tek bir program parçasını çalıştırıp otomatik olarak yapan bir kod gönderirseniz, bu kısımdan 20 tam puan alacaksınız.

A, B, C kısımlarından toplamda en fazla puanı alan yarışmacı ödülün sahibi olacak.

Eren Bali
CEO & Co-founder, Udemy

Udemy'de staj yapmak ister misiniz? http://www.udemy.com/careers


XIV. Programlama Yarışması
(c) ODTÜ Bilgisayar Topluluğu