Suchscript: Gewichtung der Fundstellen
Charles
- programmiertechnik
Hi, ich habe ein kleines Perl-Script erstellt, das für die eigene Website eine Suchfunktion anbietet. Wegen der Besonderheiten der Website habe ich das Script selbst erstellt und keine Freeware übernommen bzw. angepasst. (Auf der Website sind auf einer HTML-Seite jeweils viele kleinere Artikel; das Suchergebnis liefert sofort die kompletten kleineren Artikel und nicht - wie üblich - nur die URL/Titles der gefundenen Seiten als Link und 2 Zeilen Anreisstext.)
Das Script arbeitet prima, jetzt habe ich aber folgendes Problem:
Für die Gewichtung der Fundstellen (welche Treffer/Artikel sind besser, welche schlechter?) muss ich zumindest 2 Kriterien berücksichtigen:
(1) der Suchbegriff als kompletttes Wort muss besser gewichtet werden als wenn der Suchbegriff nur am Anfang oder Ende eines Wortes steht (Wenn Suchbegriff = "Programm", dann muss die Fundstelle "Programm" besser bewertet werden als "Programmierer" oder als "gramm"
(2) wenn 2 Begriffe gesucht werden, dann muss ein Text, der 3x den ersten und 3mal den zweiten Begriff enthält, besser bewertet werden als ein anderer Text, der 6mal den ersten und 0mal den zweiten enthält.
Soweit so gut. Jetzt tue ich mich aber schwer, diese Kriterien mathematisch umzusetzen, also einigermassen sinnvoll zu quantifizieren. Nach zwei Stunden Googeln habe ich bislang nichts dazu gefunden. Weiß jemand dazu Texte oder eigene Tipps?
Danke für jede Info!
Moin!
Soweit so gut. Jetzt tue ich mich aber schwer, diese Kriterien mathematisch umzusetzen, also einigermassen sinnvoll zu quantifizieren. Nach zwei Stunden Googeln habe ich bislang nichts dazu gefunden. Weiß jemand dazu Texte oder eigene Tipps?
Notiere zuerst Deine Regeln für die -> Wichtung oder das -> Scoring
Die Programmierung mache ich normalerweise einfach über ein Punktesystem. Wie die Punkte zu vergeben sind muss vorher festgelegt werden (in Deinem Fall würde ich die Punkte pro Suchbegriff vergeben und von der Wichtung was abziehen (50%?) , wenn einer der Begriffe keinen Punkt bekommt.
Dein Problem ist also eher mathematischer Natur als programmtechnischer. Aber mit ein paar Stunden Schlaf, einer heissen Badewanne und einer guten Idee aus eine ausgeruhtem Bauch heraus sollte jeder normal intelligente das für sich lösen können. Ich habe es ja auch geschafft :)
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
hallo fastix®,
Aber mit ein paar Stunden Schlaf, einer heissen Badewanne und einer guten Idee aus eine ausgeruhtem Bauch heraus
Da fehlt noch was ganz Wichtiges: der Holunderwein!
Ich habe es ja auch geschafft :)
Ohne Holunderwein? Kaum glaubhaft ... *g*
Grüße aus Berlin
Christoph S.
hallo Charles,
Hi, ich habe ein kleines Perl-Script erstellt, das für die eigene Website eine Suchfunktion anbietet.
Sehr gut.
Jetzt tue ich mich aber schwer, diese Kriterien mathematisch umzusetzen, also einigermassen sinnvoll zu quantifizieren.
Um dir da weiterhelfen zu können, müßtest du schon dein Script bekanntgeben. Lade es als Textdatei auf eine temporäre Adresse hoch.
Wenn du vergleichen möchtest: ich habe so ein Teil auch laufen und unter http://www.christoph-schnauss.de/prog/perl/perl5.php auch online stehen.
Grüße aus Berlin
Christoph S.
Um dir da weiterhelfen zu können, müßtest du schon dein Script bekanntgeben. Lade es als Textdatei auf eine temporäre Adresse hoch.
Hi Christoph,
erstmal danke für die Antwort! Bei Interesse schicke ich Dir gerne das Script, ich will da nichts verheimlichen und stell das Script auch gerne als Freeware zur Verfügung. Aber meine Frage ist doch (meines Erachtens) grundsätzlicher Art.
Im Augenblick addiere ich alles gleichgewichtig:
1.) Jede Fundstelle für einen Suchbegriff bekommt 1 Punkt, egal, ob das genaue Wort gefunden wird, oder der Suchbegriff als Wortanfang oder Ende.
Suchbegriff = Wein.
"Weinen" bekommt 1 Punkt, "Schwein" 1 Punkt, "Wein" 1 Punkt.
Man merkt: Haut nicht so hin.
(Problem: Wenn ich nur für ganze Wörter 1 Punkt vergebe, bekommt "Weine" 0 Punkte, "Rotwein" 0 Punkte.
2.) Egal, ob bei 2 Suchbegriffen beide Wörter 3x gefunden werden oder 1 Suchbegriff 6x, der andere 0 mal, es gibt dieselbe Punktzahl.
Suchbegriffe: Sexualität Malerei
ein Text, der 6mal Sexualität enthält, bekommt denselben Punktwert wie ein Text, der 3x Malerei und 3x Sexualität.
Haut auch nicht hin. Weil der 1.Text garantiert schlechter als Suchtreffer ist.
Insofern war meine Frage: Wie gewichtet man die Fundstellen/Treffer?
zu 1.) Suchbegriff am Anfang oder Ende 0,5 Punkte (oder 0,75 Punkte), genauer Suchbegriff 1 Punkt?
zu 2.) beide Suchbegriffe gefunden = 2x (oder 3x oder 1,5mal) die vorherigen Punkte?
Charles
Moin!
zu 1.) Suchbegriff am Anfang oder Ende 0,5 Punkte (oder 0,75 Punkte), genauer Suchbegriff 1 Punkt?
zu 2.) beide Suchbegriffe gefunden = 2x (oder 3x oder 1,5mal) die vorherigen Punkte?
Das hängt schlicht vom Inhalt Deiner Seite ab und ist zudem eine Frage der persönlichen Präferenz. Die Ansätze passen aber prinzipiell, wobei ich _je_ gefundenen Suchbegriff (Warum 2?) die vorherigen Punkte mit etwa 1.2 bis 1.5 multiplizieren würde. Du kannst Dir aber auch einen Multiplikator anhand der Anzahl der Suchbegriffe ausdenken.
Das Problem mit dem Wortanfang und Wortende ist im deutschen Sprachraum mathematisch vermutlich nicht lösbar (Ich nehme mal "Wein"):
Rotwein- relevant, Anfang
Weinsäure - relevant, Ende
Rotweingeschmack -relevant, Mitte
Weingartenweg - nicht relevant, Anfang
Schwein - nicht relevant, Ende
Kinderweinen - nicht relevant, Mitte
Hier könnte Dir nur eine statistische Betrachtung des Gesamtinhaltes Deiner Website unter der Vorannahme bestimmter Suchbegriffe helfen ... Oder Du beobachtest das Verhalten Deiner Besucher und optimierst nachträglich, wenn Du alle Suchbegriffe kennst. Aber selbst dann: Du wirst nie eine perfekte Lösung haben.
Du solltest auf jeden Fall ganze Wörter bevorzugen und auch bei Groß-/Kleinschreibung wichten.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
hallo Charles,
Bei Interesse schicke ich Dir gerne das Script
Darum gehts nicht. Zum Grundsatz: es gibt hier im Forum eine Menge Leute, die sich zwar manchmal wochenlang verstecken und nur mitlesen, aber dann, wenns interessant wird, sind sie auf einmal da. Ich will dein Script gar nicht persönlich haben, ich kann mir selber eins schreiben.
ich will da nichts verheimlichen und stell das Script auch gerne als Freeware zur Verfügung
Schau mal: das ist das nächste Mißverständnis: du hast dich hier ans Forum gewandt, weil dein Script deiner eigenen Ansicht nach noch "Macken" hat. Das ist in Ordnung, genau dafür ist das Forum da. Es geht also nicht darum, ob "wir" dein Script als Freeware haben möchten, sondern es geht darum, ob das Forum insgesamt, mit allen seinen möglichen Teilnehmern, einen Weg findet, dir bei der Optimierung deines Scripts zu helfen. Das ist ja schließlich dein Ziel. Aber das kann man nur erreichen, wenn du eben nicht nur verbal beschreibst, wo es klemmt, sondern auch den Code bekanntgibst - er mag (noch) fehlerhaft sein, aber das ist wurscht. Wir sind hier ein "Entwicklerforum" und diskutieren Fragen auf Grundlage von Code - eine verbale Erläuterung dazu mag hilfreich sein, führt aber oft auch in die Irre.
Aber meine Frage ist doch (meines Erachtens) grundsätzlicher Art.
Richtig. Außerdem scheint es eine interessante Fragestellung zu sein.
1.) Jede Fundstelle für einen Suchbegriff bekommt 1 Punkt
Siehst du? _Genau das_ möchte ich halt nicht als verbale Beschreibung lesen, sondern dazu in den zugehörigen Quelltext schauen. Was du in Worten beschreibst, ist das, was du haben möchtest. Was dein Quelltext bzw. dein Code zeigt, ist aber das, was du tatsächlich tust. Bei einem Perl-Script kann das manchmal bereits die shebang sein, oder im Scriptverlauf irgendeine falsch gesetzte Variable. Sowas findet man eben wirklich _nur dann_ heraus, wenn du deine wörtliche Erklärung mit der Preisgabe deines (Arbeits-)Codes vergleichen läßt.
Suchbegriff = Wein.
Öhm ... och nö. Hier im Forum habe ich das Monopol auf "Holunderwein" ;-)
"Weinen" bekommt 1 Punkt, "Schwein" 1 Punkt, "Wein" 1 Punkt.
Man merkt: Haut nicht so hin.
Genau. Weil du den Holunderwein ausgelassen hast ;-)
Also nix für ungut: lade dein Script als Textdatei irgendwo auf eine temporäre Adresse hoch, daß man es sich anschauen kann. Es geht wirklich nicht darum, auf diese Weise irgendwelche "Freeware" zu erhalten, sondern es geht darum, dir beim Debugging deines Scripts zu helfen.
Grüße aus Berlin
Christoph S.
hi,
1.) Jede Fundstelle für einen Suchbegriff bekommt 1 Punkt
Siehst du? _Genau das_ möchte ich halt nicht als verbale Beschreibung lesen, sondern dazu in den zugehörigen Quelltext schauen. Was du in Worten beschreibst, ist das, was du haben möchtest. Was dein Quelltext bzw. dein Code zeigt, ist aber das, was du tatsächlich tust. Bei einem Perl-Script kann das manchmal bereits die shebang sein, oder im Scriptverlauf irgendeine falsch gesetzte Variable. Sowas findet man eben wirklich _nur dann_ heraus, wenn du deine wörtliche Erklärung mit der Preisgabe deines (Arbeits-)Codes vergleichen läßt.
sorry, aber das ist eine völlig falsche Herangehensweise!
Jemand, der sein Problem und eine mögliche Lösung nicht etwas abstrakter Beschreiben und dies diskutieren kann, sollte gar nicht erst anfangen zu programieren! Dabei kommt meist toller Code raus!
Dabei meine ich noch nichtmal den Code in seiner Form sondern in seiner Idee zur Lösung des Problems!
Suchbegriff = Wein.
Öhm ... och nö. Hier im Forum habe ich das Monopol auf "Holunderwein" ;-)
"Weinen" bekommt 1 Punkt, "Schwein" 1 Punkt, "Wein" 1 Punkt.
Man merkt: Haut nicht so hin.Genau. Weil du den Holunderwein ausgelassen hast ;-)
Also nix für ungut: lade dein Script als Textdatei irgendwo auf eine temporäre Adresse hoch, daß man es sich anschauen kann. Es geht wirklich nicht darum, auf diese Weise irgendwelche "Freeware" zu erhalten, sondern es geht darum, dir beim Debugging deines Scripts zu helfen.
Tue es nicht (nur)!
Es sollte eher diskutiert werden, was für Algorithmen interessant erscheinen.
Da ich mich (etwas) mit Suchmaschinen beschäftige, sehe ich eine Menge Möglichkeiten Gewichtungen hinzubekommen. Dabei muß man sagen, daß es eine perfekte Lösung nicht gibt, zumindest nicht, wenn das Gerät noch schnell sein soll und dennoch auch - was ich wichtig finde - unscharf suchen kann.
Z.B. können Google und Co. wohl alle nicht wirklich unscharf suchen, sie können Joker nur am Wortende - nie am Anfang setzen. Deshalb sind sie auch so schnell.
So würde eine Anfrage nach "Wein" bei Google niemals "Holunderwein" finden.
Zum Punkt Gewichtung:
Wie gesagt, man sollte _noch_ nicht vom Code sprechen! Aber interessant wäre, ob Du ein DBMS (wie MySQL) benutzt! Dann ist interessant, wie groß der Wortraum werden wird, d.h. wie groß ist der Datenumfang.
Bei MySQL bietet sich u.a. eine Volltextsuche an, die aber bei großen Datenmengen zu langsam wird und Teilwortsuchen auch nur bedingt kann.
Die Gewichtung würde hier automatisch erfolgen (über SQL).
Andere Möglichkeit:
Ziehe alle relevanten Worte in eine Tabelle, indiziere diese Worte und berechne für jedes Dokument pro Wort eine Relevanz. Dabei wäre die Relevanz z.B. einfach der Quotient "Anzahl des Wortes" / "alle Worte im Dokument"
Gruß
Reiner
hey Reiner,
1.) Jede Fundstelle für einen Suchbegriff bekommt 1 Punkt
Siehst du? _Genau das_ möchte ich halt nicht als verbale Beschreibung lesen, sondern dazu in den zugehörigen Quelltext schauen.
sorry, aber das ist eine völlig falsche Herangehensweise!
Nö.
Es ist richtig, daß eine verbale Problembeschreibung sehr hilfreich sein kann. Aber ohne Code nutzt sie nicht viel. Erst in der Kombination von verbaler Beschreibung und Code kann man, als Forumsteilnehmer, nachschauen, wo denn ein Fehler liegen könnte.
Jemand, der sein Problem und eine mögliche Lösung nicht etwas abstrakter Beschreiben und dies diskutieren kann, sollte gar nicht erst anfangen zu programieren!
Ich darf dich dezent auf einen mächtig gewaltig großen Archivthread verweisen ;-)
Also nix für ungut: lade dein Script als Textdatei irgendwo auf eine temporäre Adresse hoch, daß man es sich anschauen kann.
Tue es nicht (nur)!
Es sollte eher diskutiert werden, was für Algorithmen interessant erscheinen.
Es ist genausowenig zielführend, wenn "wir" bloß irgendein (fehlerhaftes) Script vor den Latz geknallt bekommen würden, insofern hast du recht. Die verbale Fehlerbeschreibung und der Code müssen einander schon irgendwie ergänzen resp. zueinander passen.
Zum Punkt Gewichtung:
Wie gesagt, man sollte _noch_ nicht vom Code sprechen!
Das halte ich für absolut verkehrt.
Aber interessant wäre, ob Du ein DBMS (wie MySQL) benutzt!
Von einer Datenbank war im OP überhaupt nicht die Rede. Selbstverständlich gibt es Methoden, eine Datenbank zu durchsuchen und die Suchergebnisse darstellbar zu machen, die mit dem einfachen Durchsuchen von Webverzeichnissen und/oder HTML-Dokumenten nahezu nichts zu tun haben.
Grüße aus Berlin
Christoph S.
Nö.
Doch! ;-)
Es ist richtig, daß eine verbale Problembeschreibung sehr hilfreich sein kann. Aber ohne Code nutzt sie nicht viel. Erst in der Kombination von verbaler Beschreibung und Code kann man, als Forumsteilnehmer, nachschauen, wo denn ein Fehler liegen könnte.
Naja, die Frage war wohl schon eher nach Vorgehensweise (=Algorithmus).
Du meintest eben sowas wie
<überspitzt>
zeig mir mal Deine Shabang-Zeile, vielleicht ist da was falsch
</überspitzt>
Hatte meiner Meinung nichts mit dem Problem am Hut. Insofern hier: erstmal kein Code sinnvoll.
Zum Punkt Gewichtung:
Wie gesagt, man sollte _noch_ nicht vom Code sprechen!Das halte ich für absolut verkehrt.
s.o. (u.u. :-))
Aber interessant wäre, ob Du ein DBMS (wie MySQL) benutzt!
Von einer Datenbank war im OP überhaupt nicht die Rede. Selbstverständlich gibt es Methoden, eine Datenbank zu durchsuchen und die Suchergebnisse darstellbar zu machen, die mit dem einfachen Durchsuchen von Webverzeichnissen und/oder HTML-Dokumenten nahezu nichts zu tun haben.
Du wirfst jetzt aber alles durcheinander, oder?
Wo liegt jetzt der Zusammenhang von Webverzeichnis/HTML-Doc. und DBMS?
Die Frage von mir danach hatte einen Grund, nämlich wenn als online-Version gedacht und nicht offline (da wäre vielleicht JS die Lösung), wäre die Info, ob eine Datenbank zur Verfügung steht, sehr interessant! Jedenfalls im ersten Schritt interessanter als über verwendeter Sprache und noch besser genauer Code.
Nochmal: Ich glaube, die Ursprungsfrage war genereller Art und nicht: "Das klappt nicht, wo ist denn der Fehler (Abbruch in Zeile 14)"...
Gruß
Reiner
Grüße aus Berlin
Christoph S.
Hi,
Für die Gewichtung der Fundstellen (welche Treffer/Artikel sind besser, welche schlechter?) muss ich zumindest 2 Kriterien berücksichtigen:
Ich befürchte, das ist nicht ganz so einfach ;-)
(1) der Suchbegriff als kompletttes Wort muss besser gewichtet werden als wenn der Suchbegriff nur am Anfang oder Ende eines Wortes steht (Wenn Suchbegriff = "Programm", dann muss die Fundstelle "Programm" besser bewertet werden als "Programmierer" oder als "gramm"
Nunja, Perls Regex kennt "Wort" und "kein Wort", die dürften dafür recht nützlich sein.
(2) wenn 2 Begriffe gesucht werden, dann muss ein Text, der 3x den ersten und 3mal den zweiten Begriff enthält, besser bewertet werden als ein anderer Text, der 6mal den ersten und 0mal den zweiten enthält.
Ähm ... nun, das _scheint_ nur offensichtlich.
Kann aber durchaus benutzt werden.
Soweit so gut. Jetzt tue ich mich aber schwer, diese Kriterien mathematisch umzusetzen, also einigermassen sinnvoll zu quantifizieren. Nach zwei Stunden Googeln habe ich bislang nichts dazu gefunden.
Ja, es ist ein wenig blöd, wenn man die passenden Suchbegriffe nicht kennt. Ist bei Google aber leider prinzipbedingt.
Weiß jemand dazu Texte oder eigene Tipps?
Darf ich das ein wenig umstellen zu "Tips und eigene Texte"? ;-)
Ich habe kürzlich etwas verbrochen, das eine Suche in Javascript skizzieren soll und mich dort im Laufe der Beschreibung auch dem Prinzip der Suche gewidmet, darunter natürlich auch die Wichtung. Eine kurze und alles andere als vollständige mathematische Übersicht ist unter http://selfhtml.christoph-schnauss.de/artikel/javascript/similarity/similarity.html#similweight zu finden. Es wäre aber empfehlenswert das ganze Machwerk durchzugehen. Ich verrate jedoch nicht für wen ;-)
so short
Christoph Zurnieden
(1) der Suchbegriff als kompletttes Wort muss besser gewichtet werden als wenn der Suchbegriff nur am Anfang oder Ende eines Wortes steht (Wenn Suchbegriff = "Programm", dann muss die Fundstelle "Programm" besser bewertet werden als "Programmierer" oder als "gramm"
Nunja, Perls Regex kennt "Wort" und "kein Wort", die dürften dafür recht nützlich sein.
nee, Levenstein-Verschiebung wäre da viel besser? Natürlich kann man vorher auf RegExp testen, um die Treffer einzugrenzen.
Gruß
Reiner
Hi,
(1) der Suchbegriff als kompletttes Wort muss besser gewichtet werden als wenn der Suchbegriff nur am Anfang oder Ende eines Wortes steht (Wenn Suchbegriff = "Programm", dann muss die Fundstelle "Programm" besser bewertet werden als "Programmierer" oder als "gramm"
Nunja, Perls Regex kennt "Wort" und "kein Wort", die dürften dafür recht nützlich sein.
nee, Levenstein-Verschiebung wäre da viel besser?
Was ist eine Levenshtein-_Verschiebung_?
Natürlich kann man vorher auf RegExp testen, um die Treffer einzugrenzen.
Wieso eingrenzen? Damit wird nichts eingegrenzt, das ist ein exakter Treffer bzw Fehlschuß. Wenn ein Wort höher gewichtet werden soll, als die Buchstabenfolge in einem Kontext als echte Untermenge, dann liefern Perls Regexp-Konstruktionen "Wort" und "kein Wort" genau das richtige Mittel dazu. Wenn auch nicht zum Finden sondern vorher: zum Suchen. Der Rest ist einfacher Vergleich oder noch besser ein "longest common substring" wenn's eine deutsche oder ähnliche Sprache ist. Komplexere Algorithmen sind bei der vermuteten überschaubaren Textmenge höchstwahrscheinlich nicht nötig. Anders natürlich beider Gewichtung der so ermittelten Fundstellen an sich, das ist es in diesem Fall wohl eher nötig einen etwas ausgefuchsteren Algorithmus als nur
[latex]
\left(\sqrt{\log\left(\frac{N}{n_t}}\right)\right)\left(\log\left(1+f_t\right)\right)
[/latex][1]
zu benutzen.
so short
Christoph Zurnieden
[1]
N ist die Anzahl der Worte insgesamt
n_t ist die Anzahl des Suchbegriffes in N
f_t ist die Anzahl des Suchbegriffes im lokalem Dokument
Hi,
(1) der Suchbegriff als kompletttes Wort muss besser gewichtet werden als wenn der Suchbegriff nur am Anfang oder Ende eines Wortes steht (Wenn Suchbegriff = "Programm", dann muss die Fundstelle "Programm" besser bewertet werden als "Programmierer" oder als "gramm"
Nunja, Perls Regex kennt "Wort" und "kein Wort", die dürften dafür recht nützlich sein.
nee, Levenstein-Verschiebung wäre da viel besser?
Was ist eine Levenshtein-_Verschiebung_?
Na, die Verschiebungen, die nötig sind, um das Zielwort genau zu treffen. Es war ja u.a. gefragt, wie man es hinbekommt, daß bei der Suche nach "programm" der Treffer "progamm" besser als "programmierer" oder "gramm" gewichtet werden soll.
Nun RegExpr ist der 1. Schritt, um überhaupt eine Worttabelle aufzubauen, aber wie stellst Du jetzt die Vergleiche an?
Dazu würde ich Levenshtein (von mir aus auch mit "h" :-)) empfehlen-am besten noch mit einer Kombination aus Soundex und Levenshtein.
Natürlich kann man vorher auf RegExp testen, um die Treffer einzugrenzen.
Wieso eingrenzen? Damit wird nichts eingegrenzt, das ist ein exakter Treffer bzw Fehlschuß. Wenn ein Wort höher gewichtet werden soll, als die Buchstabenfolge in einem Kontext als echte Untermenge, dann liefern Perls Regexp-Konstruktionen "Wort" und "kein Wort" genau das richtige Mittel dazu. Wenn auch nicht zum Finden sondern vorher: zum Suchen. Der Rest ist einfacher Vergleich oder noch besser ein "longest common substring" wenn's eine deutsche oder ähnliche Sprache ist. Komplexere Algorithmen sind bei der vermuteten überschaubaren Textmenge höchstwahrscheinlich nicht nötig. Anders natürlich beider Gewichtung der so ermittelten Fundstellen an sich, das ist es in diesem Fall wohl eher nötig einen etwas ausgefuchsteren Algorithmus als nur
[latex]
\left(\sqrt{\log\left(\frac{N}{n_t}}\right)\right)\left(\log\left(1+f_t\right)\right)
[/latex][1]
zu benutzen.so short
Christoph Zurnieden
[1]
N ist die Anzahl der Worte insgesamt
n_t ist die Anzahl des Suchbegriffes in N
f_t ist die Anzahl des Suchbegriffes im lokalem Dokument
Ok, aber das ist noch keine unscharfe Suche.
Gruß
Reiner
Hi,
Wenn Suchbegriff = "Programm", dann muss die Fundstelle "Programm" besser bewertet werden als "Programmierer" oder als "gramm"
nee, Levenstein-Verschiebung wäre da viel besser?
Was ist eine Levenshtein-_Verschiebung_?
Na, die Verschiebungen, die nötig sind, um das Zielwort genau zu treffen.
Achso, nein, das schimpft sich "Distanz".
Es war ja u.a. gefragt, wie man es hinbekommt, daß bei der Suche nach "programm" der Treffer "progamm" besser als "programmierer" oder "gramm" gewichtet werden soll.
Nein, war nicht (ich hab's aber auch zuerst so wie Du gelesen ;-). Jetzt verstehe ich Dich aber auch erst.
Es ging ihm laut Beschriebung wirklich nur um die Unterscheidung "als alleinstehendes Wort" (Programm), "als Wortbestandteil" (assemblerprogrammerfriendly) und "longest common substring" (Progress, Grammatik) und das dann in eben dieser Reihenfolge gewichtet.
Nun RegExpr ist der 1. Schritt, um überhaupt eine Worttabelle aufzubauen, aber wie stellst Du jetzt die Vergleiche an?
Zum Beispiel so (Pseudocode)
if(!searchExakt(Suchwort))
if(!searchAsPartOfWord(Suchwort))
if(!searchLongestCommonSubString(Suchwort))
return NothingFound
Dazu würde ich Levenshtein (von mir aus auch mit "h" :-))
Nun, Eigennamen sollte schon immer korrekt geschrieben sein, das gebietet schon die Höflichkeit. Der Mann heißt übrigens im Ganzem: Wladimir Iossifowitsch Levenshtein
empfehlen-am besten noch mit einer Kombination aus Soundex und Levenshtein.
Ich bin mittlerweile, wie auch in meinem Artikel beschrieben (*hint-hint* ;-) zu der Erkenntnis gekommen, das die Kosten für die Edit Distanz nicht für grobe Suchen lohnen und selbst im Feinbetrieb (z.B. im Kollisionsfeld vom Soundexergebnis) ist es auch nicht immer ergiebig genug die Kosten wieder einzuspielen.
Anders natürlich beider Gewichtung der so ermittelten Fundstellen an sich, das ist es in diesem Fall wohl eher nötig einen etwas ausgefuchsteren Algorithmus als nur
[latex]
\left(\sqrt{\log\left(\frac{N}{n_t}}\right)\right)\left(\log\left(1+f_t\right)\right)
[/latex][1]
zu benutzen.
Ok, aber das ist noch keine unscharfe Suche.
Nein, da es nicht um eine unscharfe Suche geht (Kann mich natürlich irren, nur hat sich der OP bis jetzt nicht wieder gemeldet). Es wird lediglich nach einer Möglichkeit gesucht die Fundstellen zu bewerten. Das das nicht so einfach ist sieht man ja schon bei Google.
so short
Christoph Zurnieden
Nein, da es nicht um eine unscharfe Suche geht (Kann mich natürlich irren, nur hat sich der OP bis jetzt nicht wieder gemeldet). Es wird lediglich nach einer Möglichkeit gesucht die Fundstellen zu bewerten. Das das nicht so einfach ist sieht man ja schon bei Google.
Ich hab mich bis jetzt nicht wieder gemeldet, weil ich gemerkt habe, dass ich die Problematik entweder sehr sehr fundiert angehen muss. (Wozu ich keine Zeit habe und was auch m.E. den Aufwand für eine kleinere Website nicht lohnt.) Oder ich muss pragmatisch herangehen, Setzungen vornehmen, Suchvorgänge auf der Seite protokollieren und auswerten. Und damit habe ich jetzt angefangen.
Noch nicht berücksichtigt habe ich Groß- und Kleinschreibung und auch nicht die Relation Suchtwörter/Anzahl der Wörter im Text. Ersteres nicht, weil ich einige Male bei Life-Suche erlebt habe, dass sehr viele User alles klein schreiben. Zweiteres nicht, weil auf der Website alle Artikel/Seiten etwa gleich gross sind.
Ich hatte allerdings schon vermutet, dass einige Betreiber von Websites, die mit eigenen Perl-Scripts oder modifizierter Freeware arbeiten, selbst schon mal auf das Problem gestossen sind und Lösungen erprobt haben. Es wird doch nicht auf jeder Website mit interner Suche mit Matt Wright's "simple-search.pl" gearbeitet, das nur nach ganzen Wörtern sucht und für jeden Treffer schlicht 1 Punkt gibt. Aber hierzu kam in diesem Thread bisher leider nichts.
Hi,
Nein, da es nicht um eine unscharfe Suche geht (Kann mich natürlich irren, nur hat sich der OP bis jetzt nicht wieder gemeldet). Es wird lediglich nach einer Möglichkeit gesucht die Fundstellen zu bewerten. Das das nicht so einfach ist sieht man ja schon bei Google.
Ich hab mich bis jetzt nicht wieder gemeldet, weil
War kein Vorwurf von mir oder gar eine Andeutung, nur mein dezidierte Hinweis darauf, das ich mich nur auf eine Vermutung stützte.
ich gemerkt habe, dass ich die Problematik entweder sehr sehr fundiert angehen muss.
Das ist nicht verwunderlich, da "Suchen" eines der Grundprobleme der angewandten Informationstechnik ist.
(Wozu ich keine Zeit habe und was auch m.E. den Aufwand für eine kleinere Website nicht lohnt.)
Nun, sobald eine Suche nötig wird, kann man die Site nicht mehr guten Gewissens als klein bezeichnen.
Oder ich muss pragmatisch herangehen, Setzungen vornehmen, Suchvorgänge auf der Seite protokollieren und auswerten. Und damit habe ich jetzt angefangen.
Ja, den Bedarf festzustellen ist stets eine gute Idee. Allerdings sind derartige Untersuchenungen schon von vielen anderen Leuten vorgenommen worden und diese hatten dabei festgestellt, das sich die Methode auch bei den unterschiedlichsten Themen innerhalb eines Kulturkreises nicht wesentlich ändert.
- Es gibt unterschiedliche Gewichtungen, je nachdem, ob ein Suchbegriff als ganzes Wort, nur am Wortanfang oder Ende gefunden wurde.
Entscheidend hierbei ist übrigens die Sprache. Aufgrund obiger Feststellung würde ich aber die deutsche Sprache vermuten. Die deutsche Sprache hat einige Eigenheiten unter anderem den Umstand, das Kettenwörter gebildet werden können (Der Sinn steckt dort meist am Ende) und Präfixe den Sinn grundlegend verändern können und beide Methoden kombinierbar sind (Der Sinn steckt dann eben _nicht_ am Ende).
- Es gibt Gewichtungen für die Fundstelle (Text, Header etc.)
Das bedeutet, das die Artikel stets sematisch sauber aufgebaut sein und auch bleiben müssen.
- Es gibt (sehr starke) Gewichtungen, je nachdem, wie viele von X Suchbegriffen gefunden wurden.
Ob die sehr stark sein sollen liegt an Stil der Artikel, das kann aber durchaus sein, ja. Ich möchte aber nicht versäumen darauf hinzuweisen, das sich so ein Prädikat _nur_ eignet, wenn auf den Suchbereich _niemand_ Einfluß nehmen kann, sprich wenn die Artikel alle automatisch erstellt wurden. Das ist in praxi nicht durchführbar (denn irgendeiner muß den Automaten ja schließlich schreiben), aber man sollte die Zügel zumindest in den eigenen Händen halten.
Noch nicht berücksichtigt habe ich Groß- und Kleinschreibung
Würde ich wie Google machen: alles klein und nur wenn der Suchbegriff groß geschrieben ist zuerst nach Großgeschriebenem suchen.
und auch nicht die Relation Suchtwörter/Anzahl der Wörter im Text [...] weil auf der Website alle Artikel/Seiten etwa gleich gross sind.
Gut, dann kannst Du Dir das natürlich sparen, dann hast Du Glück gehabt und solltest eigentlich einen ausgeben ;-)
Ich hatte allerdings schon vermutet, dass einige Betreiber von Websites, die mit eigenen Perl-Scripts oder modifizierter Freeware arbeiten, selbst schon mal auf das Problem gestossen sind und Lösungen erprobt haben. Es wird doch nicht auf jeder Website mit interner Suche mit Matt Wright's "simple-search.pl" gearbeitet, das nur nach ganzen Wörtern sucht und für jeden Treffer schlicht 1 Punkt gibt. Aber hierzu kam in diesem Thread bisher leider nichts.
Ich bezweifele auch schwer, das da etwas kommen wird.
So eine einfache Suche wie "simple-search.pl" kann man noch flott etwas aufhübschen aber es wäre eine ungeheure Arbeit aus einem mittlerweile 10 Jahre altem Script eine vollständige Suche zu machen. Es wird daher auf vorhandenes und gut erprobtes zurückgegriffen wie htdig, (hyper)estraier oder wie sie alle heißen mögen. Das sind aber ausgewachsene Suchmaschinen, mit allen damit verbundenen Haken.
Auch wenn das alles freie Software ist, umsonst sind die nicht zu haben, die kosten schon einiges an Einarbeitung!
Du könntest natürlich mal schauen, was CPAN so zu bieten hat.
so short
Christoph Zurnieden