Plugin-Alpha: CRM114-Klassifikator

Fehler in TV-Browser
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Plugin-Alpha: CRM114-Klassifikator

Beitrag von henryk »

Moin,

ich bin jetzt soweit eine erste Alpha-Version meines Plugins zum Testen freizugeben. Es benutzt CRM114 (http://crm114.sf.net) und versucht damit Sendungen in die zwei Gruppen Top und Flop zu klassifizieren. Um es zu benutzen braucht man folglich eine funktionierende CRM114-Installation, siehe dazu dessen Webseite. Getestet habe ich nur mit Linux.

Installation: http://www.ploetzli.ch/crmtv/0.1/CrmTv.jar runterladen und in das Plugins-Verzeichnis kopieren. TV-Browser starten und die Einstellungen des Plugins aufrufen. Den Pfad zur Binary von CRM114 überprüfen und ggbf. korrigieren. Ausserdem braucht es ein Verzeichnis in dem CRM die gelernten Daten (css-Files, CRM114 Sparse Spectra) ablegen kann. Das Verzeichnis muß ebenfalls in den Einstellungen festgelegt werden, es wird ggbf. erzeugt.

Wahlweise kann man selbst in dem Verzeichnis die beiden Dateien top.css und flop.css mit cssutil erzeugen, oder einfach mindestens einen Top und einen Flop lernen, vorher wird keine Klassifikation funktionieren.

Das Plugin kann auf zwei Arten benutzt werden: Über das Kontextmenü klassifiziert es jeweils eine Sendung und kann diese dann auch gleich als Top oder als Flop einlernen. Oder man wählt in den Einstellungen des Plugins einen oder mehrere Sender aus die komplett klassifiziert werden sollen. (Dann muß auch noch in Einstellungen -> Sendungsanzeige die Anzeige von Icons für dieses Plugin aktiviert werden.)

Achtung: Ich führe zur Zeit noch keinen Cache. CRM114 ist zwar vergleichsweise schnell, trotzdem kann ich damit nur ca. 20 Sendungen pro Sekunde auf meiner Maschine (P4-1.8GHz) klassifizieren. Einen kompletten Sender für einen Tag zu markieren dauert gefühlte 5s. Zum Testen sollte das aber reichen.

--
Henryk Plötz
Grüße von der Ostsee
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Wie gut funktioniert das system? Du hattest doch am anfang bedenken wg. der Qual. der Daten? Welche Felder werden eigentlich berücksichtigt? Auch die Schauspieler usw?

Naja, ich werd das jetzt mal austesten :)
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Also funktioniert nich schlecht, man muß jetzt nur noch testen, wie gut das ganze auf die Daten reagiert :).

Du solltest ausserdem noch vieles in einen seperaten Thread machen, sonst blockierst du die GUI zu lange...aber für den anfang ganz witzig, das ding!

Weiter so :)
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Beitrag von henryk »

Moin,
bodo hat geschrieben:Wie gut funktioniert das system? Du hattest doch am anfang bedenken wg. der Qual. der Daten? Welche Felder werden eigentlich berücksichtigt? Auch die Schauspieler usw?
Alle Felder die ich finden konnte, also im wesentlichen das was ProgramInfoDialog.createInfoText() macht nur etwas weniger hübsch und dafür mehr praktisch aufbereitet. Ich hab mir ein bisschen Code und Ideen von dort geborgt. Der größte Unterschied ist eigentlich dass ich die Schauspieler, Regisseur, etc.-Listen aufsplitte und wie eMail-header zusammensetze: Aus

Code: Alles auswählen

actor_list: A, B, C
wird

Code: Alles auswählen

actor_list: A
actor_list: B
actor_list: C
So kann CRM wenn es schon nichts über den Inhalt erfährt wenigstens Lieblingsschauspieler (und ggbf. sogar deren Rollen), etc. in Erfahrung bringen.

