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