Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#1 04. Juni 2014 09:42

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Berechnung von "weight" im Search-Modul

Hallo,

irgendwie werde ich aus der Gewichtung beim Suchmodul nicht ganz schlau. Ich möchte gerne die Suchergebnisse nach Gewichtung ausgeben, also z.B. die "Top-Ergebnisse" hervorheben. Nun werden offensichtlich gute Ergebnisse mit einem "weight" von 7 bewertet. Der Suchbegriff kommt aber oft auf der jeweiligen Seite vor. Bei anderen Begriffen geht die Gewichtung nicht unter 50. Es kommt mir irgendwie willkürlich vor ...
Geht die Gewichtung vom jeweils besten Inhalt aus und rechnet dann runter? Oder geht es nach Anzahl des Suchbegriffs im Verhältnis zum Rest?
Ich habe in der "action.dosearch.php" die Funktion "CalculateWeights" gefunden, aber werd nicht schlau draus (wahrscheinlich steckt auch noch mehr dahinter):

[== PHP ==]
function CalculateWeights()
  {
    reset($this->_ary);
    while (list($key) = each($this->_ary)) {
      $oneitem =& $this->_ary[$key];
      $oneitem->weight = intval(($oneitem->intweight / $this->maxweight) * 100);
    }
  }

Hat da jemand ne Idee oder Erfahrung mit?

Offline

#2 04. Juni 2014 11:16

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: Berechnung von "weight" im Search-Modul

Die Frage ist, was genau Du unter "Top-Ergebnissen" verstehst. Ergebnisse bei denen der Suchbegriff häufig vorkommt, oder Ergebisse bei denen Begriff eine besondere Bedeutung hat?

"Hohe Gewichtung" bedeutet nicht "Bestes Suchergebnis" von allen gefundenen Ergebnissen. "Hohe Gewichtung" bedeutet, dass der Suchbegriff im jeweiligen Treffer eine hohe Gewichtung hat (stark vereinfacht ausgedrückt). Inwiefern der Treffer an sich allerdings tatsächlich relevant in Bezug auf die Anfrage ist, steht auf einem anderen Blatt.

Ein Begriff, der sehr häufig auf einer Seite auftaucht, hat eine niedrigere Gewichtung als ein Begriff der nur ein einziges mal auf einer Seite auftaucht, weil er dort eine größere semantische Rolle spielt (bzw. vermutlich eine größere semantische Rolle spielen könnte).

Bsp.: Eine Seite auf der tausendmal das Wort "Insufficient" vorkommt, wird bei der Suche nach "Insufficient" keine hohe Gewichtung erhalten, weil ein Wort, das so häufig verwendet wird, wohl kaum eine spezielle Bedeutung haben kann. Kommt das Wort aber nur dreimal auf der Seite vor, ist seine Bedeutung auf dieser Seite sehr viel höher.

So in etwa muss man sich das mit der Gewichtung vorstellen. (Es kommt z.B. auch noch auf die Menge des Textes und die gesamte Häufigkeit des Suchbegriffes in allen Ergebnissen an.)

Alles was Dir das Suchmodul in dieser Hinsicht bieten kann, ist eine sogenannte "Geschätzte Relevanz". Um die tatsächliche Relevanz des Ergebnisses beurteilen zu können, muss man "Objektive Relevanz", "Subjektive Relevanz" und "Situative Relevanz" hinzuziehen. Diese kann man aber nicht rein rechnerisch allein aus Suchergebnissen und Suchbegriff ermitteln.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#3 04. Juni 2014 12:46

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Re: Berechnung von "weight" im Search-Modul

Hi NaN,

danke für die ausführliche Erklärung - die Frage, die mich beschäftigt ist die, welche Gewichtung das Such-Modul nutzt.
Deine Ausführungen bringen mich zu der Annahme, dass das Modul den Text mit den meisten Treffern als Referenz nimmt und die restlichen Ergebnisse Prozentual anpasst - sprich:
- das Wort kommt maximal 100 mal auf einer Seite vor -> Gewichtung 100%
- auf der nächsten Seite kommt das Wort 7 mal vor -> Gewichtung 7%

Das nun der erste Text aus insgesamt 1000 Wörtern besteht, der Zweite aber nur aus 20 wird dabei nicht mit einbezogen. Und genau das bringt offensichtlich das Ungleichgewicht.
Mir wäre in diesem Fall wahrscheinlich schon geholfen, wenn die Häufigkeit des Begriffs ins Verhältnis zur Textlänge gesetzt würde.
Also:
- Text 1 mit 1000 Wörtern, 100 mal Suchbegriff -> Gewichtung 10%
- Text 2 mit 20 Wörtern, 7 mal Suchbegriff -> Gewichtung 35%

Da ich auf der Suchergebnis-Seite eh schon die ToolBox einsetze, um die gefunden Seiten "anzureißen", könnte ich sicher mit count_words eine eigene Gewichtung nach o.g. Bespiel basteln.

Da es bei der Seite nicht um wissenschaftlich Themen, sondern um Unterhaltung geht, könnte dass ein Ansatz sein ... Ich werds mal testen.