Ansonsten scheint es momentan eher Sender und Tageszeiten zu lernen, das wird sich hoffentlich mit der Zeit geben, wenn nicht muß ich diese Felder aus der Beschreibung nehmen.
bodo hat geschrieben: Du solltest ausserdem noch vieles in einen seperaten Thread machen, sonst blockierst du die GUI zu lange
Was vieles? Also ich habe jetzt eine Erweiterung von meiner CrmClassifier-Klasse geschrieben die Eingabe und Ausgabe in einem Cache hält und ggbf. Anfragen daraus beantwortet: http://www.ploetzli.ch/crmtv/0.2/CrmTv.jar. Der Cache wird zusammen mit den anderen Daten gesichert (vorher aufgeräumt) und geladen. Lernvorgänge invalidieren alle Cache-Einträge. Und ausser durch Lernen laufen Cacheeinträge auch nach 14 Tagen ab.

Da ich momentan die gesamte Beschreibung als Index für den Cache verwende belegt er etwa 20 kB pro Kanal und Tag. Ganz schön viel für nur ein Bit pro Sendung ;-)

Aber was ausser der Klassifikation sollte ich denn noch auslagern?

--
Henryk Plötz
Grüße von der Ostsee
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Hm...die Klassifikation is schon ausgelagert? Die Icons kannst du ja leider nich in einem anderen Thread holen, der Aufruf muß den ja sofort beantworten...

Ich überleg mir mal was ;).

Könntest du den Bewertungs-Dialog umbauen? Ich fände 3 Knöpfe besser..so muß ich jetzt immer ein Dropdown betätigen.

Was auch interesannt wäre: ein Lern-Modus. Der fragt 20-30 zufällige Programme ab und man bewertet diese...
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Den hatte ich gerade :

Code: Alles auswählen

SCHWERWIEGEND: Ein nicht behandelter Fehler ist aufgetreten
java.lang.NullPointerException
        at crmtv.CachingCrmClassifier.classify(CachingCrmClassifier.java:50)
        at crmtv.CrmTv.crmClassify(CrmTv.java:121)
        at crmtv.CrmTv.getProgramTableIcons(CrmTv.java:313)
        at util.ui.ProgramPanel.getPluginIcons(ProgramPanel.java:289)
        at util.ui.ProgramPanel.setProgram(ProgramPanel.java:227)
        at util.ui.ProgramPanel.setProgram(ProgramPanel.java:207)
        at util.ui.ProgramPanel.<init>(ProgramPanel.java:128)
        at tvbrowser.ui.programtable.DefaultProgramTableModel.addChannelDayProgram(DefaultProgramTableModel.java:137)
        at tvbrowser.ui.programtable.DefaultProgramTableModel.updateTableContent(DefaultProgramTableModel.java:184)
        at tvbrowser.ui.programtable.DefaultProgramTableModel.setDate(DefaultProgramTableModel.java:153)
        at tvbrowser.ui.mainframe.MainFrame.changeDate(MainFrame.java:591)
        at tvbrowser.ui.mainframe.MainFrame.dateChanged(MainFrame.java:605)
        at tvbrowser.ui.finder.FinderItem$1.run(FinderItem.java:114)

Benutzeravatar
Til
Site Admin
Beiträge: 1498
Registriert: 04 Dez 2003, 11:21
Wohnort: Karlsruhe
Kontaktdaten:

Beitrag von Til »

Was mir noch aufgefallen ist:

Als Datenverzeichnis wäre es ganz gut, wenn du als Default anstatt

Code: Alles auswählen

"/home/henryk/swtest/crmtv/crmdata/"
lieber

Code: Alles auswählen

System.getProperty("user.home", "") + "/.tvbrowser/crmtv"
nehmen würdest.

Dann wird automatisch das Homeverzeichnis des aktuellen Users genommen (sogar auf Windows-Systemen) und außerdem sollte das ganze doch zu den TV-Browser-Einstellungen gepackt werden.

Außerdem bringt er er immer die Fehlermeldung "CRM114 wurde nicht am angegebenen Ort gefunden", obwohl ich den Ort richtig gesetzt habe. Ich habe die "Bleeding-Edge Version" von CRM114 heruntergeladen. Die Rechte sind auch richtig gesetzt...
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Du mußt einen link erzeugen. Die neue Datei heißt crm144_tree, das Plugin erwartet aber eine crm144
Benutzeravatar
Til
Site Admin
Beiträge: 1498
Registriert: 04 Dez 2003, 11:21
Wohnort: Karlsruhe
Kontaktdaten:

Beitrag von Til »

OK. Jetzt geht's.

Was mir noch aufgefallen ist: Bei den Fehlermeldungen solltest du das Hauptfenster als parent setzen (Siehe Plugin.getParentFrame()). Sonst kann es passieren, dass die Fehlermeldung in den Hintergrund kommt. Dann kann man Hauptfenster nicht mehr bedienen.

Und beim beim Lernen bekomme ich folgenden Fehler:
Das Plugin "CRM114-Klassifikator" hat einen Fehler verursacht.

----- Start of stacktrace -----
java.lang.NullPointerException
at crmtv.CrmTv.crmLearnTop(CrmTv.java:134)
at crmtv.CrmTv.execute(CrmTv.java:273)
at devplugin.Plugin.handleContextMenuItemPressed(Plugin.java:346)
at tvbrowser.core.plugin.JavaPluginProxy.doHandleContextMenuItemPressed(JavaPluginProxy.java:324)
at tvbrowser.core.plugin.AbstractPluginProxy.handleContextMenuItemPressed(AbstractPluginProxy.java:369)
at tvbrowser.core.plugin.PluginProxyManager$3.actionPerformed(PluginProxyManager.java:833)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.AbstractButton.doClick(AbstractButton.java:289)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1113)
at javax.swing.plaf.basic.BasicMenuItemUI$MouseInputHandler.mouseReleased(BasicMenuItemUI.java:943)
at java.awt.Component.processMouseEvent(Component.java:5100)
at java.awt.Component.processEvent(Component.java:4897)
at java.awt.Container.processEvent(Container.java:1569)
at java.awt.Component.dispatchEventImpl(Component.java:3615)
at java.awt.Container.dispatchEventImpl(Container.java:1627)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
at java.awt.Container.dispatchEventImpl(Container.java:1613)
at java.awt.Window.dispatchEventImpl(Window.java:1606)
at java.awt.Component.dispatchEvent(Component.java:3477)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
----- End of stacktrace -----
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Beitrag von henryk »

Moin,
bodo hat geschrieben:

Code: Alles auswählen

SCHWERWIEGEND: Ein nicht behandelter Fehler ist aufgetreten
java.lang.NullPointerException
        at crmtv.CachingCrmClassifier.classify(CachingCrmClassifier.java:50)
Whups, ja, da hatte ich eine Möglichkeit einen Nullpointer zu kriegen übersehen. Ist behoben (selbe Version, selber URL).
bodo hat geschrieben:Die Icons kannst du ja leider nich in einem anderen Thread holen, der Aufruf muß den ja sofort beantworten...
Überlegt habe ich mir schon was, nur keine Zeit das zu implementieren. Ich spalte einen Thread als Manager-Prozess ab. Wenn ich ein Icon geben soll wird das in die treuen Hände des Managers gegeben: Entweder hat er die Bewertung schon parat und ich gebe sie direkt zurück, oder aber ich gebe erstmal ein Fragezeichen-Icon (oder so) und der Manager tut die Anfrage auf seine Liste von zu erledigenden Dingen. Da nimmt er sich ständig was runter, schmeisst das durch den Klassifier, speichert das Ergebnis und veranlasst über Tils Trick der Markierung und sofortigen Entmarkierung der Sendung das Neuzeichnen (und damit erneute Anfragen nach einem Icon).

