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);
}
}