Hallo,
in meinem Programm (in Perl geschrieben) möchte ich einen Hash, der sieht so aus:
234 => Obamas administration
nach den Stopwörtern durchsuchen die in einem Array liegen, und die Strings die diesen enthalten entfernen.
Habe mit grep-Funktion probiert, funktionert nur für einwörtige Strings.
$k=0;
foreach $foo (sort { $hash{$b}$hash{$a} } keys %hash) {
while($foo =~ /(.\*)\s(.\*)/){
if (grep {$\_ eq $1 or $\_ eq $2} @stopliste)
{
} #nichts tun, wenn Wort in Stopliste enthalten ist.
else {
if($hash{$foo} \>= 1){
print "$hash{$foo} =\> join($1, $2\n)";
$k++;
}
}
}
}
Was ist da falsch???
Bin für jeden Vorschlag dankbar.
_[MOD]:
-Tags hinzugefuegt, bitte in Zukunft selbst machen_
Hallo,
in meinem Programm (in Perl geschrieben) möchte ich einen
Hash, der sieht so aus:
234 => Obamas administration
Also die Zahl ist der key, und der Text der Wert?
nach den Stopwörtern durchsuchen die in einem Array liegen,
Leg sie doch in ein Hash, dann musst du nicht durchsuchen sondern kannst Direktzugriffe darauf machen.
und die Strings die diesen enthalten entfernen.
Habe mit grep-Funktion probiert, funktionert nur für
einwörtige Strings.
$k=0;
foreach $foo (sort { $hash{$b}$hash{$a} } keys %hash) {
while($foo =~ /(.*)\s(.*)/){
if (grep {$_ eq $1 or $_ eq $2} @stopliste)
{
} #nichts tun, wenn Wort in Stopliste enthalten
ist.
Vermutlich wuerde sowas besser passen:
while ($foo =~ /(\w+)/g) {
if (!exists $stoppwords{$1}) {
# do stuff here
}
}
Gruesse,
Moritz
[MOD]: markup fix
Hallo,
in meinem Programm (in Perl geschrieben) möchte ich einen
Hash, der sieht so aus:
234 => Obamas administration
nach den Stopwörtern durchsuchen die in einem Array liegen,
und die Strings die diesen enthalten entfernen.
Habe mit grep-Funktion probiert, funktionert nur für
einwörtige Strings.
grep funktioniert manchmal auch mit mehreren „Worten“.
In Ergänzung (bzw. Erweiterung) zu Moritz’ letztem Beispiel
würde ich wie folgt vorgehen:
...
# Vorhandene Stopliste:
my @stoplist = (..., ..., ...);
# in Hash umwandeln und jeweils 0 setzen (Perl-idiom):
my %stophash;
@stophash{@stoplist} = (0) x @stoplist;
# Text (Hashvalue) loeschen - wenn in Stopliste
for my $v (values %hash) {
$v = undef if grep exists $stophash{$\_}, $v =~ /\w+/g;
}
Das isses schon. Nun kannst Du alle „ungelöschten“
Einträge ausdrucken:
...
# print undeleted
print "$\_ =\> $hash{$\_}\n"
for grep defined $hash{$\_}, keys %hash;
...
aber auch alle gelöschten Einträge bestimmen:
...
# print deleted
print "$\_ =\> [deleted]\n"
for grep !defined $hash{$\_}, keys %hash;
...
Grüße
CMБ
Hallo Semjon Michailovich,
erstens Danke für den Tipp, aber es funkzioniert irgendwie nicht so wie ich es mir vorstelle. Möglicherweise habe ich nicht genau erklärt, was das Programm soll: es sollen diejeniege Phrasen aus dem Hash gelöscht werden bei dennen die eine oder die andere Komponente in der Stopwortliste enthalten sei.
@stophash{@stoplist} = (0) x @stoplist;
Ich hätte noch die Frage:
erstellt diese Zeile alle möglichen Kombinationen aus dem Array?
Gruss,
Krokodil Gena.
Hallo
erstens Danke für den Tipp, aber es funkzioniert irgendwie
nicht so wie ich es mir vorstelle. Möglicherweise habe ich
nicht genau erklärt, was das Programm soll: es sollen
diejeniege Phrasen aus dem Hash gelöscht werden bei dennen die
eine oder die andere Komponente in der Stopwortliste enthalten
sei.
Dann ist es am besten, Du zeigst mal die Daten
(oder ein paar davon - womit es gehen würde wenn
es gehen würde) hier im Forum und eine kurze
Beschreibung was rauskommen soll.
@stophash{@stoplist} = (0) x @stoplist;
Ich hätte noch die Frage:
erstellt diese Zeile alle möglichen Kombinationen aus dem
Array?
Das erzeugt einen Hash (ein Dictionary bzw. Lookup-Table),
bei dem die Array-Elemente die „Keys“ und ‚0‘-en die
„Values“ sind. In diesem Fall können die „Values“ jeden
Wert haben der von ‚undef‘ verschieden ist., man könnte
die values auch zum Aufaddieren der „Treffer“ benutzen.
Der Ausdruck: (0)
ist eine Liste von Nullen mit einem Element,
ein Ausdruck: (0) x 2
erzeugt eine Liste mit zwei Nullen: (0, 0)
und: (0) x @stoplist
erzeugt eine Liste mit soviel Nullen, wie das
Array @stoplist Elemente hat, also
wörtlich: (0) SOOFT_WIE scalar(@stoplist)
Grüße
CMБ
Hallo
Dann ist es am besten, Du zeigst mal die Daten
(oder ein paar davon - womit es gehen würde wenn
es gehen würde) hier im Forum und eine kurze
Beschreibung was rauskommen soll.
Mein Programm extrahiert eine Liste von Nominal Phrasen, diese enthält allerdings diejenige die ich aussortieren will. Ich habe eine Liste von Stopwörtern erstellt, um die „unerwüschte“ auszusortieren.
Output:
other investment => 1
selection committee => 1
future job => 1
select committee => 1
Diese hier möchte ich weghaben:
future job => 1
other investment => 1
In der Liste aber nur:
other
future
aber keine: job oder investment.
D.h. das falls eines der Wörtern in Stopliste erhalten sei, soll die ganze Phrase weg.
Gruss,
Krokodil Gena.
Hallo
Mein Programm extrahiert eine Liste von Nominal Phrasen, diese
enthält allerdings diejenige die ich aussortieren will. Ich
habe eine Liste von Stopwörtern erstellt, um die „unerwüschte“
auszusortieren.
Output:
other investment => 1
selection committee => 1
future job => 1
select committee => 1
Diese hier möchte ich weghaben:
future job => 1
other investment => 1
In der Liste aber nur:
other
future
Aha, also etwa so (?):
...
my %output = map +($\_, 1), (
'other investment',
'selection committee',
'future job',
'select committee'
);
# Vorhandene Stopliste als Hash
my %stop = map +($\_, 0), (
'other',
'future'
);
for my $k (keys %output) {
$output{$k} = 0 if grep exists $stop{$\_}, $k =~ /\w+/g;
}
print "undeleted:\n";
print "$\_ \n" for grep $output{$\_}, keys %output;
print "deleted:\n";
print "$\_ =\> \n" for grep !$output{$\_}, keys %output;
...
Grüße
CMБ
Hallo,
vielen vielen Dank!
Das funktioniert hervorragend, sogar für die Phrase der Länge > 2, genau das, was ich gebraucht habe!!!
Gruss,
Krokodil Gena.