Namazu-users-ja(旧)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: 文字列の出現回数を知りたい
寺西です。
金城 尚志 wrote:
>
> 分かち書きされたすべての単語の
> (それぞれの)出現回数を知るにはどうしたら
> よいのでしょうか?
Namazu を利用しようと思ったのは何故なんでしょう。
> 達成したいことは、当方の文書の中で頻繁に使用
> される単語がなにかを知ることです。
...
> NMZ.wを利用して、上記のような事を達成できないかなと
> 思っております。
NMZ.w には出現した単語しか登録されておらず、出現回数は含まれて
いません。
NMZ.i には単語nを含む文章IDが記録されていますが、同じ文章の中に
同じ単語が含まれる場合は、統合されます。
つまり、文章中の単語の出現回数の情報は、Namazu のインデックスには
(欠落するので)含まれておらず、目的のことはできないものと思います。
> アドバイス頂けないでしょうか?よろしくお願いします。
Text::Kakasi を使うのなら、例えば、こんなプログラムで目的は
果たせます。(もっとも、大量のファイルを処理するのなら、適当に
書き換える必要はありますが。)
#!/usr/bin/perl -w
use strict;
use Text::Kakasi;
my %WordNum = ();
my $res = Text::Kakasi::getopt_argv('kakasi', '-ieuc', '-w');
my $str = Text::Kakasi::do_kakasi(
"金城が金の城(金城)に住んでいるわけではない。
▲▲▲||||||||||||||||||●●●"
);
$str =~ s/\n|\t/ /g;
$str =~ s/ +/ /g;
my @words = split(/ /, $str);
foreach my $word (@words) {
if (exists $WordNum{$word}) {
$WordNum{$word}++;
} else {
$WordNum{$word} = 1;
}
# print $word . "\n";
}
my @keys = sort {
$WordNum{$b} <=> $WordNum{$a} ||
$a cmp $b
} keys %WordNum;
foreach my $key (@keys) {
print "$key : ($WordNum{$key})\n";
}
実行結果は、こんな感じです。もちろんバグがあるかもしれませんし、
無保証です。バグはご自身で直してください。
金城 : (2)
|||||||||||||||||| : (1)
。 : (1)
( : (1)
) : (1)
●●● : (1)
▲▲▲ : (1)
が : (1)
でいるわけではない : (1)
に : (1)
の : (1)
金 : (1)
住ん : (1)
城 : (1)
まぁ、大量のファイルを扱うのであれば、途中でファイルに記録して...
といった処理が必要になってくるでしょうね。
--
=====================================================================
寺西 忠勝(TADAMASA TERANISHI) yw3t-trns@xxxxxxxxxxxxxxx
http://www.asahi-net.or.jp/~yw3t-trns/index.htm
Key fingerprint = 474E 4D93 8E97 11F6 662D 8A42 17F5 52F4 10E7 D14E