Offline

#4 04. Juni 2014 14:01

NaN
Moderator
Ort: Halle (Saale)
Registriert: 09. November 2010
Beiträge: 4.437

Re: Berechnung von "weight" im Search-Modul

Was ich da oben schrieb war mein generelles Verständnis einer Relevanzberechnung bei einer Volltextsuche. Hm... entweder hab ich das komplett falsch verstanden oder das Suchmodul arbeitet nicht nur anders, sondern völlig anders. Hab mir mal den Code und die Queries angeschaut.

Deine Ausführungen bringen mich zu der Annahme, dass das Modul den Text mit den meisten Treffern als Referenz nimmt und die restlichen Ergebnisse Prozentual anpasst

Ja, genau so.
Beim Indizieren von Inhalten wird gezählt, wie oft ein Wort im jeweiligen Inhalt vorkommt und der Wert in der DB gespeichert. Beim Suchen werden für jedes Suchergebnis die Vorkommen aller Suchbegriffe zusammengezählt. Das jeweils höchste Vorkommen wird als Referenz (maxweight) genommen. ( = 100%) Und davon ausgehend werden dann tatsächlich alle anderen Gewichtungen berechnet.

D.h. kommt ein Begriff insgesamt 26 mal auf einer Seite vor (und sei somit das höchste Vorkommen "maxweight"), dann ergibt sich laut der Formel in der Funktion CalculateWeights()

(26 / 26) * 100 = 100%;

kommt derselbe Begriff auf einer anderen Seite 10 mal vor

(10 / 26) * 100 ~ 38,5%

D.h. das Modul nimmt als "bestes" Ergebnis immer das, in dem der Suchbegriff am meisten vorkommt. Da wird kein Verhältnis zur Textmenge hergestellt.


Module: GBFilePicker, AdvancedContent
Sicherheit: Beispiel .htaccess-Datei
CMSms 1.12 unter PHP 7:
cmsms-1.12.3.zip (inoffiziell - komplett inkl. Installer)
CMSms 1.12 unter PHP 8:
cmsms-1.12.4.zip (inoffiziell - komplett inkl. Installer)

Offline

#5 05. Juni 2014 07:38

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Re: Berechnung von "weight" im Search-Modul

Hi NaN - das entspricht dann z.B. {100*$entry->intweight/$word_count} - funktioniert auch. Allerdings ist mir aufgefallen, dass z.B. die Überschrift auch "einfach" mit in die Anzahl von $entry->intweight aufgenommen wird.
Das verfälscht die Ergebnisse ein wenig.
Umgehen kann ich das mit {if $entry->urltxt|strstr:$phrase}...{/if}. Damit kann ich noch eine Faktor einbauen, um den die Gewichtung erhöht wird, wenn der Suchbegriff auch in der Überschrift vorkommt.
Ich denke, damit komme ich wertemäßig ans Ziel. Jetzt muss ich nur noch nach der neuen Gewichtung sortieren - hab da schon was in der ToolBox gesehen, was ich mir nachher mal genauer anschaue ...

Offline

#6 05. Juni 2014 12:14

faglork
arbeitet mit CMS/ms
Ort: Fränkische Schweiz
Registriert: 15. Dezember 2010
Beiträge: 1.152
Webseite

Re: Berechnung von "weight" im Search-Modul

Es gäbe da eventuell  noch einen Quick&dirty workaround ...

Die Inhalte der Extra-Felder werden ja ebenfalls mit durchsucht. Ob sie allerdings in die Gewichtung mit eingehen, weiss ich nicht. Aber das könnte man ja ganz einfach testen:
- Eine Seite1 mit 5x Suchbegriff im Text
- Eine Seite2 mit 1x Suchbegriff im Text, aber 5xSuchbegriff im Extra-Feld

-> Seite 2 sollte eine höhere Gewichtung haben.


Falls das Funzt, kann man beliebige Seiten einfach "pushen" indem man einfach z.b. 10x den Suchbegriff in das Extra-Feld schreibt.

BTW: Ich nutze ein Extra-Feld oft wenn es darum geht eine Seite zu finden mit Suchbegriff-Variationen. Zb. geht es auf einer Seite um Zyklamen. Damit die Seite auch unter den Schreibweisen "Cyclamen, Zyclamen, Cyklamen" gefunden wird, kommen diese Begriffe einfach in ein Extra-Feld. Voila ...

Servus,
Alex

Beitrag geändert von faglork (05. Juni 2014 12:16)

Offline

#7 05. Juni 2014 12:43

jeff1980
Server-Pate
Ort: Dortmund
Registriert: 26. November 2010
Beiträge: 630

Re: Berechnung von "weight" im Search-Modul

Hi Alex,
das ist ein guter Hinweis. Bei diesem Projekt hilft es zwar nicht weiter, aber gerade die Möglichkeit, verschiedene Schreibweisen anzubieten, wird einen Kunden freuen :-). Da hab ich mir noch nie Gedanken drüber gemacht - das kommt ja meist erst, wenn man mal etwas mehr will als nur den Standard ...

Offline