Ä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.
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