Category Archives: Hack The Planet!

Fragen zuordnen

Wir wickeln in der Firma seit Ende 2005 Endverbraucheranfragen über ein Ticketsystem namens “CuRM” ab (siehe hier und hier). Seit Anbeginn des Projekts stand der Wunsch, den Bearbeitern von Kundenanfragen halbautomatisch einen Antwortvorschlag vorzulegen, der z.B. aus unserer FAQ Sammlung generiert wird.

Und heute ist der Tag, an dem ich endlich angefangen habe, dass zu implementieren. Als ersten Schritt wollte ich zu FAQ Einträgen “ähnliche” FAQs herausfinden. Natürlich ohne manuelle Datenpflege.

Wie gehts?

Nach allerlei ‘rumsuchen und dem Studium von einem Duzend Wordpress “Similar Postings” plugins habe ich den TextRank Algorithmus von Mihalcea und Tarau implementiert. Mit diesen kann ich aus dem FAQ-Antwort Text recht zuverlässig Schlüsselworte extrahieren.

Nachdem ich aus allen Antworten die Schlüsselworte extrahiert habe, vergleiche ich jeden FAQ-Eintrag mit jedem anderen. Das geht gut, solange man nur wenig hundert FAQs hat, danach wird es zum Problem.

Ich prüfe:

  • wie viele Keywords von Eintrag-A im Text von Eintrag-B
  • wie viele Keywords haben Eintrag-A und Eintrag-B gemeinsam
  • Was ist die modifizierte Levenshtein Distanz der Keyword-Listen von Eintrag-A und Eintrag-B
  • Was ist die modifizierte Levenshtein Distanz der Fragen (Titel) von Eintrag-A und Eintrag-B

(((modifizierte Levenshtein Distanz ist in etwa als distance(' '.join(sorted(text.split()))) implementiert, so dass reine Permutationen von worten, sich cniht auf die berechnete Distanz auswirken)))

Das ganze gibt einen “Ähnlichkeitsscore” der angibt, wie ähnlich zwei FAQs sind. Die 5 FAQs mit dem höchsten score werden dann als “Fragen, die Ihnen auch weiterhelfen könnten” zu einem FAQ Eintrag angezeigt.

Klappt erstaunlich gut. Eigentlich tue ich mich ich mit allen AI/NLP Programmierproblemen schwehr, aber wie so oft, am ende ist alles nur Software und tut schon was es soll, wenn man es mit fester Stimme fordert.

Die Funktionalität zum Extrahieren von Schlüsselworten kann man nun natürlich auch für andere Bereiche, Analyse von Kundenanfragen nutzen.

Webseitenoptimierung

Nachdem wir Ende letzter Woche einen mächtigen Performance Einbruch unseres Webservers hatten, hab ich mir mal etwas detailliertere Gedanken über die Geschwindigkeit unserer Webseite gemacht.

Die Webseite brauchte gut eine Sekunde zum laden. Mein Ziel (aus rein sportlichen Gründen) war es diese zeit zu halbieren. Hat gekappt:

Was habe ich gemacht?

Zunächst habe ich alle statischen Dateien (CSS, GIF) auf einen separaten Webserver (lighttpd) verschoben. Dieser wurde auf statische Inhalte optimiert, so dass keine E-Tags erzeugt werden, Cache-Control: expires erzeugt werden und CSS on the fly komprimiert wird.

Dann hab ich allerlei Javascript tracking code aus der Webseite entfernt, den wir eh nicht mehr nutzen.

Als letztes habe ich einen JavaScript optimizer verwendet, um die Größe der CSS Dateien um nochmals 25% zu verringern.

Das ging einfach.