Keyif Modellemesi: Yapay Zekâ mı Makina Öğrenmesi mi? Peki Ya Televizyon?

0
FZ

Fakirin TV Film Tavsiyecisi

GÜNCELLEME: Debian ve Ubuntu kullanıcıları lütfen 32333 numaralı yoruma baksınlar!

Bu makalede bilgisayarın basit bir keyif modellemesi için nasıl kullanılabileceği anlatılacaktır. Modellenecek keyif yazarın yani benim keyfim olup ortaya çıkmış olan yazılım kolayca bir başkasının keyfinin modellenmesi için de kullanılabilir.

Problem ifadesi: Hemen her akşam eve gittiğimde televizyonda keyfime uygun bir film olup olmadığını öğrenmek istiyorum. Bu o kadar da hızlı yapabildiğim bir iş değil çünkü:
  • Internet'e bağlanıp ekolay televizyon sitesine girmem gerekiyor.
  • Oradan yabancı filmler kısmına gitmem gerekiyor.
  • Ardından tek tek film listesindeki linklere tıklayıp filmlere dair bilgi almam gerekiyor. Hangi kanalda hangi saatte olduğunu öğrendikten sonra bazen de IMDb puanına bakmam gerekiyor.
  • Bundan sonra düşünüp taşınıp o gece için izleyeceğim bir ya da birkaç filmi seçmem gerekiyor.

Toby Segaran'ın "Programming Collective Intelligence" kitabını ve fazlamesai.net'teki röportajını okuduktan sonra yukarıdaki işi benim yerime bilgisayarın yapabileceğini düşündüm ve bunun için makina öğrenme (machine learning) tekniklerini kullanan bir yazılım geliştirmeye başladım. Böylece ortaya çıkan yazılım benim yerime gidip film listesini inceleyebilecek ve benim tercihlerimi önceden öğrenmiş olarak bana o gün için güzel tavsiyelerde bulunabilecekti. Böylece tvrecommend sistemi doğdu. Aşağıda bu programın geliştirilmesine dair detayları bulacaksınız.

Baş aktörler: Python, SQLite, BeautifulSoup, IMDbPY, libsvm

Yukarıda bahsi geçen "makina öğrenme" sistemi ile keyfimi modelleyeceğim yazılımı Python ile geliştirmeye karar verdim. Bunun başlıca sebebi Segaran'ın Programming Collective Intelligence kitabında seçtiği dilin bu olması idi. Kitapta karşılaştığım ve denediğim Python kodlarını hemen hiçbir Python kılavuzuna bakmadan anlayabildiğim için çok bir zorluk çekmeyeceğimi düşündüm. Bir başka motivasyon faktörü ise geliştireceğim sistemde kullanmak istediğim işlev kütüphanelerinin Python için bulunması ve kolayca kullanılabilmeleri idi.

Veritabanı olarak kitaptaki örneklerin pratikliğinden feyz alarak ben de SQLite kullanmaya tercih ettim. SQLite veri tabanı bu iş için yeterince hızlı, basit ve pratik görünüyordu. Üstelik benim gibi günlük olarak .NET ve C# ortamında MS SQL Server Management tarzı gelişmiş GUI araçları kullanmaya alışmış biri için SQLite Studio, SQLite Spy gibi yönetim arayüzleri yeterince iyi sayılırdı (SQLite Spy tavsiyesi için FM editörü Kıvılcım Hindistan'a teşekkürler). Kullanmakta olduğum Python sürümü Python 2.5.1 olduğu için SQLite erişimi de standart olarak geliyordu ve

import sqlite3 as sqlite

ifadesi ile kolayca kullanılabiliyordu. Veritabanı yaratmak için alışık olduğum SQL ifadelerini yazmam yeterli olmuştu:


def create_db(dbname = "movie.db"):
    # Create the tables required for the movie database
    con = sqlite.connect(dbname)
    con.execute('CREATE TABLE Movie(movieID INTEGER PRIMARY KEY AUTOINCREMENT, title, \
          original_title, mtime, mdate DATE, url, channel, imdb_rating DOUBLE, isWatch INTEGER)')
    con.execute('CREATE INDEX Movieidx on Movie(movieID)')
    con.commit()
    con.close()

Şimdi sırada ekolay TV sitesine bağlanmak ve o günkü yabancı film listesini çekmek vardı. Ardından da tek tek listedeki filmlerin web adreslerini öğrenip, o URLleri ziyaret edip filme dair bilgileri elde etmek gerekiyordu. Burada da imdadıma Python için yazılmış olan HTML 'parser'ı Beautiful Soup yetişti. Beautiful Soup dosyasını çalıştığım dizine, yani tv.py dosyasının bulunduğu dizine kopyalayıp Python dosyasının da başına from BeautifulSoup import BeautifulSoup yazmam yeterli olmuştu. Böylece HTML olarak çektiğim film listesi sayfasında her türlü HTML ayıklama işini kolayca yapabilecektim:

today = datetime.date.today()
title_url = today.strftime("http://www.ekolay.net/televizyon/hp_list.asp?tur=18&tarih=%d.%m.%Y")
c = urllib2.urlopen(title_url)

soup = BeautifulSoup(c.read())

for tr in soup.findAll(attrs = {'style' : 'padding-top:5px;'}):
     time = tr('td')[0].contents.__str__()
     channel = tr('td')[3].contents.__str__()
     for link in tr('a'):
     .
     .
     .

Yani belli şartları sağlayan 'attribute'ları olan tr elementlerinin üzerinden dönüp onların da içindeki a yani link elementlerinin üzerinden dönüp film detayları ile ilgili bilgi barındıran web sayfa adreslerini ayıklamak mümkün olmuştu. Tabii diğer bilgiler için devreye biraz da kirli şekilde düzenli ifade kalıplarını (regular expressions) sokmak gerekmişti ancak Perl, awk, sed, JavaScript, vb. dillerden birini belli bir seviyenin üzerinde kullanmış hemen her programcının düzenli ifadeleri bildiğini var sayarak bunun üzerinde çok durmuyorum; tek gereklilik Python dosyasının başına import re satırını eklemek.

Beautiful Soup HTML parser ve düzenli ifadeler ile temel bilgilerin bir kısmını çektikten sonra sırada filmin IMDb puanını öğrenmek vardı. Ancak gerçek hayat dikensiz gül bahçesi değildi ve IMDb puanının öğrenmek için filmin orjinal ismi gerekiyordu. Maalesef ekolay tv sitesinden gelen HTML içinde yabancı film bilgisi tutarlı bir formatta bulunmadığı gibi bazen de hiç yazılmıyordu! Elimden geldiğince düzenli ifade kalıpları ile farkına vardığım örüntüleri yakalamaya çalıştım ancak her zaman filmin özgün ismini bulmak mümkün değildi. Mümkün olduğu durumlarda ise IMDb puanı önemli kriterdi ve bunu da yine Python ile öğrenmek çok kolaydı çünkü IMDbPY hızır gibi imdadıma yetişmişti. Debian GNU/Linux ve MS Windows ortamlarına kolayca kurulabilen bu Python paketi ile birkaç satır yazarak Python içinden IMDB sitesi ile konuşmak çok kolaylaşmıştı:


# Create the object that will be used to access the IMDb's database.
ia = imdb.IMDb() # by default access the web.

# Search for a movie (get a list of Movie objects).
s_result = ia.search_movie(movie_name)

# Print the long imdb canonical title and movieID of the results.
for item in s_result:
    print item['long imdb canonical title'], item.movieID

