Ähnliches Posts in Jekyll ermitteln

LSI für Jekyll hat für meine Site nicht wirklich funktioniert. Ein kleines Plug-In, maßgeschneidert für meine Anforderungen, aber stark vereinfacht, erfüllt den Zweck besser und auch noch einigermaßen schnell.

Bemerkung! Ich bin vor einigen Jahren von Jekyll zu Qgoda gewechselt. Das bedeutet, dass das Feature "Ähnliches" auf dieser Web-Site nicht mehr die Technik, die in diesem Beitrag beschrieben ist, verwendet. Qgoda hat das Feature, ähnliche Seiten zu finden eingebaut und ist auch schneller als Jekyll.

LSI steht für Latente Semantische Indizierung und bezeichnet ein mathematisches Verfahren, mit dessen Hilfe sich die Ähnlichkeit zweier Texte messen lässt. Aufgrund entsprechender Hinweise in der Jekyll-Doku bin ich bisher davon ausgegangen, dass LSI für die miserable Performance von Jekyll bei der Generierung dieser Website verantwortlich ist. Leider erwies sich das als Trugschluss. Jekyll arbeitet ohne LSI genauso langsam wie vorher. Ich bleibe dennoch bei meinem eigenen Plug-In, weil ich den Eindruck habe, dass es bessere Ergebnisse liefert.

Die Idee ist denkbar einfach. Inwieweit zwei Artikel in Beziehung zueinander stehen, wird mit einem einfachen Punktesystem ermittelt. Enthalten zwei Posts einen identischen Link (intern oder ausgehend), zählt das als ein Punkt. Jedes gemeinsame Tag schlägt mit zwei Punkten zu Buche. Zugehörigkeit zur gleichen Rubrik zählt als drei Punkte, und ein direkter Link zwischen beiden Dokumenten wird mit fünf Punkten bewertet.

Eine ideale Lösung wäre wahrscheinlich eine Mischung aus beiden Ansätzen. Ein direkter Link zwischen zwei Dokumenten liefert einen starken Hinweis darauf, dass sie etwas miteinander zu tun haben, und das ist etwas, was sich mit LSI nicht ermitteln lässt. Andererseits findet LSI Beziehungen, die übersehen oder vergessen wurden, oder sich nicht unmittelbar aufdrängen. Leider ist es nicht trivial, die Ergebnisse der latenten semantischen Analyse in Jekyll in einem Plug-In zu ermitteln. Deshalb habe ich am Ende auf LSI ganz verzichtet.

Ein weiterer Aspekt war die Mehrsprachigkeit dieser Site. Das Array mit verwandten Artikeln sollte deshalb nur Beiträge in der gleichen Sprache enthalten. Ich hatte bereits ein Jekyll Hook-Plug-In, dass mir die Anzahl der Posts für einzelne Tags oder Rubriken vorab berechnet. Dieses Plug-in wurde nun einfach so erweitert, dass es zusätzlich eine auf den obigen Kriterien basierende Ähnlichkeits- bzw. Verwandheitsgrad-Matrix berechnet.

Eine Liste ähnlicher oder verwandter Beiträge lässt sich damit so erstellen:

<ul>
  {% for related in site.related[page.id] %}
    <li><a href="{{related.url}}">{{related.title | escape}}</a></li>
  {% endfor %}
  </ul>

Der Hash site.related verwendet die Page-ID als Schlüssel und begrenzt die Größe der Liste auf jeweils zehn Beiträge. Denkbar wäre auch, nur verwandte Posts aufzunehmen, die beim Ähnlichkeitstest mindestens einen Punkt bekommen haben. Das alles lässt sich im Quelltext des Plug-Ins sehr einfach an die eigenen Bedürfnisse anpassen.

Leave a comment

JSON.stringify() missbrauchen

Tücken von JavaScript `for...in`-Schleifen

Elektronische Rechnungen mit freier und quelloffener Software erzeugen

Dynamische Angular-Konfiguration

ImageMagick für Perl kompilieren

Angular Tour of heroes als Standalone-App

Diese Website verwendet Cookies und ähnliche Technologien, um gewisse Funktionalität zu ermöglichen, die Benutzbarkeit zu erhöhen und Inhalt entsprechend ihren Interessen zu liefern. Über die technisch notwendigen Cookies hinaus können abhängig von ihrem Zweck Analyse- und Marketing-Cookies zum Einsatz kommen. Sie können ihre Zustimmung zu den vorher erwähnten Cookies erklären, indem sie auf "Zustimmen und weiter" klicken. Hier können sie Detaileinstellungen vornehmen oder ihre Zustimmung - auch teilweise - mit Wirkung für die Zukunft zurücknehmen. Für weitere Informationen lesen sie bitte unsere Datenschutzerklärung.