Schrift
[thread]7669[/thread]

Wie ähnlich sind meine Strings: es geht hier nicht (nur) um Unterwäsche



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
root
 2006-01-31 19:33
#62533 #62533
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
Ich möchte eine Suche machen.

Alles kein Problem, ich guck mal wo ich den String finde und da ist er dann ja.
Wenn ich ihn nun aber öfter finde? Welcher kommt nach oben in der Ergebnisliste?
Wie finde ich den Meyer wenn mein User Meier eingegeben hat?

Gibt es in Perl sowas wie das hier in PHP?
Code: (dl )
substr_compare


http://www.php.net/manual/de/function.similar-text.php

Danke für eure Empfehlungen und Tipps auf die ich nun harre!
Ronnie
 2006-01-31 21:30
#62534 #62534
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
use String::Approx;

schau mal im cpan: http://search.cpan.org/~jhi/String-Approx-3.25/Approx.pm
Matze
 2006-01-31 21:44
#62535 #62535
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich würde das spontan warscheinlich so machen:
Den Text anhand von Leerraum trennen und in einem Array jedes Wort speichern:
Code (perl): (dl )
my @wort = split " ",$text;

Dann würde ich in einer foreach-Schleife die Benutzereingabe mit jedem Element aus @wort anhand von Regular Expressions testen und wenn das Element mit der Benutzereingabe übereinstimmt dann würde ich es in einem neuen Array speichern.
Code (perl): (dl )
1
2
3
4
5
6
7
my ($i, @treffer) = (0);
foreach (@wort) {
  if ($benutzer_eingabe =~ /$_/i) {
    $treffer[$i] = "$_";
    $i++;
  }
}

Und jetzt ist es dir überlassen ob du das Array sortieren willst oder nicht.
Unsortiert ist bei den @treffer n das im Text als erstes vorkommende Wort mit dabei.

Allerdings ist damit das Problem mit Meier und Meyer immer noch nicht gelöst.
Aber mit einem einfachen Algorithmus müsste das auch nicht schwer sein.
Wenn du die Variable anhand von $benutzer_eingabe =~ s/y/i/g; oder ähnlichem in einer for/foreach-Schleife die über der obigen foreach-Schleife liegt behandelst, können auch solche Treffer erzielt werden.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/usr/bin/perl
#
use strict;

my $text =
  "Hier ist Meier, und hier ist Meyer.\n".
  "Die Namen hören sich gleich an, aber trotzdem\n".
  "können sie beide zu den Treffern gezählt werden.";

my @wort = split " ",$text;

print "Bitte geben sie das Suchwort ein: ";
chomp(my$input = <STDIN>);

$input = "Meyer" if ! $input;

my @treffer;
my $i = 0;

for ($input =~ s/y/i/g,$input =~ s/s/x/g) {
  foreach (@wort) {
    if ($input =~ /$_/i) {
      $treffer[$i] = "$_";
      $i++;
    }
  }
}

print "\nTreffer: @treffer\n";
<STDIN>;


Das Programm istnicht getestet, ich weiß nicht ob das mit der for-Schleife und den Regular-Expressions funktioniert, sonst dürfte aber alles klappen.

MfG. Matze
Mit freundlichen Grüßen: Matze
Relais
 2006-01-31 22:02
#62536 #62536
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Ronnie,31.01.2006, 20:30]
Code: (dl )
use String::Approx;

schau mal im cpan: http://search.cpan.org/~jhi/String-Approx-3.25/Approx.pm[/quote]
@Ronnie:
Code: (dl )
[cpan]String::Approx[/cpan]


wird zu CPAN:String::Approx

... das hat auch noch den kleinen Vorteil, daß es auch neuere Versionen findet, während die Artikel hier altern.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Ronnie
 2006-01-31 22:24
#62537 #62537
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@relais: Super, dachte das ginge nur bei den Monks!
root
 2006-01-31 22:50
#62538 #62538
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
Matze deine Idee ist geil!
So eine Sonderzeichenregelung habe ich mit Umlauten schon mal gemacht.

ich glaube wenn ich beide Ideen verbinde, dann habe ich es.
Das Modul klingt gut. Ich muss mal sehen ob es bei 1und1 installiert ist, das ist immer die Hürde...
Wie reagiert denn das CPAN:String::Approx auf deutsche Sprache?
Ronnie
 2006-01-31 23:29
#62539 #62539
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
[quote=root,31.01.2006, 21:50]Wie reagiert denn das CPAN:String::Approx auf deutsche Sprache?[/quote]
Ist völlig egal. Es wird die Levenshtein-Distanz bestimmt (siehe Wikipedia). Zwischen Meyer und Meier ist also die Distanz 1, da nur ein Buchstabe sich verändert.\n\n

<!--EDIT|Ronnie|1138742968-->
renee
 2006-01-31 23:39
#62540 #62540
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das Modul reagiert gar nicht auf Sprache, sondern verwendet das fuzzy matching. Da es für Strings gedacht ist, ist die Sprache unerheblich.

Es gibt auch noch andere Module, mit denen man arbeiten könnte: CPAN:Text::Levenshtein oder CPAN:Text::WagnerFischer...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
ptk
 2006-01-31 23:57
#62541 #62541
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
String::Approx ist die Sprache egal. Mit dem Modul werden nur Zeichen verglichen (bzw. Zeichendreher und andere Tippfehler). String::Approx ist ein XS-Modul, d.h. es ist evtl. nicht trivial installierbar. Allerdings war die Version 2 noch pure perl (wenn auch etwas langsamer). Eine weitere Alternative könnte String::Similarity sein. Oder man arbeitet mit Digrams/Trigrams.
J-jayz-Z
 2006-02-01 00:03
#62542 #62542
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Schaut mal ins WIki, dazu habe ich mal einen Eintrag gemacht :
http://wiki.perl-community.de/bin/view/Wissensbasis/TeilweisesMatching
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2006-01-31 19:33.