# Retrieves default information for the first result (a Movie object).
if len(s_result) > 0:
   first_result = s_result[0]
   ia.update(first_result)
   if (first_result.has_key('rating')):
      return first_result['rating']
   .
   .
   .

Tüm gerekli bilgileri aldıktan sonra bunları Movie sınıfından bir nesne aracılığı ile taşımak ve veri tabanına kaydetmek mümkün hale gelmişti. Movie sınıfının temel yapısı şöyle idi:


class Movie:
    #Initialize the crawler with the name of the database
    def __init__(self, title = "", original_title = "", url = "", time = "", date = "", channel = ""):
        self.title = title
        self.original_title = original_title
        self.url = url
        self.time = time
        self.date = date
        self.channel = channel
        # default IMDb rating is the mean value of [0.0, 10.0]
        self.imdb_rating = 5.0
        self.detail = ""

    def persist(self, dbname = "movie.db"):
        con = sqlite.connect(dbname)
        if (self.original_title == ""):
            con.execute("INSERT INTO Movie(title, original_title, mtime, mdate, url, channel, imdb_rating) \ 
	            VALUES ('%s', NULL, '%s', '%s', '%s', '%s', '%f')" %
                        (string.replace(self.title, "'", "_")
                        ,self.time
                        ,self.date
                        ,self.url
                        ,self.channel
                        ,self.imdb_rating))
        else:
            con.execute("INSERT INTO Movie(title, original_title, mtime, mdate, url, channel, imdb_rating) \ 
                   VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%f')" %
                        (string.replace(self.title, "'", "_")
                        ,string.replace(self.original_title, "'", "_")
                        ,self.time
                        ,self.date
                        ,self.url
                        ,self.channel
                        ,self.imdb_rating))
        con.commit()
        con.close()

Yukarıdaki sınıf sayesinde Movie sınıfından bir movie nesnesi yaratıp içine gerekli bilgileri doldurup sonra da movie.persist() ile bunu veritabanına yazabiliyordum ve şimdi sıra keyfimin modellenmesindeki kritik adımlardan birine gelmiştim: Sistemdeki veri tabanından o günkü filmler mevcuttu ve bunlar aynı zamanda bir HTML dosyasına da yazılmıştı ve web tarayıcımdaki bir bookmark ile sürekli güncel halini görebiliyordum ama bunlardan hangisini izleyecektim? Sistem hepsinin üzerinden geçmeli ve bana tek tek ilgili filmi izleyip izlemeyeceğimi sormalı ve bu bilgiyi de veritabanında isWatch gibi bir alanda saklamalıydı:


def update_db(dbname = "movie.db"):
    # Update the Movie table by asking the user if he/she will watch the film
    # http://initd.org/pub/software/pysqlite/doc/usage-guide.html#using-shortcut-methods
    isWatch = {}
    con = sqlite.connect(dbname)
    con.row_factory = sqlite.Row
    cur = con.cursor()
    cur.execute("SELECT movieID, title, url, original_title, mtime, mdate, isWatch \ 
                 FROM Movie WHERE mdate = DATE('NOW')")
    for row in cur:
        result = raw_input(row["title"] + " isimli filmi seyredecek misiniz? (E/H): ")
        if (string.upper(result.strip()) == 'E'):
            isWatch[row["movieID"]] = 1
        else:
            isWatch[row["movieID"]] = -1

    for key, value in isWatch.iteritems():        
        con.execute("UPDATE Movie SET isWatch = %s WHERE movieID = %s" % (value, key))
        con.commit()
    con.close()

Nihayet işin yapay zekâ / makina öğrenme ('machine learning') kısmı için gerekli tüm veri hazırdı. Artık bilgisayarı keyfimin kahyası haline getirebilir, keyfimi modelleyebilirdim. Bunun için kullanmayı seçtiğim yöntem SVM yani 'support vector machine' algoritması idi ve libsvm sayesinde de Python içinden kolayca kullanmak mümkündü (SVM'ye dair kısa Türkçe bilgi için: Ekşi Sözlük SVM maddesi). SVM ailesindeki sınıflandırma ve regresyon yöntemlerinin matematiğine dair gerçekten meraklı olanlar şu teknik kaynaklara bakabilirler: An Introduction to Support Vector Machines and Other Kernel-based Learning Methods ve Pattern Recognition and Machine Learning.

Eldeki veriyi SVM kullanarak sınıflandırmak için takip edilmesi gereken adımlar kısaca şu idi ( A practical guide to SVM classification [PDF] belgesinde de gayet güzel şekilde anlatıldığı gibi):

  1. Veriyi uygun şekilde vektör haline getir. Vektörün her bir elemanı reel sayı olmalıdır.
  2. Eğer kanal ismi gibi karakter tabanlı ve 'etiket' rolü gören bir özellik varsa bunu da sadece 1 ve 0'lardan oluşan bir vektör haline getir. Bu özellik içinde kaç farklı etiket varsa o kadar farklı vektör olacaktır, her vektörde sadece tek bir 1 olacaktır.
  3. Her özelliği aldığı tüm değerler üzerinden ölçekle ve [-1, 1] aralığına tasvir et. Böylece çok büyük aralıkta değişen değerler ile küçük aralıkta değişen değerler arasındaki fark mutlak değil oransal bir fark olsun. SVM böylece daha sağlıklı çalışacaktır.
  4. Böylece düzgün şekilde oluşturulmuş vektörlerin ait olduğu sınıfları sayısal değerlerini de sıralı şekilde bir araya getir (1: izle, -1: izleme) ve ilgili libsvm metodunu çağırıp modelin hesaplanmasını bekle

Yukarıdaki en kritik kısımlardan biri ölçekleme kısmı idi, bunun için Segaran'ın "Programming Collective Intelligence" kitabındaki scaledata fonksiyonunu biraz modifiye etmem yeterli oldu:


def scaledata(rows):
    low = [999999999.0] * len(rows[0])
    high = [-999999999.0]* len(rows[0])
    # Find the lowest and highest values
    for row in rows:
        d = row
        for i in range(len(d)):
            if d[i] < low[i]: low[i] = d[i]
            if d[i] > high[i]: high[i] = d[i]
    # Create a function that scales data
    def scaleinput(d):
        result = [0] * len(d)
        for i in range(len(low)):
            if (high[i] == low[i]):
                result[i] = low[i]
            else:
                result[i] = (d[i] - low[i]) / (high[i] - low[i])
        return result
    # Scale all the data
    newrows = [scaleinput(row) for row in rows]
    return newrows, scaleinput

Bir başka kritik kısım ise 'CNBC-e', 'ATV', 'FOX TV' gibi kanal isimlerini vektör haline getirmekti. Bunu basit bir Python 'dictionary' nesnesi ile kolayca halletmek mümkün olsa da ilerideki modifikasyonlarda esneklik sağlaması için yavaş bir fonksiyon halinde kodlamayı tercih ettim:


def channel_to_vector(channel):
    d = {}
    d['CNBC-E']     = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    d['TV 8']       = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    d['TRT2']       = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
    d['KANAL D']    = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
    d['FOX']        = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
    d['ATV']        = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]
    d['CINE-5']     = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
    d['SAMANYOLU']  = [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
    d['STAR']       = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]
    d['TRT1']       = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
    d['SHOW']       = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
    return d[channel]

Eksik Veri ile Keyif Nasıl Modellenir?

Buraya kadar her şey iyi güzel ama hatırlarsanız yukarıda hayatın dikensiz gül bahçesi olmadığını belirtmiş ve her film verisinden orjinal ismi çekemediğimi dolayısı ile IMDb puanını öğrenemediğimi vurgulamıştım. Makina öğrenmesi alanındaki en önemli meselelerden biri de 'kayıp veri' meselesi idi. Yani vektörde IMDb sütununa karşılık gelen yere hangi sayıyı yazacaktım veri tabanında onun değerinin NULL olduğunu gördüğümde? Bunun için çeşitli yöntemler mevcuttu. En basiti içinde NULL geçen filmleri çöpe atmaktı ama o zaman keyif modellemesini pek sağlıklı gerçekleştiremeyecektim, böyle pek çok film olabilirdi. Bir başka yöntem eksik veri barındıran vektörleri ve tüm veriyi barındıran vektörleri kıyaslayıp IMDb puan verisinin nasıl bir istatistiksel dağılımda olduğunu analiz etmek bir nevi veri madenciliği ('data mining') yapmaktı. Ancak Statistical Analysis with Missing Data kitabına biraz göz atınca bunun da çok basit bir iş olmadığını gördüm. Bu durumda ne sisteme çok zarar verecek ne de çok fazla iş yapmayı gerektirecek bir orta yol seçtim ve IMDb puanının öğrenemediğim filmlerin puanı olarak 5.0 değerini belirledim sabit olarak.

Artık libsvm'ye istediği formatta sevdiğim ve sevmediğim filmleri verip "benim sinema keyfimi öğren, çöz beni" diyebilecek hale gelmiştim (tabii tv.py dosyasının başına from svm import * satırını da eklediğimi belirteyim):


def create_svm_data(dbname = "movie.db"):
    rows = []
    answers = []
    con = sqlite.connect(dbname)
    con.row_factory = sqlite.Row
    cur = con.cursor()
    cur.execute("SELECT movieID, title, url, original_title, mtime, mdate, imdb_rating, \ 
                   channel, isWatch FROM Movie")
    for row in cur:
        r = []
        answers.append(row["isWatch"])
        r.append(string.atof(string.replace(row["mtime"], ":", "")))
        r.append(row["imdb_rating"])
        r.extend(channel_to_vector(row["channel"]))
        rows.append(r)
    con.close()        
    return answers, rows


def create_svm_model():
    a, r = create_svm_data()
    newr, scaleinput = scaledata(r)
    prob = svm_problem(a, newr)
    param = svm_parameter(kernel_type = LINEAR, C = 10)
    m = svm_model(prob, param)
    m.save("test.model")
    print "A support vector machine model has been created and saved as test.model."
    return

Artık 4-5 gün boyunca biriktirdiğim ve "bunu izlerim, bunu asla izlemem" dediğim film verisinden yola çıkarak oluşmuş SVM modeli yani tabiri caizse 'keyfim' diske 'test.model' dosyası olarak yazıldığına göre sıra yeni bir günde, yeni bir film listesinde sistemi denemeye gelmişti.

Bilgisayarın bana mantıklı film önerileri sunup sunamayacağını anlamanın tek yolu o günkü film verisini get_details() ile çekmek ve sonra da ilgili libsvm metoduna test.model dosyasını gösterip tek tek o günkü filmlerin vektörleştirilmiş hallerini verip 1 mi (izle) yoksa -1 mi (izleme) döndürdüğüne bakıp -1 olanları bir yere yazmak idi:


def predict_film(dbname='movie.db'):

    # Retrieve data that is not today
    # Use it to have scale function
    # Retrieve today's data
    # Scale it
    # pass it to test.model's predict

    rows = []
    answers = []
    predict_rows = []
    predict_film_details = []
    
    con = sqlite.connect(dbname)
    con.row_factory = sqlite.Row
    cur = con.cursor()
    cur.execute("SELECT movieID, title, url, original_title, mtime, mdate, imdb_rating, channel, \ 
                 isWatch FROM Movie WHERE mdate < DATE('NOW') AND isWatch IS NOT NULL")
    for row in cur:
        r = []
        answers.append(row["isWatch"])
        r.append(string.atof(string.replace(row["mtime"], ":", "")))
        r.append(row["imdb_rating"])
        r.extend(channel_to_vector(row["channel"]))
        rows.append(r)
    con.close()        

    newr, scaleinput = scaledata(rows)    

    con = sqlite.connect(dbname)
    con.row_factory = sqlite.Row
    cur = con.cursor()
    cur.execute("SELECT movieID, title, url, original_title, mtime, mdate, imdb_rating, channel, isWatch \ 
                  FROM Movie WHERE mdate = DATE('NOW')")
    for row in cur:
        r = []
        
        answers.append(row["isWatch"])

        r.append(string.atof(string.replace(row["mtime"], ":", "")))
        r.append(row["imdb_rating"])
        r.extend(channel_to_vector(row["channel"]))
        predict_rows.append(r)

        details = []
        details.append(row["movieID"])
        details.append(row["title"])
        details.append(row["url"])
        predict_film_details.append(details)
    con.close()
    
    m = svm_model("test.model")

    for i in range(len(predict_rows)):
        s = scaleinput(predict_rows[i])
        
	isWatch = m.predict(s)
        	
        if isWatch > -1.0:
            print "prediction : "
            print predict_rows[i]
            print predict_film_details[i]

Burada bahsi geçen tvrecommend sisteminin kurulum ve kullanım detaylarına http://tvrecommend.sourceforge.net adresinden erişebilirsiniz. Sistem halen yoğun olarak geliştirilme durumunda olduğu için sourceforge.net'teki 'download' işlevselliği yerine Subversion checkout ile edinmenizi öneririm.

İzlenimler ve Sonuçlar

Bu sistemi tamamen kişisel amaçlarım için günlük film tercihlerimi bilgisayara öğretip sonra bana sonraki günlerde bana mantıklı film tavsiyesinde bulunması için geliştirdim. Halihazırda sistem kullanım itibari ile yazılım geliştiricileri / uzman kullanıcıları hedefliyor. Komut satırından kullanılabilen sistem metin tabanlı bir menü sunuyor ve filmle ilgili detayları bulunduğu dizindeki bir HTML dosyasına yazıyor. Bunu cron'a veya Windows'ta Task Scheduler'a bağlamak mümkün (buna hizmet edecek bir tvservice.py dosyası da mevcut).

Sistem devreye soktuğum günden beri bana makul günlük film önerilerinde bulunuyor ve benim keyfimi iyi öğrendiğini, modellediğini düşünüyorum. Yeterince iyi ve beni bir yükten kurtardı.

tvrecommend sistemini pek Python bilmeden geliştirmeye başladım. Geliştirirken Python ile ilgili hiç 'tutorial' okumadım sadece takıldığım bazı yerlerde Google üzerinden bulduğum birkaç belgeye baktım. Python'un IDLE çalışma ortamı (ve Emacs'ın python-mode'u) görebildiğim kadarı ile Common Lisp'e çok benzer çalışma ortamı sunuyor, yani Emacs + SLIME + CL üçlüsüne alışkın biri olarak yabancılık çekmedim. Python çalışma ortamı mesela bir SBCL ortamına kıyasla daha yavaş ancak teknik dokümantasyonu yeterli ve takip etmesi kolay, bu projede performans çok önemli değildi.

Bir başka nokta: SQLite kesinlikle bundan sonraki projelerimde göz önünde bulunduracağım bir veri tabanı.

Python'un 3. şahıslar tarafından yazılmış Beautiful Soup, IMDbPY gibi kütüphaneleri gayet güzel iş görüyor.

libsvm ve dolayısı ile 'support vector machines' yöntemi doğru metodoloji ile kullanıldığında çok güçlü bir makina öğrenme / yapay zeka yöntemi. Ancak doğru kullanmak için verinin nasıl vektör haline getirileceğine, ölçeklemeye, kayıp veri yerine ne konacağına çok dikkat edilmesi gerekiyor. libsvm içinden çıkan araçlar her türlü verinin SVM için uygunluğunu denetleyebilecek ve gerekli parametreleri önerebilecek türden araçlar, özellikle GNU/Linux ortamında çok faydaları dokunabilir.

Yapılması Gerekenler

Öncelikle kodun cilalanması ve daha bir son kullanıcıya yönelik hale getirilmesi gerekiyor. Ayrıca libsvm ile yapılan tahminlerin gerçekten de tatmin edici olup olmadığını anlamak için biraz daha test yapmak lazım.

Kendi adıma daha çok Python öğrenmeye heves ettim bu projeden sonra. Unicode ve Türkçe karakterler meselesi ile ilgili kodda çok kirli ve hızlıca olduğunu düşündüğüm bölümler var, onları bertaraf etmek faydalı bir çaba olacaktır.

ekolay tv sitesi yerine film bilgilerini doğru dürüst bir XML formatında veren bir RSS kaynağı bulmak sistemde çok daha eksiksiz veri birikmesini sağlayacağı için daha sağlıklı çalışmasını sağlayacaktır (böyle bir kaynak biliyorsanız lütfen haber verin! ;-)

Performans açısından C4.5 karar ağacı gibi daha kolay anlaşılabilen bir makina öğrenme algoritması kullanıp mevcut çözümün tahmin performansı ile kıyaslanabilir, bu da işin yapay zeka kısmı ile ilgili değerli bir çaba olacaktır.

Emre Sevinç (emre . sevinc at gmail nokta com)
22 Ocak 2008, Istanbul

Makalenin özgün adresi: http://ileriseviye.org/arasayfa.php?inode=tvrecommend.html

Görüşler

0
FZ
Yukarıdaki izlenimler ve sonuçlar kısmına yazmayı unutmuşum. Söz konusu sistemi geliştirmek boş vakitlerimde keyfi şekilde çalışarak yaklaşık birkaç haftamı aldı, tam zamanlı ve daha disiplinli bir çalışma ile muhtemelen en fazla 4-5 adam-gün gibi bir maliyeti olurdu diye tahmin ediyorum.
0
FZ
Bir başka uyarı: Burada SVM herhangi bir ciddi parametre optimizasyonu yapmadan ve 'cross validation' gerçekleştirilmeden kullanışmıştır ve kabul edilebilir sonuçlar verdiği görülmüştür. Ancak farklı bir alanda, farklı veri setleri üzerinden SVM ile sınıflandırma ve tahmin işlemleri gerçekleştirilecekse mutlaka test verisi ile 'cross validation' yapılmasında, uygun parametrelerin araştırılmasında, vs. fayda vardır (libsvm içinden çıkan gridsearch.py ve benzeri araçlar bu konuda kolaylık sağlamaktadır).
0
anonim
from svm import *

satırından hata alıyorum. ubuntu kullanıyorum ve gerekli kütüphaneler oalrak depoda libsvm2 ve python-libsvm paketlerini buldum ve kurdum fakat, tv.py dosyasının ilgili satırındaki hatadan bir türlü kurtulamadım:

Traceback (most recent call last):
File "tv.py", line 4, in
from svm import *
ImportError: No module named svm

konu hakkında fazla bilgi sahibi olmadığımdan sizin fikirlerinizi sorayım. Kurduğum paketlerin modul isimleri değişik olmasından mı kaynaklanıyor? Yani bir karakter sorunu mu var? Yoksa illa svm paketini mi bulmam gerekiyor?
0
FZ
Selamlar,

Ben size kendi ortamımda (şu anda GNU/Linux üzerinde değilim, MS Windows üzerindeyim) ne yaptığımı söyleyeyim, belki oradan yola çıkıp benzer şey yaparak halledebilirsiniz:

Ben libsvm arşivini çektikten sonra çalıştığım dizinde bunu açtım ve ortaya çıkan libsvm-2.85 dizininin içindeki python dizinine gidip oradaki svm.py dosyasını ve de çalıştığım dizine yani tv.py dosyasının bulunduğu dizine kopyaladım. Böyle yapınca çalışır hale geliyor. MS Windows'da bunun daha temiz bir yöntemi var mı, bunu henüz bilmiyorum. GNU/Linux için burada anlatılana benzer yöntem işinizi görüyor mu acaba? (Ek bilgi: yine Windows ortamında libsvm-2.85 dizini içindeki \\windows\\python dizini içindeki svmc.pyd dosyasını programın çalışma dizini içine kopyalamam gerekmişti ama linux için belki buna gerek kalmayabilir, aşamalı olarak deneyip sonuçtan haberdar eder misiniz lütfen?)
0
anonim
svm.py dosyasını şurada buldum:

/usr/lib/python2.4/site-packages/svm.py

ve tv.py betiğinin bulunduğu dizine aldım. tv.py 'yi çalıştırdıktan sonra svmc modülüne de ihtiyacım olduğunu öğrendim:

Traceback (most recent call last):
File "tv.py", line 4, in
from svm import *
File "/home/guardian/Desktop/tvrecommend/trunk/svm.py", line 1, in
import svmc
ImportError: No module named svmc


daha sonra aynı dizinden svmc.so dosyasını da kopyaladım fakat bu seferde şu hatayı verdi:

Traceback (most recent call last):
File "tv.py", line 4, in
from svm import *
File "/home/guardian/Desktop/tvrecommend/trunk/svm.py", line 1, in
import svmc
ImportError: libpython2.4.so.1.0: cannot open shared object file: No such file or directory

çözebilmiş değilim...
0
FZ
Selamlar,

Şimdi bir Debian GNU/Linux makina buldum ve sırası ile şunları yaptım:

root olarak:



# apt-get install libsvm-dev libsvm-tools libsvm2 python-libsvm


Reading package lists... Done


Building dependency tree... Done


The following extra packages will be installed:

  pkg-config


Suggested packages:

  libgnome-dev


The following NEW packages will be installed:

  libsvm-dev libsvm-tools libsvm2 pkg-config python-libsvm


0 upgraded, 5 newly installed, 0 to remove and 4 not upgraded.


Need to get 222kB of archives.

After unpacking 741kB of additional disk space will be used.


Do you want to continue [Y/n]? Y


Get:1 http://godel.cs.bilgi.edu.tr etch/main pkg-config 0.21-1 [67,5kB]

Get:2 http://godel.cs.bilgi.edu.tr etch/main libsvm2 2.82.0-3 [40,0kB]

Get:3 http://godel.cs.bilgi.edu.tr etch/main libsvm-dev 2.82.0-3 [26,3kB]

Get:4 http://godel.cs.bilgi.edu.tr etch/main libsvm-tools 2.82.0-3 [25,8kB]

Get:5 http://godel.cs.bilgi.edu.tr etch/main python-libsvm 2.82.0-3 [62,6kB]

Fetched 222kB in 0s (479kB/s)

Selecting previously deselected package pkg-config.

(Reading database ... 78805 files and directories currently installed.)

Unpacking pkg-config (from .../pkg-config_0.21-1_i386.deb) ...

Selecting previously deselected package libsvm2.

Unpacking libsvm2 (from .../libsvm2_2.82.0-3_i386.deb) ...

Selecting previously deselected package libsvm-dev.

Unpacking libsvm-dev (from .../libsvm-dev_2.82.0-3_i386.deb) ...

Selecting previously deselected package libsvm-tools.

Unpacking libsvm-tools (from .../libsvm-tools_2.82.0-3_i386.deb) ...

Selecting previously deselected package python-libsvm.

Unpacking python-libsvm (from .../python-libsvm_2.82.0-3_i386.deb) ...

Setting up pkg-config (0.21-1) ...

Setting up libsvm2 (2.82.0-3) ...


Setting up libsvm-dev (2.82.0-3) ...

Setting up libsvm-tools (2.82.0-3) ...

Setting up python-libsvm (2.82.0-3) ...


Ardından normal kullanıcıma geçtim ve yine komut satırına gidip:


$ python

Python 2.4.4 (#2, Apr  5 2007, 20:11:18)

[GCC 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> from svm import *

>>>

>>>



Yani herhangi bir problemle karşılaşmadım üstelik Windows ortamında yaptığım svm.py ve svmc.pyd dosya kopyalama işlemlerini yapmama da gerek kalmadı Debian GNU/Linux ortamında. Lütfen benim apt-get ile kurduğum paketleri kontrol eder misiniz, siz de aynısını kurdunuz mu?
0
anonim

guardian@samkon:~/Desktop/tvrecommend/trunk$ sudo apt-get install libsvm-dev libsvm-tools libsvm2 python-libsvm
[sudo] password for guardian:
Reading package lists... Done
Building dependency tree
Reading state information... Done
libsvm2 is already the newest version.
python-libsvm is already the newest version.
The following packages were automatically installed and are no longer required:
mono
Use 'apt-get autoremove' to remove them.
The following NEW packages will be installed:
libsvm-dev libsvm-tools
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 86.2kB of archives.
After unpacking 369kB of additional disk space will be used.
Get:1 http://tr.archive.ubuntu.com gutsy/universe libsvm-dev 2.84.0-1 [40.2kB]
Get:2 http://tr.archive.ubuntu.com gutsy/universe libsvm-tools 2.84.0-1 [46.0kB]
Fetched 86.2kB in 1s (50.1kB/s)
Selecting previously deselected package libsvm-dev.
(Reading database ... 128719 files and directories currently installed.)
Unpacking libsvm-dev (from .../libsvm-dev_2.84.0-1_i386.deb) ...
Selecting previously deselected package libsvm-tools.
Unpacking libsvm-tools (from .../libsvm-tools_2.84.0-1_i386.deb) ...
Setting up libsvm-dev (2.84.0-1) ...
Setting up libsvm-tools (2.84.0-1) ...



ardından...



guardian@samkon:~/Desktop/tvrecommend/trunk$ python tv.py
Traceback (most recent call last):
File "tv.py", line 4, in
from svm import *
File "/home/guardian/Desktop/tvrecommend/trunk/svm.py", line 1, in
import svmc
ImportError: libpython2.4.so.1.0: cannot open shared object file: No such file or directory
guardian@samkon:~/Desktop/tvrecommend/trunk$ python
Python 2.5.1 (r251:54863, Oct 5 2007, 13:36:32)
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from svm import *
Traceback (most recent call last):
File "", line 1, in
File "/home/guardian/Desktop/tvrecommend/trunk/svm.py", line 1, in
import svmc
ImportError: libpython2.4.so.1.0: cannot open shared object file: No such file or directory


birşekilde ubuntu depolarından kaynaklanıyor olabilir mi?
0
FZ
Şu anda benim kullandığım sistem Debian GNU/Linux:


$ uname -a

Linux emba-linux 2.6.18-5-686 #1 SMP Mon Dec 24 16:41:07 UTC 2007 i686 GNU/Linux


ve paket depoları da:


$ grep -v '#' /etc/apt/sources.list | sed '/^$/d'


deb http://godel.cs.bilgi.edu.tr/debian/ etch main

deb-src http://godel.cs.bilgi.edu.tr/debian/ etch main

deb http://security.debian.org/ etch/updates main contrib

deb-src http://security.debian.org/ etch/updates main contrib


Maalesef şu anda bir Ubuntu sisteme erişimim olmadığı için sizin Ubuntu'daki Python içinden libsvm import etme problemi nereden kaynaklanıyor tespit edemedim acaba #ubuntu kanalından yahut Ubuntu ile ilgili forumlardan destek almanız mümkün mü? Ya da burada Ubuntu kullanan birileri varsa?
0
anonim
konu ile ilgilenicem, gelişmelerden haberdar ederim.

ilginiz için teşekkürler...
0
FZ
Rica ederim. Ben şimdiye dek sadece Debian GNU/Linux ve MS Windows (XP ve Windows 2000) ortamlarını kullandığım için (bu proje bağlamında) maalesef Ubuntu'daki derdinize hemen derman olamadım ama Ubuntu kullanan arkadaşlarıma da haber verdim bakalım bir sonuç alabilecek miyiz.
0
FZ
Ubuntu kullanan bir arkadaştan cevap geldi:

"python versiyonundan kaynaklaniyor.


coskun@coskun-desktop:~$ python2.4


Python 2.4.4 (#2, Oct  4 2007, 22:02:31) [GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2 Type "help", "copyright", "credits" or "license" for more information.


 >>> from svm import *

 >>>


python komutu ile calistirinca hata ladim ama, python2.4 diye calistirinca sorun olmadi bende.
0
anonim
tamam bunu hallettik, sıra geldi sqllite'a :)


guardian@samkon:~/Desktop/tvrecommend/trunk$ python2.4 tv.py
Traceback (most recent call last):
File "tv.py", line 5, in ?
import sqlite3 as sqlite
ImportError: No module named sqlite3


guardian@samkon:~/Desktop/tvrecommend/trunk$ locate sqlite3.so
/usr/lib/libsqlite3.so.0
/usr/lib/libsqlite3.so.0.8.6
/usr/lib/python2.5/lib-dynload/_sqlite3.so
/usr/lib/swiftfox/libsqlite3.so
guardian@samkon:~/Desktop/tvrecommend/trunk$
0
FZ
Acaba Python 2.5 kurmayı deneseniz? Daha kolay olur mu?
0
anonim
zaten python 2.5.1 sürümü mevcut:

guardian@samkon:~/Desktop/tvrecommend/trunk$ python
Python 2.5.1 (r251:54863, Oct 5 2007, 13:36:32)
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>


2.5 ile çalıştırıncada aşağıdaki hatalar meydana geliyo:


guardian@samkon:~/Desktop/tvrecommend/trunk$ python2.5 tv.py
/home/guardian/Desktop/tvrecommend/trunk/svm.py:1: RuntimeWarning: Python C API version mismatch for module svmc: This Python has API version 1013, module svmc has version 1012.
import svmc
/home/guardian/Desktop/tvrecommend/trunk/svm.py:1: RuntimeWarning: Python C API version mismatch for module swig_runtime_data3: This Python has API version 1013, module swig_runtime_data3 has version 1012.
import svmc
Traceback (most recent call last):
File "tv.py", line 5, in
import sqlite3 as sqlite
ImportError: dynamic module does not define init function (initsqlite3)
guardian@samkon:~/Desktop/tvrecommend/trunk$
0
FZ
Ben şimdi apt-get install python-pysqlite2 python-sqlite dedim Debian GNU/Linux ortamında ve sonra Python çalıştırıp


import pysqlite2 as sqlite


deyince sorun çıkmadı ama maalesef ben de tv.py'deki ilgili satırı çalıştıramadım orjinal hali ile:


>>> import sqlite3 as sqlite

Traceback (most recent call last):

  File "", line 1, in ?

ImportError: No module named sqlite3


Açıkçası MS Windows'da Python 2.5 ile yukarıdaki problemi hiç yaşamadım ve şu anda Debian'da niye yaşadığımı da çok iyi anlayamadım, bunu bir araştıracağım, bir önceki sorunsuz gibi görünen import ifadesini kullanıp tv.py'yi o şekilde çalıştırdığınızda sorun oluyor mu acaba?
0
Guardian
şuan dışarıdan cevap verdiğimden deneyemiyorum, fakat evdeki bilgisayarımın başına ilk geçtiğimde deneyeceğim ihtimalleri fve sonuçlarını buraya yapıştırırım..

merak ettim, çalıştırmadan vazgeçmek yok.. :)
0
FZ
Tamam, çok teşekkürler. Ben de ilk fırsatta bir Ubuntu makina bulup denemeye çalışacağım. Aslında vakit ayırıp bunu bir .deb paketi haline getirebilirsem en azindan Debian ve Ubuntu ortamlarında kurmayı kolaylaştırmış olurum diye düşünüyorum.
0
anonim
bir önceki iletimde bulduğum sqllite.so dosyasını ilgili dizine kopyaladım ve isminin başındaki "_" karakterini sildim. Bu seferde şu hatayı verdi:

guardian@samkon:~/Desktop/tvrecommend/trunk$ python2.4 tv.py
Traceback (most recent call last):
File "tv.py", line 5, in ?
import sqlite3 as sqlite
ImportError: dynamic module does not define init function (initsqlite3)
0
FZ
Az önce irc.freenode.net'teki #fazlamesai kanalında Mehmet "decaf" ("realist") Köse ile yazışıyorduk bu Ubuntu / Python / svm, vs. meselesi üstüne. Şu anda görünen o ki Python 2.5'ta SQLite 3 desteği var ama Ubuntu stable ortamda Python için libsvm sorunlu:

<decaf> libsvm (2.84.0-3) unstable; urgency=low * Added support for Python 2.5. (Closes: #445386)
<decaf> ubuntu unstable'dan bu satır

decaf arkadaşımız svm'nin Ubuntu stable için backport edilmiş .deb dosyasını hazırladı, http://ileriseviye.org/stuff/python-libsvm_2.84.0-3_i386.deb adresinden çekip kurabilirsiniz, lütfen dener misiniz? Dolayısı ile Python 2.5'te bu şekilde svm kurabiliyorsanız aynı sürümde SQLite 3 desteği de eklenmiş olduğu için programa müdahale etmeden kullanabilmeniz gerekiyor, bu arada lütfen svn checkout yapmayı ya da svn update yapmayı ihmal etmeyin en güncel hali için.
0
FZ
Not:

decaf: o paket debian'da sorun çıkarabilir
decaf: sadece ubuntu gutsy'de çalışacağı garanti

der ve kaçarım (şimdilik ;-))
0
anonim
guardian@samkon:~/Desktop/tvrecommend2/tvrecommend/trunk$ python tv.py



0- Prepare the empty movie database (choose this if this is the first, just once).

1- Retrieve today's foreign movies

2- Choose which movies you'll watch today in order to train the system.

3- Train the system.

4- Let the system advise you some foreign movies for today.

e- Exit.

[1, 2, 3, 4, e]:
---------------------------------------------------------------------------------------

son verdiğin apket sayesinde python için imdb modülünü de kurduktan sonra çalıştı sonunda. İlgilendiğin için teşekkür ederim..
0
anonim
Bu arada harika bir uygulama olmuş. Tebrik ve teşekkür ederim...
0
FZ
Rica ederim. Buradan Mehmet Köse (decaf / realist) arkadaşımıza da çok teşekkürler.

Bu arada her ihtimale karşı yukarıdaki menüyü biraz açıklayayım:

Önce 0'ı seçin. Sonra birkaç gün boyunca 1 ve 2 işlemlerini uygulayın. Birkaç gün sonra 3 seçin. Bir kez 3 çalıştırdıktan sonra artık 1 ile o günkü filmleri çekebilir ve sonra 4 seçerek tavsiye alabilirsiniz (tavsiye ettiği filmlerin URLlerini ekrana basacaktır).

Şu anda kullanıcı arayüzü çok çok kaba ve ciddi bir hata kontrolü yok. Vakit olunca buna müdahale edebileceğim. Belki Django ile web arayüzü filan da yazmak söz konusu olabilir.
0
anhanguera
selam,

vallahi pek guzel, elinize akliniza saglik diyorum. devamlarini istiyorum ;)

alper 'anhanguera' akcan.


0
FZ
Eyvallah :) Lakin şu anda pek bi cilasız, pek bi nev-i şahsına münhasır ve zaman zaman patlayan kod söz konusu (kendi kendime bug report yazıp kendime atama yapıyorum, zamanında halledemezsem kendimi azarlayıp tokatlayacağım hatta kendimi projeden bile kovabilirim ;-)

Tabii bu sistemin geliştirilmesi yahut buradaki machine learning / data mining yöntemlerinin başka alanlara uygulanması ile ilgili her türlü öneriye de açığız. Böylece belki 'devam'ı gelir bu küçük başlangıcın (ben şimdilik kodun kendisinden ziyade makina öğrenme algoritmaları ve bunların pratik uygulamaları üzerine yoğunlaşmaya, bu doğrultuda arge yapmaya çalışıyorum, weka, pentaho, rapidminer, vs. yani akademikten ziyade pratik/ pragmatik bağlamda).
0
sefakaraman
merhaba rapidminer ve weka hakıında sizinle görüşmek istiyorum mail adresim kubertoll@hotmail.com bana dönerseniz cok sevinirim
0
exalted
Yabancı beyaz perdelerin özgün adlarına ulaşmak için beyazperde.com kullanmanı tavsiye ediyorum. Örneğin, "Onurlu Bir Adam" filmi için, [0] gerekli sonuç sayfasını getiriyor. İstenilen bilgiyi çekip çıkartmak yeterli olacaktır diye düşünüyorum.

Ayrıca puanlamalarda kullanmak üzere [1] da tavsiye ederim.

[0]: http://beyazperde.mynet.com/hizliarama.asp?keyword=Onurlu+Bir+Adam
[1]: http://www.rottentomatoes.com/
0
FZ
Çok teşekkürler, bir inceleyip bir süre test edeyim eğer %99 sağlıklı işliyorsa buradan da faydalanacağım.
0
alexi_nedo
Oncelikle bu zekice fikir icin tebrikler...
SVM egitmek icin her bir filme karsilik kullandiginiz feature vector icinde "IMDB puani" ve "yayinlandigi kanal" bilgisi var sanirim. Feature vector icinde baska neler var?
0
FZ
Teşekkürler. O yazdıklarınıza ek olarak saat bilgisi de var, 22:00 gibi bir saat bilgisini alıp 2200 sayısı olarak yerleştiriyorum. Vektöre bu özellikleri (saat, kanal, IMDb puanı) seçmemin sebebi benim de üç aşağı beş yukarı kişisel olarak bunlara bakıp karar veriyor oluşum (genellikle). Ancak ve ancak konusunda çok özel bir şey gördüğüm bir film olursa ya da çok özel bir tavsiye o zaman o özelliklerin dışında bir şeye bakarak karar vermiş oluyorum.
0
alexi_nedo
Ben de tam bu noktadan bahsedecektim, (saat, kanal, imdb puani) yani sira daha yararli ozellikler eklenirse sistem cok daha saglikli isleyecektir diye dusunuyorum.
Ornegin, bir kisi Mel Gibson'in tum filmlerini seviyor olabilir, ya da korku filmlerini hic kacirmiyor olabilir.
Bu durumda oznitelik vektorune (Bas rol oyunculari, Film Turu vs) gibi daha etkin parametreler eklemek sistemin basarim sinirlarini oldukca artıracaktir diye dusunuyorum.
Bu yaratici fikir icin tekrar tebrik ediyorum...
0
FZ
Evet mulaka. Dediklerinize büyük ölçüde katılıyorum. Bunlar içinden en kolayı herhalde tür(ler) bilgisini vektör hale getirip mevcut vektöre eklemek olacaktır. Eldeki IMDbPY kütüphanesinin metodları ile o veriyi de çekmek çok zor olmasa gerek.

Diğer yandan işin içine oyuncu ve yönetmen bilgilerini eklersek o zaman bunu biraz daha dikkatli tasarlamakta fayda olur diye düşünüyorum çünkü mesela şu anda misal ilk üç oyuncu + yönetmen ismi şeklindeki metin verisini SVM'ye işletmek için o vektörün nasıl bir parçası haline getirebilirim diye düşündüğümde aklıma bir şey gelmedi. (Tabii illa SVM olmak zorunda değil kullanacağım sınıflandırıcı, başka bir şey olabileceği gibi birkaç şeyin bir arada çalışacağı türden 'ensemble classifier' gibi bir şey de olabilir.
0
FZ
Debian ve Ubuntu (stable sürümler) kullananların dikkatine: libsvm'yi Python 2.5 içinden kullanmak sorunlu görünüyor. Python 2.5 kullanmak SQlite 3 import işlemi için gerekli. Bu libsvm problemi ile ilgili olarak Debian ve Ubuntu kullanıcıları testing deposundaki libsvm'yi kullanırlarsa problem çözülüyor gibi görünüyor. Ubuntu backport paketi için FM'deki bu yoruma bakılabilir. Bunun dışında Debian geliştiricilerinden Recai Oktaş da bir stable backport paketi hazırlayabileceğini belirtti. Gelişmeler bu thread'in devamında takip edilebilir.
0
rafet
Ben de Lapislinuxos (PclinuxOs ) ve Pardus kurulu.
Bu sistemlerde kurulabilir mi?
lapis deposuna baktim, libswm-dev,tools falan yok.Pardus da var mi bakmadim henuz.

selamlar
0
FZ
libsvm ve Python 'binding'lerinin kurulabildiği her sisteme kurulabilir bu yazılım. Eğer hazır paketleri yoksa bile en kötü ihtimalle libsvm sitesini ziyare edip kaynak kodu indirir ve kaynaktan kurabilirsiniz, birkaç dakikalik zaman maliyeti olur (hazır paketten birkaç saniyede kurmaya kıyasla)
0
erk
Tebrikler FZ, guzel ve ilham verici bir is olmus. Bu arada problemin "birkac boy" scale edilmisini enteresan bulacaklarin Netflix Prize'a bakmalarini tavsiye ediyorum.
Haberdar olmayanlar icin; Netflix Prize Amerika'da film kiralama isinde onde giden firma Netflix'in kendi machine learning tekniklerini belli bir oranda gecebilecek ilk kisiye 1 milyon dolar verecegini ilan etmesiyle baslayan oldukca buyuk capli bir yarisma. An itibariyle de dunya capinda bircok grup projeyle ciddi olarak ugrasmakta. Data mining teknikleriyle ugrasanlar icin muazzam bir database i training set olarak vermesinin yaninda, baska insanlarin nasil yaklasimlarla probleme saldirdigini okurken cok sey ogreniyorsunuz. Bu konuyla ilgiliyim diyenlerin en azindan asagida verdigim linkten Simon Funk'un getirdigi cozume bir goz atmalarinda fayda goruyorum. kolay gelsin,
www.netflixprize.com
www.netflixprize.com/community/viewtopic.php?id=453
0
FZ
Katılıyorum, Netflix ödülü gerçekten de machine learning ile ilgilenenler için çok önemli ve değerli bir yarışma.
0
Tarık
Eve ekran kartımla adam akıllı çalışan Ubuntu ya da Debian kurabilirsem hemen deneyeceğim. Hatta oldurabilirsem kurulumun aşamalarını video gösterimi haline getirebilirim.
0
realist
Ekran kartının markası, modeli nedir?

Bana ulaşın: mehmet.kose@gmail.com
0
Tarık
WinFast A6600 TD
0
realist
Ubuntu'da uğraştırmadan, sorunsuz çalışır, üzerinde Quake 4 de çalışır.
0
Tarık
Ben bu ekran kartını, Ubuntu Gutsy Gibbon 7.10 ve Debian 4.1 (stable) de denedim. Her ikisinde de tüm ekran yarı yarıya farklı renklerde yanıp sönen bir şekil aldı. Monitör (samsung 753dfx) den midir sorun diyerek yatay, dikey frekanslar için türlü parendeler attım, standart xorg.conf düzenlemesi yaptım, forumlarda dolandım, e-posta listelerinde gezindim sadece iki fransız debian forumunda benzer bir gariplikle karşılaştım ki Allah tan başlık ingilizce idi.
Güvenli ekran modunda Ubuntu' da açabildim fakat çözünürlük*tazeleme berbattı non-restrcited sürücü yüklediğimde kafayı yiyordu vs.
Son olarak elde kalan Ubuntu Studio 7.04 Alternate ile kurulum yapayım dedim. Şıkır şıkır kurdu, çalıştı hatta üstüne compiz-fusion bile kurup çalıştırdım, hatta çalışmaktayım hala. Pekey nedendir bu anlamsız gariplik buna bir anlam veremedim.
Bu saydığım dağıtım cd' lerinin tümünde aynı yolu izledim. Aslında ben Debian çalıştırmak istiyorum fakat gel gör ki linux beni neyledi :)
0
realist
Ekran kartı sürücüsü kurulduysa -teoride- monitörün tazeleme değerlerini okuyup ona göre açar. Ancak her zaman olmuyor maalesef.
Debian kurulumundan sonra nvidia.com'daki sürücüyü deneyin.
Burdan devam etmeyelim, mail beklerim.
0
FZ
Bu programda kullandığım IMDbPY kütüphanesinin geliştiricisi Davide Alberani'den az önce gelen bir e-posta:

-----Original Message-----
From: Davide Alberani [mailto:alberanid@libero.it]
Sent: Fri 1/25/2008 4:55 PM
To: Emre Sevinc
Subject: tvrecommend and IMDbPY

Hi,

I've seen [1] your tvrecommend project (very cool, indeed!); I'll add it to the page [2] of IMDbPY-based programs.

Best regards, and good luck for your project!

+++
[1] Yes, I'm enough paranoid to automatically scan access logs searching for previously unseen "Referer" http headers. :-)
[2] http://imdbpy.sourceforge.net/?page=programs
0
exalted
FZ, ilgili/ilgisiz, ama bilinmiyorsa bilinsin: http://johan.svedberg.com/projects/coding/ontv/
0
FZ
Çok teşekkürler bu bağlantı için. Eğer Türkiye'de XMLTV formatında televizyon program akış verisi üreten bir yer olsa idi (var mı?) ve bu programa dahil edilebilise idi, bu programda ufak bir modifikasyonla (sevdim, sevmedim tuşu eklemek) benim bu tvrecommend machine learning sistemini buna entegre etmek ve sonuç itibarı ile kullanıcıya çok keyifli bir deneyim yaşatmak mümkün olurdu diye düşünüyorum
0
exalted
Şöyle [0] bir kaynak var, ona göre Türkiye pek bir renksiz kalmış...

Birilerinin oturup XMLTV için Türkiye'nin belli başlı kanallarını hazırlaması lazım. Sonuçta XMLTV de kanalların internet sitelerindeki günlük/haftalık/aylık programlardan faydanalıyor. Perl bilen ve ilgisi olanlara duyurulur...

[0]: http://xmltv.org/wiki/xmltvworlddomination.html
0
FZ
Görünen o ki XMLTV şeklinde TV verisi sunma işi Amerika kıtası, AB ve Avustralya'daki pek çok ülke için hazırlanmış ve evet, Türkiye bundan nasibini almamış görünüyor. XMLTV gibi bir formatı geçtim tutarlı ve dolayısı ile kolay 'parse edilebilen' bir HTML verisi üreten site olsa öpüp başıma koyacağım :)

Bir kez daha görüyoruz ki gerek tvrecommend'de olduğu gibi data mining / machine learning tarzı uygulamalarda olsun gerekse üstteki yorumlarda belirtilen o bilgisayardan TV akışı izleme programlarında olsun kaliteli ve doğru veri akışı servisleri bu tür uygulamalar için neredeyse olmazsa olmaz bir şart.
0
exalted
Aslında TV kanallarının hemen hepsi yayın akışlarını kendi internet sitelerinde o ya da bu şekilde yayımlıyorlar. Bu bilgileri RegEx ile çekip çıkartmak, düzenleyip bir XML hazırlamak ne kadar zor olabilir ki?

Kanallar kendileri bu bilgileri standarda bağlı şekilde verseler pek de güzel olur, aksi halde işin yoksa otur da her kanal sitesinde değişiklik yaptığında sen de deyimleri güncellemekle uğraş...

Acaba benim için Python öğrenmeye başlamanın zamanı bu olabilir mi, böyle bir bilgiyi sağlayabilecek *amatör* bir program işine yarar mıydı FZ? Sonra iyi/kötü bir de UI çekerdik bu kardeşliğin altına...
0
FZ
Acaba benim için Python öğrenmeye başlamanın zamanı bu olabilir mi, böyle bir bilgiyi sağlayabilecek *amatör* bir program işine yarar mıydı FZ? Sonra iyi/kötü bir de UI çekerdik bu kardeşliğin altına...

Birkaç hafta içinde TV programları ile ilgili düzgün RSS (yahut işte XMLTV, vs.) çıktısı üreten bir online sistem yap, bana adresini ver, hemen tvrecommend'e entegre edeyim ;-) (Aslında online olması da şart değil, yani Python lib. gibi bir şey de işimi görür).
0
exalted
Notumu aldım, ancak 21 Şubat'taki sınavımdan sonra başlayabilirim... Yani o *birkaç hafta*nın sayımına 3 hafta kadar sonra başlansın lütfen! =)

Python ile çevrimiçi bir sistem yapmanın yolu yordamı hakkında bilgin var mı?
0
FZ
Django. Sihirli sözcük diyorlar. Bazıları ;-)
0
exalted
Zamanı gelince değerlendirilecektir, teşekkür ederim.
0
FZ
Rica ederim, ne demek. :)
0
exalted
Kısa bir süreden beri bunun üzerinde (veritabanları dersimin projesi olarak) çalışmaya başladım, ancak ne kadar zaman alacağı ile ilgili şu anda birşey söyleyemiyorum. Elle tutulur birşeyler ortaya çıktığında haber vereceğim.
0
FZ
Çarşı iznine çıkma imkanım olursa bir Internet kafeden bağlanıp bakmaya çalışırım :)
0
exalted
?
0
FZ
Askere gidiyorum 15 gün sonra.
0
Betelgeuse
Şimdiden geçmiş olsun...
0
exalted
Auf... Tez zamanda bitirirsin inşallah! Benim hızım ile muhtemelen sen askerden döndüğünde birşeyler bitmiş olur =D
Görüş belirtmek için giriş yapın...

İlgili Yazılar

IronPython: .Net üzerinde Python - Bölüm - 3

zekzekus

IronPython: dot Net üzerinde Python - 1
IronPython: dot Net üzerinde Python - 2
Yazının özgün haline bu adresten ulaşabilirsiniz.

IronPython içinde bir sınıf oluşturup bunu "System.Object" sınıfından türettiğinizde, IronPython .NET sistemine bir çağrı yapar ve dinamik olarak yeni bir CLR sınıfı oluşturur. IronPython sınıfınıza bir isim atar ve sınıfı kendi "IronPython.NetTypes.System" sınıfına yerleştirir. (Tabii ki Beta versiyon üzerinde çalıştığımızı gözününde bulundurmalısınız. IronPython'ı geliştirenler bu isimuzayı adlarını değiştirebilirler.) Sanırım Poe "Rüya içinde Rüya" gibi bir şeyler yazmıştı. Bu durumda bizde .NET içinde .NET uyguluyoruz. Ya da öyle bir şey işte.

IronPython 1.0 Yayınlandı

zekzekus

5 Eylül 2006 tarihinde Python programlama dilinin Microsoft .NET Platformu üzerinde çalışan sürümünün 1.0 versiyonunun hazır olduğu açıklandı ve kaynak kodları ya da runtime kütüphaneleri olarak indirilmeye hazır. Buradan projenin ana sayfasına ulaşabilirsiniz.

Django ORM ve SQLAlchemy üstünde Elixir karşılaştırması

muhuk

Django'yu işimde, Elixir'i (bu yazıdaki her Elixir'i Elixir+SQLAlchemy olarak okuyunuz) kendi projemde kullanıyorum. Dört veya beş yıl önce SQLObject ile başlayıp Unicode sorunları nedeniyle bende büyük hayal kırıklığı yaratan ORM macerama bir ay kadar önce FZ'nin önerisi üzerine bir şans daha verdim. Özellikle benim gibi aşırı titiz biri için SQL programlama belli bir karmaşıklıktan sonra işkence olabiliyor. ORM'ler de zamanla gelişmiş ve çok daha stabil hale gelmiş. Karşılaştırmasını yapacağım iki bileşen de yaygın kullanılan iyi projeler. Burada yazacaklarım tamamen benim fikirlerim, eğer hatalarım olursa veya farklı düşünceleriniz varsa lütfen yorum olarak paylaşınız.

PISI Geliştirme Deposu

exa

PISI'nın yeniden canlandırılan geliştirilme dalına ait kaynak kodunu github'da bulabilirsiniz. Kaynakların şu andaki revizyonu 1.1_beta12'dir. Bu revizyonu yerel subversion çalışma kopyalarımdan yükledim, Pardus projesindeki en son idare ettiğim geliştirme dalı deposuna aittir. Dalla ilgili bilgileri aşağıda kendiniz görebilirsiniz.

$ svn info . Path: . Working Copy Root Path:...

Django Girls etkinliklerinden öğrendiklerimiz

elifkus

Kodlama saati yazısını görünce ben de Django Girls’ü ve İstanbul’daki etkinliklerimizden ve öğrendiklerimizden bahsedeyim dedim.

Amerika’da ve Dünya’da yazılımcıların kadın oranını arttırmak için birçok organizasyon ve etkinlik var. Django Girls, bunlardan biri. Ola Sitarska and Ola Sendecka adında iki Polonyalı kadın yazılımcı tarafından başlatılmış, 1 veya 2 günlük bir programlama etkinliği....