Jemand zu Hause?
QuoteLorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
2014-06-10T17:36:33 hlubenowKommt wohl auch darauf an, was "in der Nähe" bedeutet. Wenn's in derselben Zeile ist, wär's z.B. einfach.
1 2 3 4 5
my ($naehe) = $text =~ /(.{,100}sit amet.{,100})/ or die; my @suchphrasen = ("sed diam"); for (@suchphrasen) { warn "ja!" if $naehe =~ /\Q$_/; }
IPC::System::Simple,
Path::Class
IPC::System::Simple,
Path::Class2014-06-10T18:56:10 RaubtierDaher hatte ich überlegt, mit split an Whitespace zunächst Worte zu bilden und dann - tja, und dann? Die Suchphrasen haben 1 bis 3 oder 4 Wörter, selten auch mal mehr.
String::Diff. Wenn du deine Vergleichstexte in Häppchen aufteilst, die die gewünschte Größe haben könnte ich mir vorstellen, dass man damit auch arbeiten kann. Wenn sich auf dem Weg noch die Anforderung herausstellt, dass die Texte ganz leicht voneinander abweichen dürfen (z.B. Paragraf soll auch Paragraph als "gleich" erkennen), wäre das Modul bestimmt dafür geeignet.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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#!/usr/bin/perl use strict; use warnings; # Mögliche Kollokationen (statische Vorgabe) my %colls = ( 0 => 'vor' , 1 => 'nach' , 2 => 'vor oder nach' ); # Das Korpus my $txt = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.'; # Der Suchstring (Benutzereingabe) my $such = "sed diam"; # Die Textumgebungen (Benutzereingabe) mit Abständen (Anzahl Wörter im Zwischenraum) und Kollokationen (s.o. %colls) my %kontexts = ( "sit amet" => {'dist' => 3, 'coll' => 1} , "eirmod" => {'dist' => 2, 'coll' => 2} , "Lorem" => {'dist' => 8, 'coll' => 0} ); for my $ktxt (keys %kontexts) { my $dist = $kontexts{$ktxt}->{dist}; my $coll = $kontexts{$ktxt}->{coll}; my ($s1, $s2) = ($such, $ktxt); print "Suche '$such' bis zu $dist Textsegmente $colls{$coll} '$ktxt'\n"; my $hit; for (1..($coll ? $coll : 1)) { ($s1, $s2) = ($s2, $s1) if $coll; $hit = $1 if $txt =~ /(\b$s1\W*(?:\w+\W+){0,$dist}$s2\b)/i; last if $hit; } if ($hit) { print " Treffer: '$hit'\n"; } else { print " Kein Treffer\n"; } }
Tipp zum Debugging