私はこの基本的な思考プロセスをソートする方法を持っていますが、Perlのパワーを使用せず、しばらくしてどのようにしたいのですか(いくつかの頻度を忘れる)。私はこれを整理するより良い方法があるのだろうかと思っていた。2次元配列で頻度別にソートする方がいいですか?
目的見つかった一致の頻度に基づいて配列を並べ替えます。アレイの
サンプルアレイ
##ADDED 1 to END of EACH ROW, just because my sort forced me too!!!
my @all_matches = (["chpt10_2", "sent. 2", "alice", "nsubj", "animals", "protect"],
["chpt12_1", "sent. 54", "bob", "nsubj", "cells", "protect"],
["chpt25_4", "sent. 47", "carol", "nsubj", "plants", "protect"],
["chpt34_1", "sent. 1", "dave", "nsubj", "cells", "protect"],
["chpt35_1", "sent. 2", "eli", "nsubj", "cells", "protect"],
["chpt38_1", "sent. 1", "fred", "nsubj", "animals", "protect"],
["chpt54_1", "sent. 1", "greg", "nsubj", "uticle", "protect"]
);
現在のソート
@all_matches = sort {lc($a->[4]) cmp lc($b->[4])} @all_matches;
my ($last_word, $current_word, $word_count);
for my $j (0 .. $#all_matches) {
$current_word = $all_matches[$j][4];
if (lc($last_word) eq lc($current_word)) {
$word_count++;
}
else {
if ($j != 0)
{
for (my $k = 1; $k <= $word_count; $k++)
{
$all_matches[($j-$k)][6] = $word_count;
}
}
$last_word = $current_word;
$word_count = 1;
}
}
@all_matches = sort {$b->[6] <=> $a->[6] || lc($a->[4]) cmp lc($b->[4])} @all_matches;
通報 all_matchesが渡されたときに6列が1に設定されています!これが行われた理由は、カウント($match->[6]
)が空白だったことがあるためです。
ボーナス?最後の2つの列が一緒に表示される頻度の回数に一致します(今は2番目の最後の列をチェックするだけです)。このテストケースでは、最後の列はすべて同じですが、実際には末尾に別の接尾辞があります(保護、保護、保護など)。
私はハッシュを使ってみましたが、それがうまくいったと思っていましたが、いくつかのことを無視しました。
ここで私のハッシュを試みました。これが動作しなかった理由はまだあなたを教えてくれませんでした:
my %freq;
foreach (map{$_->[4]}@results) #feeds in list of animals, cells, uticle, etc.
{
$freq{lc $_}++;
}
@results = sort {$freq{lc $b->[4]} <=> $freq{lc $a->[4]} #freq order
or
$a->[0] cmp $b->[0] #text col 0
} @results;
小さな観測:いいえ必要性をあなたの入力はすべて既にlc()されているので、あなたのループの中でlc()を使用します。 – Flimzy