|< 1 2 >| | 19 Einträge, 2 Seiten |
1 2 3 4 5 6 7 8
$text =~ s/ (?<=\.\x20) (\w+) /foo($1)/xeg; sub foo { my $word = shift; my $lc_word = lc $word; return $word if not exists $hash{ $lc_word }; return $lc_word; }
Gast+2008-06-26 17:17:34--Wenn ein bestimmtes Wort innerhalb eines Satzes (also nicht am Satzanfang) immer kleingeschrieben wird, und es taucht plötzlich am Satzanfang auf, ist aber da großgeschrieben, dann soll Perl dieses Wort am Satzanfang in Kleinbuchstaben umwandeln. So benötigt man keinerlei sprachliches Wissen.
...
Zunächst könnte man doch alle verschiedenen kleingeschriebenen Wörter im Text in einem Hash ablegen, in etwa so:
...
Jetzt möchte ich nur alle Wörter am Satzanfang betrachten, also alle großgeschriebenen Wörter, die nach einem Punkt kommen. Wenn ein solches Wort identisch ist mit einem Wort aus dem Hash und sich nur in der Schreibung unterscheidet, dann soll dieses Wort am Satzanfang eben kleingeschrieben werden. Aber ich weiß nicht, ob sowas a) geht und b) wies geht. Meine Versuche warn bisher erfolglos.
KurtZ+2008-06-26 17:39:46--also zuerstmal finde ich Threadtitel mit "Hilfe!" kacke aber hier trotzdem mein Senf:
desweieteren hängts von der Regel ab, wenn du sagst
A) alle am Satzanfang großgeschriebenen Wörter die mal kleingeschrieben werden
kannst du es IMHO mit einer einzigen RegEx mit Lookahead schaffen.
Du greifts alle Wörter nach einem Statzendezeichen denen eine kleingeschriebene Version folgt ODER eine kleingeschriebene Version vorhergeht.
Wenn die Regel lautet:
B) alle am Satzanfang großgeschriebenen Wörter die sonst immer und mindestens einmal kleingeschrieben werden!
wirds mit einer RegEx viel schwieriger.
ich würde dann wie Vorgeschlagen eine Schleife mit Parser schreiben, der alle Nichtanfangswörter in ein "Gesehen"-Hash einträgt.
dann im zwoten Durchlauf alle Anfangswörter darauf überprüfen ob in dem gesehen-Hash eine kleingeschriebe Version steht und keine großgeschriebene.
wenn du wilst das dir jetzt hier jmd coden hilft, dann entscheide dich für A oder B oder gib eine neue C vor, RegExe bedeuten nämlich viel Testarbeit und die macht man ungern umsonst.
Gast+2008-06-26 17:50:56--@Linuxer
Habe grad deinen Ansatz ausprobiert. Das Problem dabei ist, jedes erste Wort eines Satzes wird durch das letzte Wort des gesamten Textes ersetzt. Also jeder Satz beginnt plötzlich immer mit dem gleichen Wort.
1
2
Ruhe sanft . Die Ruhe vor dem Sturm . Er ruhe in Frieden . Ruhe ist's, was er sucht . Macht korrumpiert . Das macht aber dem Maechtigen nichts .
ruhe sanft . Die Ruhe vor dem Sturm . Er ruhe in Frieden . ruhe ist's, was er sucht . macht korrumpiert . Das macht aber dem Maechtigen nichts .
Gast+2008-06-26 17:50:56--@ Gast da oben
Dein Ansatz ist sehr wirr, da steig ich nicht durch. Map- und Grep-Funktion hatten wir noch nicht im Kurs.
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
#!/usr/bin/perl
use strict;
use warnings;
my $text = 'Hier steht ein langer Text , in dem das erste Wort klein gemacht werden soll , so wie hier .';
print "Input:\n$text\n\n";
my @words = split ' ', $text;
my %words;
my %starting_words = map {
my $t = $words[$_];
$words{$t}--;
$t => $_
} grep {
$words{$words[$_]}++;
$words[$_-1] =~ /^[\.!\?]$/
} 0 .. $#words;
foreach my $key ( keys %starting_words )
{
my $lckey = lcfirst $key;
if ( exists $words{$lckey} && ( $words{$lckey} > $words{$key} ) )
{
$words[$starting_words{$key}] = $lckey;
} # if
} # foreach
print "Output:\n", join( ' ', @words ), "\n";
<STDIN>;
__END__
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my %words;
my %starting_words;
for my $i ( 0 .. $#words )
{
my $cur_word = $words[$i];
$words{$cur_word}++;
if ( $words[$i-1] =~ /^[\.!\?]$/ )
{
$words{$cur_word}--;
$starting_words{$cur_word} = $i;
} # if
} # for
|< 1 2 >| | 19 Einträge, 2 Seiten |