bestimmte Wörter verlängern, Optimierung

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

bestimmte Wörter verlängern, Optimierung

Beitrag von Xwitz »

Ich möchte die MySQL Volltextsuche nutzen (etwas zweckentfremdet). Problematisch ist, daß Wörter mit weniger als vier Zeichen nicht berücksichtigt werden. Diese Einstellung zu ändern ist sehr aufwendig und nicht jedem möglich. Also habe ich mir überlegt, die für die Anwendung wichtigsten kurzen Wörter zu verlängern (durch einen sinnlosen und selten vorkommenden String).

Bisher mache ich es so:

Code: Alles auswählen

static $kurze_woerter = array('Was', 'Wo', 'Wer', 'Wie', 'Wem', 'Du', 'Ich', 'was', 'wo', 'wer', 'wie', 'wem', 'du', 'ich');

	// kurze (kleiner als vier Buchstaben) wichtige Wörter für Volltextsuche verlängern
	for($i = 0; $i < count($kurze_woerter); $i++)
	{
		$text =  str_replace($kurze_woerter[$i], $kurze_woerter[$i].$lang, $text);
	}
Die Groß- und Kleinschreibung soll erhalten bleiben und auf das Wort kann nicht nur ein Lehrzeichen sondern auch ein Satzzeichen folgen.

Ich sehe keine Möglichkeit zur Optimierung auf die Angabe der Wörter in Groß- und Kleinschreibung zu verzichten. Wer hat eine Idee?

Mit regulären Ausdrücken würde es gehen aber das wäre auch wieder langsamer als str_replace().

PS: Ich esse jetzt erst mal Abendbrot, nur zur Information, wegen dem angesprochenen "nicht wieder reinschauen".
Zuletzt geändert von Xwitz am 07.02.2007 22:18, insgesamt 1-mal geändert.
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Beitrag von Ambience »

hmm, seit wann gibt es das wörtchen static...

Naja, schnelle möglichkeit zu str_replace ist noch:

Code: Alles auswählen

// kurze (kleiner als vier Buchstaben) wichtige Wörter für Volltextsuche verlängern 
   for($i = 0; $i < count($kurze_woerter); $i++) 
   { 
      $text =  $kurze_woerter[$i].$lang; 
   }
wobei ich wiederum nicht weis was das bringt, da sich $text die ganze Zeit überschreibt...


Groß und Kleinschreibung:

Code: Alles auswählen

<?php

if ('lol' == 'LOL')
{
    echo "Groß und KLeinschreibung wird nicht unterschieden";
}

