Cabalist - AI in Ruby

Hejka,

Ostatnio szukałem jakiegoś sympatycznego sposobu na wzbogacenie aplikacji w RoR o jakąś formę prostego AI/machine learning. Znalazłem kilka algorytmów, ale nic, co można by w lekki, łatwy i przyjemny sposób zaimplementować.

Spróbowałem swoich sił i napisałem bibliotekę, póki co tylko na GitHubie:

Choć to bardziej ‘Proof of Concept’ niż gotowy produkt (chociaż działa), dajcie proszę znać, co o tym sądzicie.

Dzięki!
Marcin

Dlaczego https://github.com/marcinwyszynski/cabalist/blob/master/lib/cabalist/object_hooks.rb#L5 ??

Komu by przeszkadzało zrobić to:

class Cat extend(Cabalist) acts_as_cabalist( :fields => [ :light_or_dark, :gender ], :category => :good )
Czy naprawdę ta 1 linijka więcej (extend) to jest jakieś zło, że wszyscy tworzą api, które rozszerza jakieś już istniejące klasy (Object, albo zwykle ActiveRecord::Base). Nie mogę tego znieść.

Druga rzecz to nie podoba mi się taki global:

Cabalist::Manager.setup!

Wolałbym coś w stylu:

manager = Cabalist::Manager.new() Cat.cabalist_manager = manager # albo może w drugą stronę manager.manage(Cat) manager.setup!
Wtedy łatwo mogę tworzyć różne managery, testować je itp. Zawsze lepiej tworzyć api, które umożliwia więcej a jak ktoś chce się ograniczyć do jednego globala to jego sprawa.

Dzięki za uwagi.

W kwestii zaśmiecenia klasy Object przyznaję się do winy i dobrowolnie poddaję karze. Poszedłem za (złym) przykładem innych pluginów. Zmienię to tak jak sugerujesz.

Co do managerów to też się zgadzam - chcę umożliwić także tworzenie wielu klasyfikatorów dla jednej klasy - będzie dostępna dodatkowa opcja (:name). Tak czy inaczej zostawię Cabalist::Manager jako singletona.

Tak więc uruchomienie każdego konkretnego klasyfikatora będzie się odbywać tak:

Cabalist::Manager.setup(Cat, :classifier_name)

A wszystkich bez zmian:

Cabalist::Manager.setup!

http://googletesting.blogspot.com/2008/11/clean-code-talks-global-state-and.html - jak to Cię nie przekona to już brak nadzieji :slight_smile: