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.