Am liebsten sollte der ausserdem die von ihm bewerteten Sendungen speichern und wenn ein Lernen stattgefunden hat alle in Ruhe nochmal bewerten und wenn sich dadurch die Bewertung geändert hat die Sendung aktualisieren.
bodo hat geschrieben: Könntest du den Bewertungs-Dialog umbauen? Ich fände 3 Knöpfe besser..so muß ich jetzt immer ein Dropdown betätigen.
Ja, das steht schon direkt als Todo drin, da das überhaupt das erste war was ich als Dialog gemacht habe und das nur sehr schnell zusammengehackt hatte. Im Sinne von TOE (Train Only Errors) würde ich aber eigentlich lieber nur zwei Buttons machen: "OK" und "Als (das jeweils andere) lernen". Was ich aber am allerallerliebsten hätte wäre ein Kontextmenüeintrag (deswegen ja 'Kontext') der für Tops mit "als Flop lernen" und für Flops mit "als Top lernen" beschriftet ist, aber das gibt das Plugininterface nicht her.

Lernmodus: Gute Idee, setze ich auf die Liste.
Til hat geschrieben:Als Datenverzeichnis wäre es ganz gut, wenn du als Default
lieber

Code: Alles auswählen

System.getProperty("user.home", "") + "/.tvbrowser/crmtv"
nehmen würdest.
Danke für den Tipp, werde ich tun.
Til hat geschrieben: außerdem sollte das ganze doch zu den TV-Browser-Einstellungen gepackt werden.
Was meinst du damit?
bodo hat geschrieben: Die neue Datei heißt crm144_tree, das Plugin erwartet aber eine crm144
Also _eigentlich_ sollte das Plugin keinen bestimmten Namen erwarten, sondern einfach nehmen was im Textfeld steht. Als besondere Dienstleistung am Kunden suche ich aber wenn der eingegebene Name ein Verzeichnis ist dadrin nach den beiden üblichen Namen für die Binary und benutze dann die. Sollte da tatsächlich ein bestimmter Name erfordert werden wäre das ein Bug.
Til hat geschrieben:Bei den Fehlermeldungen solltest du das Hauptfenster als parent setzen (Siehe Plugin.getParentFrame())
Ok, werde ich tun.

Der Fehler den du beim Lernen siehst das ist der gleiche den Bodo oben hatte. Es gab eine Situation in der der Cache ein null-Pointer war (obwohl er das eigentlich nie sein sollte), die aber in der 0.2 die ich grade hochgeladen habe behoben ist. (Da fehlten einfach zwei if(...!=null))

--
Henryk Plötz
Grüße aus Berlin
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Zu dem Plugin-Interface: nach 1.0 werden wir das so erweitern, das man da auch Sub-Menüs im Context-Menü erzeugen kann :)
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Es ist immernoch der :

Code: Alles auswählen

Ein nicht behandelter Fehler ist aufgetreten

----- Start of stacktrace -----
java.lang.NullPointerException
  at crmtv.CrmTv.crmLearnTop(CrmTv.java:135)
  at crmtv.CrmTv.execute(CrmTv.java:274)
  at tvbrowser.core.PluginManager$5.actionPerformed(PluginManager.java:378)
  at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1786)
  at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(AbstractButton.java:1839)
  at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
  at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
  at javax.swing.AbstractButton.doClick(AbstractButton.java:289)
  at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1113)
  at javax.swing.plaf.basic.BasicMenuItemUI$MouseInputHandler.mouseReleased(BasicMenuItemUI.java:943)
  at java.awt.Component.processMouseEvent(Component.java:5100)
  at java.awt.Component.processEvent(Component.java:4897)
  at java.awt.Container.processEvent(Container.java:1569)
  at java.awt.Component.dispatchEventImpl(Component.java:3615)
  at java.awt.Container.dispatchEventImpl(Container.java:1627)
  at java.awt.Component.dispatchEvent(Component.java:3477)
  at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:3483)
  at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3198)
  at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3128)
  at java.awt.Container.dispatchEventImpl(Container.java:1613)
  at java.awt.Window.dispatchEventImpl(Window.java:1606)
  at java.awt.Component.dispatchEvent(Component.java:3477)
  at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
  at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
  at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
  at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
  at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
----- End of stacktrace -----
Feher vorhanden ...mußte wohl noch nacharbeiten *g*
Benutzeravatar
Til
Site Admin
Beiträge: 1498
Registriert: 04 Dez 2003, 11:21
Wohnort: Karlsruhe
Kontaktdaten:

Beitrag von Til »

