Verwandte Artikel suchen und finden

15. Mai 2013 · Programmierung · andreas · Kein Kommentar

Grundsätzliche Überlegungen

Neben der möglichst lesbaren Darstellung eines Texts ist es ein Service für den Leser, weiterführende Links passend zum Thema des aktuell angezeigten Artikels anzubieten. Eine Möglichkeit diesen Mehrwert zu schaffen ist, eine Liste inhaltlich verwandter Texte der gleichen Quelle anzuzeigen. Die Schwierigkeit hierbei liegt in der Definition, wann zwei Texte als verwandt gelten können und wie eng deren Verwandtschaftsgrad ist.

Für einen beschränkten Kreis an Texten kann die Zuordnung manuell durchgeführt werden: Beim Anlegen eines neuen Texts trifft der Autor eine Auswahl an bereits vorhandenen Texten, die aus seiner Sicht für den Leser interessant sein könnten. Mit steigender Zahl der Texte steigt jedoch auch die Gefahr, einen Texte zu übersehen und ein zu einem späteren Zeitpunkt erstellter Texte wird in der Liste niemals auftauchen - außer die Zuordnungen werden immer wieder aufs Neue kontrolliert und gepflegt.

Während ein Mensch nach kurzem Überfliegen meist problemlos den Verwandtschaftsgrad zwischen zwei Texten bestimmen kann, ist dies für einen Computer ungleich schwieriger. Eine generelle und für alle Anwendungsfälle gültige Regel lässt sich nur schwer aufstellen, denn je nach Ausgangslage können sich die Anforderungen an einen solchen Algorithmus stark unterscheiden. Deshalb muß versucht werden, ihm möglichst clever einen Weg zum Bestimmen des Verwandtschaftsgrades aufzuzeigen.

Verwandte Artikel in WordPress

Zum Anzeigen einer Liste verwandter Artikel in WordPress gibt es unzählige Lösungen, die sowohl mit als auch ohne Plugin realisiert werden können. Reizvoller als das Installieren einer vorgefertigten Lösung ist allerdings ein paar eigene Gedanken zum Thema zu spinnen und selbst eine Lösung zu erarbeiten. Ob diese dann besser oder schlechter als bereits vorhandene Lösungen ist, lässt sich anhand der Ergebnisse leicht beurteilen. Im Idealfall sollte eine selbsgebaute Variante maßgeschneidert und auf den jeweiligen Einsatzzweck optimiert das beste Ergebnis liefern.

Als Untersuchungsobjekte sollen die Artikel dieses Blogs (Stand 03.Mai 2013) dienen; die Testaufgabe ist, fünf passende Artikel zum Artikel #2659 “Deep Purple – All The Time In The World” zu finden.

Obwohl es auf den ersten Blick sicher bessere Möglichkeiten gibt, um entsprechende Algorithmen zu entwickeln wurde PHP gewählt, denn mit einem einzigen

require_once('./wp-load.php');

steht das komplette WordPress-Ökosystem für die Testskripte zur Verfügung, so daß keine bereits vorhandenen Basisfunktionen nachgebaut oder erst mühsam mittels Copy & Paste zusammengesucht werden müssen.

Der Aufruf der jeweiligen Testscripte, die im WordPress-Basisverzeichnis liegen müssen, erfolgt mittels

http://serverurl/myrelated-xx.php?ìd=ArtikelID

Zur Verbesserung der Übersichtlichkeit werden in diesem Text nur die für den jeweiligen Algorithmus relevanten Codeschnippsel gezeigt, die vollständigen Skripte stehen durch Klick auf den jeweiligen Skriptnamen zur Verfügung.

myRelated 01 - Kategorien

Als erster Ansatz zur Ermittlung des Verwandtschaftsgrades sollen die Kategorien, in die ein Artikel einsortiert wurde dienen. Grundgedanke ist, daß eine Einsortierung in die gleiche Kategorie eine enge Verwandtschaft bedeutet, eine Einsortierung in unterschiedliche Kategorien für einen schwachen Verwandtschaftsgrad spricht.

Das Skript “myrelated-01” ist schnell gebastelt und in der Funktionalität recht einfach:

function myRelated($id) {

	$cids = wp_get_post_categories($id);

	if ($cids) {

		$query = new wp_query(array(
			'category__in' => $cids,
			'post__not_in' => array($id),
			'showposts'=>5
		));

		if ($query->have_posts()) {

			while ($query->have_posts()) {

				$query->the_post();
				echo get_the_ID() . ': ' . get_the_title() . "\n";
			}
		}
	}
}

Zuerst werden die IDs der zum Artikel gehörenden Kategorien eingelesen, und anschließend eine Liste der Artikel ausgegeben, welche in den gleichen Kategorien wie der Testartikel einsortiert sind.

