Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 長い単語の排除



古川です。

From: Tadamasa Teranishi <yw3t-trns@xxxxxxxxxxxxxxx>
Subject: [namazu-devel-ja] Re: 長い単語の排除
Date: Fri, 14 Mar 2003 22:31:48 +0900

yw3t-trns> > # 許可するフォーマットは、正規表現で指定するとか・・・
yw3t-trns> 
yw3t-trns> ちょっと実装が面倒かなと弱腰になったりしますが、こちらの方が
yw3t-trns> 便利そうですね。

インデックス中の単語を選別するツールを作ってみました。


パターンにマッチする単語のみを残します。

nmz-filter.pl pattern index_dir

pattern は perl の式を書いてください。評価される時点では、
対象の語は $_ に入っています。

例えば、
    
    nmz-filter.pl '/[a-z\xa1-\xfe]/' index_dir

とやると、アルファベットと日本語の入った単語だけが抜き出されま
す。

perl nmz-filter.pl '32 < length' index_dir

とやると、長さが 32 文字未満の単語だけが抜き出されます。

-t をつけると、実際にインデックスの書き換えはせずに、評価結果
だけが表示されます。


なお、このツールを使っても、フレーズインデックスのゴミは消えま
せん。なので、mknmz でできれば、そのほうがよいです。


-- 
Rei FURUKAWA 
furukawa@xxxxxxxxxxxx
#! /usr/local/bin/perl5 -w
# -*- Perl -*-
#
# nmz-filter.pl
#       by furukawa@xxxxxxxxxxxx
#
# コマンドラインにて評価式を記述することにより、いらない単語を
# インデックスから削除することができます。それにより、インデッ
# クスのサイズを減らすことができます。
#

use strict;
require 'nmzidx.pl';

my $opt_testonly = 0;
my $opt_verbose = 0;

while (@ARGV && $ARGV[0] =~ s/^\-//){
    my $argv = shift(@ARGV);
    while ($argv =~ s/^(.)//){
        my $ch = $1;
        $opt_testonly = 1 if $ch eq 't';
        $opt_verbose = 1 if $ch eq 'v';
    }
}

if (@ARGV == 2){
    &main(@ARGV);
}else{
    print "usage: $0 pattern index_directory\n";
    exit;
}

sub main{
    my $pattern = shift;
    my $index_dir = shift;

    my $nmzi = new nmzidx($index_dir, 'r');
    my $nmzo = new nmzidx($index_dir, 'w') unless $opt_testonly;

    my $nmzwi = $nmzi->open_word;
    my $nmzwo = $nmzo->open_word unless $opt_testonly;
    my ($word, %list);

    my $evalstr = "\$ret = ($pattern);\n";

    while (defined $nmzwi->read(\$word, \%list)){
        local $_ = $word;
        my $ret;
        eval($evalstr);

        if ($opt_testonly || $opt_verbose){
            if ($ret){
                print "REMAIN: $word\n";
            }else{
                print "DELETE: $word\n";
            }
        }
        if ($ret && !$opt_testonly){
            $nmzwo->write($word, \%list);
        }
    }
    $nmzwi->close;
    unless ($opt_testonly){
        $nmzwo->close;
        $nmzo->write_status($nmzi);
        $nmzo->replace_db(0);
    }
}