if ('llooll !== 'LLOOLL')
{
    echo "Groß und KLeinschreibung wird unterschieden";
}
Such dir dort eins aus...

Achja, wie wäre es mal mit der HyperDimensionalSchnellenCyberSpaceSuche ?

bzw. gibt es noch die Boardeigene Suchfunktion die du mit etwas Glück auch finden könntest...(vorrausgesetzt du hast keine Brille :D )

und dann wäre da noch: DieHyperDimensionalSchnellePhpDokumentation von so einem verrückten Menschen der sich die ganze Arbeit gemacht hat, und keiner will ihn besuchen.. Vllt. fast du dir an dein Herz und springst einmal über deine Faulheit.

Achja, und wenn du nochmal so nett wärst, dein Problem nocheinmal ganz genau zu erklären mit passendem Satzbau, damit ich genau weis was du willst, wäre ich dir sehr verbunden..
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

Wie lang sind denn die Texte, mit denen du arbeitest? Hast du evtl. PHP5 zur Verfügung?

Ansonsten bleiben nur noch die kleinen Optimierungen:

Code: Alles auswählen

$count = count($kurze_woerter);
for($i = 0; $i < $count; $i++)
Vielleicht kannst du dir auch mal das anschauen: http://benchmark.nophia.de/benchmarks-t ... -b-12.html
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Ich hätte vielleicht erwähnen sollen, daß die Wörter (potentiell) im Fließtext ($text) stehen.
Ambience hat geschrieben:bzw. gibt es noch die Boardeigene Suchfunktion die du mit etwas Glück auch finden könntest...(vorrausgesetzt du hast keine Brille :D )
Brille vorhanden, etwas der boardeigenen Suchfunktion sehr ähnliches, ist bereits zusätzlich zur Volltextsuche eingebaut. Um Dich jetzt mal falsch zu verstehen.
Ambience hat geschrieben:Achja, und wenn du nochmal so nett wärst, dein Problem nocheinmal ganz genau zu erklären mit passendem Satzbau, damit ich genau weis was du willst, wäre ich dir sehr verbunden..
Ich möchte bestimmte Wörter innerhalb eines Fließtexts um einen bestimmten String verlängern. Die Groß- und Kleinschreibung soll erhalten bleiben.

@ S2B, die "Texte" sind 100 Zeichen lang, eventuell erhöhe ich noch auf 255, mehr aber nicht. PHP5 habe ich nicht.
S2B hat geschrieben:Ansonsten bleiben nur noch die kleinen Optimierungen:

Code: Alles auswählen

$count = count($kurze_woerter);
for($i = 0; $i < $count; $i++)
Ojemine, ich dachte, das count() wird nur ein mal ausgeführt. Ich habe das so an Stellen gefunden wo ich nicht gedacht hätte, daß es sonst verwendet werden würde.

Den Link schaue ich mir gleich an.
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

OK, jetzt fallen die beiden alternativen Möglichkeiten, die ich im Kopf hatte, flach. Bleibt also nur noch die Optimierung der Schleife (entweder str_replace() Array-Parametern oder eben eine Schleife so, wie du es im Moment hast).

Ich würde allerdings die Lösung mit preg_replace() nicht gleich zur Seite schieben, sondern zuerst mal die Performance der beiden Lösungen vergleichen. :wink:
Wie wär's denn mit sowas:

Code: Alles auswählen

preg_replace('#([^a-zäöüß])([a-zäöüß]{1,3})([^a-zäöüß])#i', "\1\2$lang\3", $string);
Das kann man bestimmt auch nochmal optimieren... :wink:
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Beitrag von Ambience »

darf ich mal fragen wie du konkrekt die wörter verlängern willst?

also um: 5xa : aaaaa

oder um: 12345

dann wüsste ich nämlich noch eine elegante lösung.

edit: @ s2b:

Code: Alles auswählen

preg_replace('#([^a-zäöüß])([a-zäöüß]{1,3})([^a-zäöüß])#i', "\1\2$lang\3", $string);
mit dem #i wird aber nicht die groß und kleinschreibung beachtet.
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

Ambience hat geschrieben:edit: @ s2b:

Code: Alles auswählen

preg_replace('#([^a-zäöüß])([a-zäöüß]{1,3})([^a-zäöüß])#i', "\1\2$lang\3", $string);
mit dem #i wird aber nicht die groß und kleinschreibung beachtet.
Stimmt, du hast recht, ich war gerade bei preg_match. :-?

Code: Alles auswählen

preg_replace('#([^A-ZÄÖÜa-zäöüß])([A-ZÄÖÜa-zäöüß]{1,3})([^A-ZÄÖÜa-zäöüß])#', "\1\2$lang\3", $string);
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Man das überschlägt sich hier aber, ich Poste erst mal was ich habe:

Verschachtelt ist das schnellste und die Abarbeitung der for-Schleife entfällt (könnte ich aber auch bei den einzelnen weglassen.). Nachteil ist die Schreibarbeit. preg_replace ist aber nicht halb so langsam und ich könnte die Liste halbieren.

Kannst Du mir sagen, wie die Referenzierung aussehen muß, damit ein groß oder klein gefundenes Wort, in der Schreibweise wie es gefunden wurde, in der Ersetzung auftaucht.

Code: Alles auswählen

$str = preg_replace("/(wort)/i","$1.$lang",$str);
Ist das richtig? (Das wort wäre hier eins aus der Liste)

Sehe ich das richtig, dein Vorschlag würde alle kurzen Wörter verlängern oder?
Ambience hat geschrieben:mit dem #i wird aber nicht die groß und kleinschreibung beachtet.
Und dadurch kann man die Liste halbieren.

EDIT 1:
Ambience hat geschrieben:darf ich mal fragen wie du konkrekt die wörter verlängern willst?
Das $lang enthält den String um den verlängert werden soll. Er muß vor der Ausgabe auch wieder entfernt werden, muß also sehr sehr selten sein (z.B. jxqz) und sinnvoller Weise kurz.
Zuletzt geändert von Xwitz am 07.02.2007 22:03, insgesamt 1-mal geändert.
Benutzeravatar
Ambience
Mitglied
Beiträge: 628
Registriert: 02.09.2006 11:28
Wohnort: daheim
Kontaktdaten:

Beitrag von Ambience »

hier mal noch ein vorschlag(denke nun hab ich das richtig verstanden was du brauchst):

Code: Alles auswählen

preg_replace('/(.*?){4}/i', '$1' . $lang, $text);
das würde alle wörter mit 4 buchstaben verlängern... wenn du {1,4} machst, würde es alle wörter mit 1, 2, 3, 4 ziffernlängen um deine $lang verlängern...

das (.*?) könnte man gegebenfalls noch optimieren..


edit: und anstatt: (.*?){4} könntest du auch dein array durchlaufen in einer for schleife... aber wenn ich endlich wüsste was $lang für einen inhalt hat, könnte ich dir noch eine optimierte lösung ohne jegliches str_replace und preg_replace bringen... (dafür halt eine for)...
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Ich habe oben noch was editiert. "$lang enthält den String um den verlängert werden soll ..."

Ob es sinnvoll ist, alle kurzen Wörter zu verlängern, muß ich mir noch überlegen.

Code: Alles auswählen

$str = preg_replace("/(wort)/i","$1.$lang",$str);
Würde hier ein großes "Wort" zwar gefunden aber durch ein kleines ersetzt werden oder bezieht sich die Backreference auf den im Text gefundenen String?

Edit:
Ambience hat geschrieben:... könnte ich dir noch eine optimierte lösung ohne jegliches str_replace und preg_replace bringen... (dafür halt eine for)...
Das bezweifle ich, die zu ersetzenden Wörter stehen im Fließtext oder willst Du den erst in einzelne Wörter trennen?
Antworten

Zurück zu „Coding & Technik“