Das Ergebnis ist nachvollziehbar, aber wenig überzeugend:

2427: Jon Lord – Concerto for Group and Orchestra
2417: Lita Ford – Living like a Runaway
2311: Pink Floyd – Wish You Were Here (Immersion Box)
2294: Pink Floyd – The Dark Side Of The Moon (Immersion Box)
2283: Don Airey – All Out

Zwar passen #2427 und #2283 zufällig zum Testartikel, denn die fünf angezeigten Artikel sind einfach die fünf letzten, die vor dem Testartikel veröffentlicht wurden. Ein Leser, der einen Artikel über Deep Purple liest, ist zwar vielleicht Rock-Fan und somit auch an an Lita Ford und Pink Floyd interessiert, vorhandene Artikel aus dem Deep Purple Family Tree wären aber wünschenswert.

myRelated 02 - Schlagwörter

Ein anderer Ansatz zur Ermittlung verwandter Artikel ist die Zuordnung anhand von Schlagwörtern. Sofern Artikel über gleiche Schlagwörter verfügen gelten sie als verwandt, sofern sie über unterschiedliche Schlagwörter verfügen gelten sie als nicht verwandt.

Das Skript “myrelated-02” ergbit sich aus einer Abwandlung des ersten Skripts:

function myRelated($id) {

	$tids = wp_get_post_tags($id, array('fields' => 'ids'));

	if ($tids) {

		$query = new wp_query(array(
			'tag__in' => $tids,
			'post__not_in' => array($id),
			'showposts'=>5
		));

		if ($query->have_posts()) {

			while ($query->have_posts()) {

				$query->the_post();
				echo get_the_ID() . ': ' . get_the_title() . "\n";
			}
		}
	}
}

Das Ergebnis ist überzeugender als bei der Ermittlung über die Kategorien:

2427: Jon Lord – Concerto for Group and Orchestra
375: Deep Purple – Rapture Of The Deep tour edition
1728: Deep Purple / Sinner 1998-11-12
1724: Deep Purple / Rage 1998-06-17
372: Deep Purple – In Concert With The London Symphony Orchestra

Störend ist allerdings, daß sich mit #1728, #1724 sowie #372 drei englischsprachige Artikel in die Liste eingeschlichen haben und es sich bei #1728 sowie #1724 um ältere Live-Reviews handelt, die aus menschlicher Sicht nicht in direkter Beziehung zum Testartikel stehen.

myRelated 03 - Kategorien und Schlagwörter

Während die ersten beiden Versuche nur jeweils eine Möglichkeit zur Bestimmung des Verwandtschaftsgrades in Betracht gezogen haben, ist auch eine Kombination beider Wege denkbar.

Das wiederum nur leicht modifizierte Skript “myrelated-03.php” grenzt die vorhandenen Artikel anhand der Kategorien und der Schlagwörter ein.

function myRelated($id) {

	$cids = wp_get_post_categories($id);
	$tids = wp_get_post_tags($id, array('fields' => 'ids'));

	if ($cids) {

		$query = new wp_query(array(
			'category__in' => $cids,
			'tag__in' => $tids,
			'post__not_in' => array($id),
			'showposts'=>5
		));

		if ($query->have_posts()) {

			while ($query->have_posts()) {

				$query->the_post();
				echo get_the_ID() . ': ' . get_the_title() . "\n";
			}
		}
	}
}

Das Ergebnis ist ähnlich dem der reinen Schlagwort-Abfrage

2427: Jon Lord – Concerto for Group and Orchestra
375: Deep Purple – Rapture Of The Deep tour edition
372: Deep Purple – In Concert With The London Symphony Orchestra
378: Deep Purple – This Time Around
371: Deep Purple – Abandon

zumal mit #372 und #387 wieder zwei englischsprachige Artikel ihren Weg in die Liste gefunden haben.

Fazit

Grundsätzlich lassen sich Sowohl mit einer Abfrage über die Kategorien als auch mit einer Abfrage über die Schlagwörter verwandte Artikel finden.

Anhand der Struktur des als Testgrundlage dienenden Blogs ist allerdings die Verwendung der Kategroien weniger zielführend als die Verwendung der Schlagwörter, dies kann bei anderen Artikel- und Kategoriebeziehungen allerdings anders aussehen.

Anhand der Schlagwörter können verwandte Artikel gefunden werden, die sich auf Grund ihrer Relevanz allerdings deutlich unterscheiden können. Der Testartikel war lediglich mit dem Schlagwort ‘Deep Purple’ gekennzeichnet, das noch für 15 weitere Artikel vergeben wurde. Ob unter den 10 nicht dargestellten Artikel relevantere als die ausgegebenen sind, bleibt offen.

Aktualisierungen:
06.07.2013: Begriff “Schlagworte” durch “Schlagwörter” ersetzt.