henryk hat geschrieben:
Til hat geschrieben: außerdem sollte das ganze doch zu den TV-Browser-Einstellungen gepackt werden.
Was meinst du damit?
Wenn du

Code: Alles auswählen

System.getProperty("user.home", "") + "/.tvbrowser/crmtv"

als Lernverzeichnis nimmst, dann werden die Lerndateien unterhalb von (home)/.tvbrowser gespeichert, also dem Verzeichnis, in dem auch alle anderen TV-Browser-Einstellungen liegen.
henryk
Junior Member
Beiträge: 35
Registriert: 30 Aug 2004, 01:20

Beitrag von henryk »

Moin,
bodo hat geschrieben:Es ist immernoch der :

Code: Alles auswählen

Ein nicht behandelter Fehler ist aufgetreten

----- Start of stacktrace -----
java.lang.NullPointerException
  at crmtv.CrmTv.crmLearnTop(CrmTv.java:135)
Feher vorhanden ...mußte wohl noch nacharbeiten *g*
Vollkommen unmöglich. Der Zugriff auf crmClassifier kann keinen Nullpointer auslösen da vor dem Lernen ja bekanntlich das Klassifizieren kommt und das ohne Klassifikator schlecht geht. Und der Cache wird im Konstruktor auf einen nicht-null-Wert gesetzt und der Setter erlaubt auch nicht mehr das Überschreiben mit null. Da müsste schon ein Geisterkonstruktor herhalten damit das einen Fehler ergibt.

Es könnte zwar (unwahrscheinlich) sein, dass da ein Nullpointer mitserialisiert wurde, aber eigentlich sollte auch das der setter abfangen. Kannst du mal die .tvbrowser/crmtv.CrmTv.dat löschen (das leert auch die Liste der Kanäle die bewertet werden)?

Falls das nichts bringen sollte (es muß): Ich hab jetzt mal eine Version hochgeladen (immer noch keine Versionsänderung) bei der der getter sich auf stderr beschwert, wenn er einen null-cache vorfinden sollte und dann halt selber einen bastelt.

--
Henryk Plötz
Grüße aus Berlin
Benutzeravatar
bodo
Site Admin
Beiträge: 19635
Registriert: 03 Dez 2003, 19:37
Wohnort: Köln
Kontaktdaten:

Beitrag von bodo »

Also ich hab jetzt alle Dateien gelöscht, die zu deinem Plugin gehören (inkl. der top/flop dinger) und die neue Version runtergeladen.

Leider hab ich immernoch den Nullpointer.

Beim speichern passiert auch ein Nullpointer

Code: Alles auswählen

SCHWERWIEGEND: [PluginLoader.error.3#Saving data for plugin CRM114-Klassifikator failed!
(/home/bodum/.tvbrowser/crmtv.CrmTv.dat)]
java.lang.NullPointerException
	at crmtv.CrmTv.writeData(CrmTv.java:366)
	at tvbrowser.core.PluginLoader.storePluginData(PluginLoader.java:348)
	at tvbrowser.core.PluginLoader.deactivatePlugin(PluginLoader.java:371)
	at tvbrowser.core.PluginLoader.shutdownAllPlugins(PluginLoader.java:384)
	at tvbrowser.ui.mainframe.MainFrame.quit(MainFrame.java:357)
	at tvbrowser.ui.TVBrowserSystemTray$5.windowClosing(TVBrowserSystemTray.java:113)
	at java.awt.AWTEventMulticaster.windowClosing(AWTEventMulticaster.java:291)
	at java.awt.Window.processWindowEvent(Window.java:1121)
	at javax.swing.JFrame.processWindowEvent(JFrame.java:266)
	at java.awt.Window.processEvent(Window.java:1079)
	at java.awt.Component.dispatchEventImpl(Component.java:3615)
	at java.awt.Container.dispatchEventImpl(Container.java:1627)
	at java.awt.Window.dispatchEventImpl(Window.java:1606)
	at java.awt.Component.dispatchEvent(Component.java:3477)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:456)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:100)
Ich kenn das, Nullpointer jagen is ech übel ;)...aber das packste schon noch :)
Antworten