perl 关键词检索程序

来源:互联网 发布:python开源运维 编辑:程序博客网 时间:2024/06/08 12:36
#找出语音对应的sent文件,将关键词列表中的关键词在sent文件中的时间点输出到一个文件中
#################在下面的文本中检索关键词#####################

然后 你 妹妹 怎么 打电话 呀
26.1 26.36 26.36 26.48 26.48 27 27 27.24 27.24 27.86 27.86 28.12
0.0000
只能 扣费 打电话 市话 一 毛 二 长途 两 毛 我看 有没有 别的 扣费 的 稍等
29.23 29.5 29.5 29.5 29.5 30.12 30.12 30.44 30.44 30.54 30.54 30.66 30.66 30.84 30.84 31.11 31.11 31.26 31.26 31.42 31.42 31.64 31.64 31.91 31.91 32.18 32.18 32.54 32.54 32.81 32.81 33.2
0.0030

42.83 43
0.0000
只要 您 今日 取消 套餐 好
44.05 44.21 44.21 44.4 44.4 44.74 44.74 45.13 45.13 45.44 45.44 45.71
0.0100
对 呀 五 元 那 套餐 是 没有了 吧
46.76 46.92 46.92 47.16 47.16 47.62 47.62 47.77 47.77 47.93 47.93 48.28 48.28 48.38 48.38 48.81 48.81 49.06
0.0020
然后 身份证 号 身份证 号 记得 吧
54.57 54.87 54.87 55.2 55.2 55.39 55.39 55.391 55.391 55.392 55.39 55.62 55.62 55.84
0.0000
啊 行 那 祝 您 愉快
80.67 81.11 81.11 81.33 81.33 81.52 81.52 81.62 81.62 81.74 81.74 82.08
0.0000
################################################################

#!/usr/bin/perl
use Encode;
use Thread;
# use Encode;
#use threads::shared;


# $dat="测试文本";
# $str=decode("gb2312",$dat);


# print encode("gb2312",$str),"\n";


