Thread Text nahe bei anderem Text
(13 answers)
Opened by Raubtier at 2014-06-10 17:36
Hallo Raubtier,
in der Korpuslinguistik spricht man von Textumgebung oder Kontext. Ich habe mit Deinem Beispiel mal versucht, die Kontextsuche bei Korpora.org beispielhaft nachzuprogrammieren: 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 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"; } } Es funktioniert mit Deinem Beispiel. Für weitergreifende Anwendungen wird man da noch tunen müssen. Für den professionellen Einsatz würde ich auf eine Search Engine wie Lucene mit SolR oder ElasticSearch zurückgreifen; die können solche Suchen out of the box. HTH Grüße payx |