if($#ARGV < 2 )
{
        print "usage:perl key_search.pl wavlist  keywordlist  thread_count  result \n";
        exit(2);
}
#find ./  -name "*.wav" > wav.lst


my($wavlist,$keywordlist,$thread_count,$keyresult)=@ARGV;


open(WAV, "<$wavlist") or die "1\n";


open(KEYWORD, "<$keywordlist") or die "3\n";
open(RESULT, ">$keyresult") or die "4\n";


my @wav = ();
my @wkeyword = ();


@wav = <WAV>;
@wkeyword = <KEYWORD>;
#print ("@wkeyword\n");


$icount=0;


#foreach my $fwav (@wav) {
 #next unless defined $fwav;
  #   chomp $fwav;


   #       $threads[$tempcount]=Thread->new(\&start_thread,$fwav,\@wsent,\@wkeyword);
   #        $tempcount++;
    #                                        }
#foreach my $thread (@threads) {
# $thread->join();
#}

while($icount<scalar(@wav))
{    while(scalar(threads->list())<$thread_count)
    {
          chomp($wav[$icount]);
         threads->new(\&start_thread,$wav[$icount],\@wkeyword);
        $icount++;
    }
    foreach $thread(threads->list(threads::all))
    {    if($thread->is_joinable())
        {    $thread->join();
        }
    }
}
foreach $thread(threads->list(threads::all))
{    $thread->join();
}



sub start_thread{
 local ($lwav,$nkeyword)=@_;
 local @keyword=@{$nkeyword};
# print ("paramater is @keyword\n");
 #print ("paramater is $lwav\n");
  local $pos=0;
  local $kresult;
  local $count=0;
  local $leap=0;
  local @posarray=();
  local @resultarray=();
  local @tmpresult=();
  local $lkeyword;
  local $find=0;
  local @findkey=();
  #$id=Thread->self->tid();
  #print (RESULT  "in thread  $id :\n");
 # print "in thread  $id :\n";
 print (RESULT  "$lwav\n");
 $lwav=~s/\.wav/_sent.txt/;
 local  $lsent=$lwav;
# print  " sent file is $lsent\n";

  for  $lkeyword (@keyword)
  {
     chomp($lkeyword);
    #print ("line keyword is $lkeyword\n");
    @segkeyword = split( /=/ , $lkeyword );
     #print "segFile is @segFile\n";
     $tmpkey=$segkeyword[0];
     $dtmpkey=decode("gb2312",$tmpkey);
     open(FSENT, "<$lsent") or die "5\n";
     while($flsent=<FSENT>)
     {
         chomp($flsent);
         $integrate=$flsent;
         $integrate=~s/\s//g;
         $dintegrate=decode("gb2312",$integrate);
         #print ("sent line is $flsent\n");
         #  print ("sent line is $flsent\n");
           @segsent = split( /\s/ , $flsent );
           if($flsent =~ /[\x80-\xFF]+?/)
            {
                # print "flsent is $flsent\n";
                 $leap=0;
                 $count=0;
                 for my $lresult (@segsent)
                 {
                    $dresult=decode("gb2312",$lresult);
                    if($dresult=~/$dtmpkey/)
                    {
                        $find=1;
                        push @findkey, $tmpkey;
                        push @posarray, $count;
                        push @resultarray, $lresult;
                        #$pos=$count;
                        #print(RESULT "$lresult ");
                    }
                    $count++;
                  }

                           if(($dintegrate=~/$dtmpkey/)&&($find==0))
                 {
                    $count=0;
                    $len=length($dtmpkey);
                    for ($ilen=1;$ilen<$len;$ilen++)
                    {
                      $end=$len-$ilen;
                      $dtmpstr=substr($dtmpkey,0,$end);
                      #print encode("gb2312",$str),"\n";
                      $dstrtmp=encode("gb2312",$dtmpstr);
                      print ("partstr is $dstrtmp\n");
                      for my $lresult (@segsent)
                      {
                         $dresult=decode("gb2312",$lresult);
                         if($dresult=~/$dtmpstr/)
                         {
                           $find=1;
                           push @findkey, $tmpkey;
                           push @posarray, $count;
                           push @resultarray, $lresult;
                           #$pos=$count;
                           #print(RESULT "$lresult ");
                          }
                          $count++;
                       }
                       if($find==1)
                       {
                           last;  #already find longest substring.so break the loop
                        }


                       }


                   }
             }

                         if($leap==1)
             {
                  if($find==1)
                  {
                     $inumber=@posarray;
                     for($i=0;$i<$inumber;$i++)
                     {
                       $pos=@posarray[$i];
                       #print(RESULT "@resultarray[$i] @segsent[$pos*2] @segsent[$pos*2+1] ");
                       #$tmpline="@resultarray[$i] @segsent[$pos*2] @segsent[$pos*2+1]";
                       $tmpline="@findkey[$i] @segsent[$pos*2] @segsent[$pos*2+1]";
                       push @tmpresult,$tmpline;
                     }
                     #for my $pos (@posarray) and for my $kresult (@resultarray) 
                     #{
                     #  print(RESULT "$kresult @segsent[$pos*2] @segsent[$pos*2+1] ");
                     #}
                     #print(RESULT "\n");
                     $find=0;
                     @findkey=();
                     @posarray=();
                     @resultarray=();


                  }


             }
             if($leap==2)
             {
                   $inumber1=@tmpresult;
                   for($j=0;$j<$inumber1;$j++)
                   {
                      $tmp=@tmpresult[$j];
                       print(RESULT  "$tmp $flsent\n");
                   }
                   @tmpresult=();
                    next;
              }
              $leap++;


          }
          close(FSENT);


     }
  }


close(WAV);

close(KEYWORD);
close(RESULT);
                   


0 0