• 项目准备(blog)


    classify

      1 use strict;
      2 #use warnings;
      3 
      4 my $file_id = "5";
      5 
      6 my $file_test = "$file_id\test_3.txt";
      7 open FTEST, $file_test or die "$file_test:$!
    "; #´ò¿ª²âÊÔÎļþ
      8 
      9 my $dir_out = $file_id . "\out";
     10 mkdir $dir_out or die "$dir_out:$!
    "; #Êä³öÎļþ¼Ð
     11 
     12 my $dir_in = $file_id . "\data";
     13 opendir DIR, $dir_in or die "can't open directory:$!
    ";#´ò¿ªÎļþ¼ÐѵÁ·×Üdata
     14 my @dir_in = readdir(DIR);
     15 
     16 foreach(@dir_in) #¶ÔÎļþ¼ÐdataÑ­»·£¬ÒÀ´ÎΪdata\govµÈ4¸öÎļþ¼Ð
     17 {
     18     next if/^./;
     19     my $din = "$dir_in\$_";#1\data\gov
     20     print "$din
    ";
     21     my $tag_file = $_; #ÕýÔÚ´¦ÀíµÄÀà±ðÃû£¬ ÈçgovµÈ
     22     print "tag_file:$tag_file
    ";
     23     opendir DIN, $din or die "$din:$!
    ";#Ñ­»·´ò¿ªdata\govµÈ4¸öÎļþ¼Ð
     24     my @files = readdir(DIN);
     25     
     26     my %count = (); #¼ÆËã¸÷¸öÀà±ð¸ÅÂÊ µ±Ç°Àà±ðµÄ΢²©×ÜÊý/×Ü΢²©Êý
     27     my $total = 0;  #ͳ¼Æ΢²©×ÜÊý
     28 
     29     my %hash = ();#¼ÆËã¸÷Àà΢²©µÄÐÅÏ¢
     30     my %voc = (); #ËùÓÐÀà±ðµÄµ¥´Ê ¼ü-µ¥´Ê£¬Öµ-µ¥´Ê³öÏÖ´ÎÊý
     31     my %hash_file_words = (); 
     32     
     33     foreach my $file (@files)#¶ÔÎļþ¼Ðdata\goveµÈ4¸öÎļþ¼Ð½øÐÐÑ­»·£¬ÒÀ´ÎΪdata\gov\other.txt£¬ data\gov\gov.txt
     34     {
     35         next if ($file =~ /^./);
     36         
     37         my $file_name = "$din\$file";
     38         open FIN, $file_name, or die "$file_name can't open file:$!
    ";    
     39       
     40       my $num = 0;  #ͳ¼Æÿ¸öÀà±ðÖеÄ΢²©ÊýÄ¿
     41         while(<FIN>)
     42         {
     43             chomp;
     44             $num ++;
     45             my @word = split;
     46             foreach (@word)
     47             {
     48                 $voc{$_}++;
     49                 $hash{$file}{$_}++;
     50             }
     51             
     52         $hash_file_words{$file} += @word;
     53         }
     54         
     55         $total += $num;
     56         $count{$file} = $num;
     57         print "count:$count{$file}
    ";
     58         
     59         close FIN;
     60     }
     61     
     62     my @sorted = sort{$voc{$b} <=> $voc{$a}} keys %voc;
     63     my %temp = ();
     64     
     65     for(my $i=5; $i<@sorted; $i++)           
     66     {
     67         next if($voc{$sorted[$i]}<1);   #ÒòΪԤÁϵÄÎÊÌ⣬µÍƵ´Ê»ã¶ÔÐÔÄÜÓ°Ïì½Ï´ó
     68         $temp{$sorted[$i]}=$voc{$sorted[$i]};
     69     }
     70     %voc=%temp;
     71     %temp=();
     72     
     73     my %dir_word_prob = ();
     74     my $vocabulary = keys %voc;  #×Ü´Ê»ãÊý
     75     foreach (keys %count)
     76     {
     77         $count{$_} = $count{$_}/$total; #¸÷¸öÀà±ð³öÏֵĸÅÂÊ ¸ÃÀà±ðÏÂ΢²©ÊýÄ¿/×Ü΢²©ÊýÄ¿
     78         my $temp=$_;
     79         #ÇóP£¨Wk|Vj£© ¼°vocabularyÖеÄÿ¸öµ¥´ÊWkÔÚÀà±ðÖÐËùÓÐÎļþ³öÏֵĸÅÂÊ£¬laplaceƽ»¬
     80         for(keys %voc)
     81         {
     82             $dir_word_prob{$temp}{$_} = log(($hash{$temp}{$_}+1)/($hash_file_words{$temp}+$vocabulary));
     83         }
     84     }
     85     
     86     closedir DIN;
     87     
     88     ############################################ÏÂÃæ½øÐзÖÀà
     89     
     90   my $file_out = "$dir_out\$tag_file.txt";
     91     open FOUT, ">", $file_out or die "can't open:$!";
     92     
     93     my %cnum = ();
     94     
     95     for my $key_tmp (sort keys %hash_file_words)
     96     {
     97         print "key:$key_tmp, value:$hash_file_words{$key_tmp}
    ";
     98     }
     99     my $class_result = "";
    100     while(<FTEST>)
    101     {
    102         chomp;
    103         my @word = split;
    104         
    105         my $judge = 0;#¼ÆËãÊôÓÚ¸÷¸öÀà±ðµÄ¸ÅÂÊ
    106         $judge -= 1000000;
    107         foreach my $c (keys %hash_file_words)
    108         {
    109             my $psen = 0;
    110             my $sumw = 0; #ij¸öµ¥´ÊÊôÓÚij¸öÀà±ðµÄ¸ÅÂÊ
    111             foreach my $w (@word)
    112             {
    113                 if (exists $hash{$c}{$w})
    114                 {
    115                     $sumw = $hash{$c}{$w};
    116                 }
    117                 else
    118                 {
    119                     $sumw = 0;
    120                 }        
    121                 my $pword = log(($sumw + 1)/($hash_file_words{$c} + $vocabulary));
    122               $psen += $pword;                
    123             }
    124 
    125             if($psen > $judge)
    126             {
    127                 $judge = $psen;
    128 
    129                 $class_result = $c;
    130             }        
    131         }
    132         print FOUT "$class_result
    ";            
    133     }
    134     
    135     seek FTEST, 0, 0;
    136 }
    137 close DIR;

    try

     1 use strict;
     2 use warnings;
     3 
     4 my $file_id = "1";
     5 my $ftrain = $file_id . "\train.txt";
     6 my $ftest = $file_id . "\test.txt";
     7 opendir DIN, "out" or die "out:$!
    ";#ÊäÈëÎÊÎļþ¼Ðout£¬²»ÐèÒª¸Ä
     8 open FTRAIN, ">", $ftrain or die "train.txt:$!
    ";#Êý×Ö¡°1¡±£¬±íʾÎļþ¼Ð1--¡·µÚÒ»´Î½»²æÑéÖ¤********ÐèÒª¸Ä
     9 open FTEST, ">", $ftest or die "test.txt:$!
    ";
    10 
    11 my @file = readdir(DIN);
    12 
    13 foreach(@file)
    14 {
    15     next if /^./;
    16     my $file_in = "out\$_";
    17     open FIN, $file_in or die "$file_in:$!
    ";
    18     
    19     if(($_ eq "1.txt") or ($_ eq "1.txt"))#ÕâÀïµÄ2¸öÎļþʱ½»²æÑéÖ¤×÷Ϊ²âÊÔ¼¯µÄÎļþ¡£**********ÐèÒª¸Ä
    20     {
    21         while(<FIN>)
    22         {
    23             print FTEST "$_";
    24         }
    25     }
    26     else
    27     {
    28         while(<FIN>)
    29         {
    30             print FTRAIN "$_";
    31         }
    32     }
    33     close FIN;
    34 }
    35 closedir DIN;
    36 close FTRAIN;
    37 close FTEST;

    1.pl

    use strict;
    use warnings;
    
    my %hash = ("gov" => 'Õþ¸®', "fir" => 'Ïû·À¾Ö', "pol" => '¾¯²ì¾Ö', "hos" => 'Ò½Ôº', "other" => 'ÆäËû');
    
    
    my $file_id = "5";
    
    my $file_data = $file_id . "\data";
    my $file_data_gov = $file_id . "\data\gov";
    my $file_data_fir = $file_id . "\data\fir";
    my $file_data_pol = $file_id . "\data\pol";
    my $file_data_hos = $file_id . "\data\hos";
    
    my $dir_in = $file_id . "\train";
    mkdir $file_data or die "data:$!
    "; #´´½¨ÊäÈëÎļþ¼Ðdata£¬ÑµÁ·ÓïÁϽ«·ÅÈëÆäÖÐ
    mkdir $file_data_gov or die "data\gov:$!
    "; #¶ÔgovernmentÊôÐÔ½øÐжþ·ÖÀàµÄѵÁ·ÓïÁÏ£¬´æ·ÅΪ2¸öÎļþgov.txt£¬ºÍother.txt£¬ÏÂÃæµÄÒÔ´ËÀàÍÆ
    mkdir $file_data_fir or die "data\fir:$!
    ";
    mkdir $file_data_pol or die "data\pol:$!
    ";
    mkdir $file_data_hos or die "data\hos:$!
    ";
    
    my $file_train = $file_id . "\train_3.txt";
    open FTRAIN, $file_train or die "$file_train:$!
    ";#´ò¿ªÑµÁ·ÓïÁÏ£¬ÏÂÃ潫¶ÔÆä½øÐа²×°4¸ö²»Í¬µÄ·ÖÀàÊôÐÔ½øÐл®·Ö£¬°´ÕÕ4¸öÊôÐԵĻ®·Ö½á¹û·ÅÈëdata\govµÈ4¸öÎļþ¼ÐÖÐ
    
    opendir DIN, $dir_in or die "1\train:$!
    ";#´ò¿ªÎļþ¼Ðtrain£¬ÀïÃæÓÐ4¸öÊôÐÔÌáÈ¡Îļþ, gov.txtµÈ£¬ÒÀ´ÎÊǶÔÓïÁϽøÐа²×°¸÷¸öÊôÐÔ½øÐжø·ÖÀàµÄÊôÐÔÌáÈ¡
    my @file = readdir(DIN);
    foreach(@file) #¶ÔÊôÐÔ±ê×¢Îļþ½øÐÐÑ­»·£¬¹²4´Î£¬Ã¿´Î°´ÕÕij¸öÊôÐÔ£¬¶Ôtrain_3½øÐжþ·ÖÀ࣬ÿ½øÐÐÒ»´Î¶þ·ÖÀà»áÔÚÎļþ¼ÐdataÏÂÉú²úÒ»¸öÊôÐÔÎļþ¼Ð£¬Èçgov£¬ govÏÂÓÐ2¸öÎļþ£ºgov.txt£¬ other.txt·Ö±ð´æ·ÅÕþ¸®ÊôÐÔºÍÆäËûÊôÐÔµÄÎļþ
    {
        next if /^./;
        print "$_
    ";
        my $fin_tag = $file_id . "\train\". $_;
        open TAG, $fin_tag or die "$fin_tag:$!
    ";#´ò¿ªÊôÐÔ±ê×¢Îļþ
        
        s/.txt//;
        my $tag = $_; #ÊôÐÔÃû
        my $fout_tag = $file_id . "\data\" . $tag . "\" . $tag . ".txt"; #¶þ·ÖÀàÏÂÃæµÄÎļþ£¬ÈçÕþ¸®:data\gov\ÀïÃæÓÐ2¸öÎļþgov.txtºÍother.txt·Ö±ð´æ·ÅÊôÐÔΪÕþ¸®ºÍÊôÐÔΪÆäËûµÄÎļþ
        my $fout_other = $file_id . "\data\" . $tag . "\other.txt"; 
        open FTAG, ">", $fout_tag or die "$fout_tag:$!
    "; #´´½¨gov.txtµÈ
        open FOTHER, ">", $fout_other or die "$fout_other:$!
    ";#´´½¨other.txtµÈ
        
        my @attr = (); #½«ÊôÐÔ·ÅÈëÊý×éattrÖÐ
        while(<TAG>)
        {
            chomp;
            push @attr, $_;
        }
        close TAG;
    
        my $num = 0; #ÿһÌõÓïÁϱê×¢µÄÀà±ðÐÅÏ¢
        my $gov = 0; #ͳ¼Æ¸÷¸öÀà±ðµÄÓïÁÏÊýÄ¿
        my $other = 0;
        
        while(<FTRAIN>)
        {
            if($attr[$num] =~ /$hash{other}/)
            {
                print FOTHER "$_";
                $other++;
            }    
            if($attr[$num] =~ /$hash{$tag}/)
            {
                print FTAG "$_";
                $gov++;
            }
            $num++;    
        }
    
        print "gov: $gov
    ";
        print "other:$other
    ";    
        
        close TAG;
        close FTAG;
        close FOTHER;
        seek FTRAIN, 0, 0;
    }
    
    close DIN;

    说明

    文件夹out 有10个标注好的语料1.txt...10.txt
    测试:(1.txt, 6.txt) (2.txt, 7.txt)....
    训练:其他

    =========================================================================================
    第一步:
    生成五倍交叉验证的5个训练集合测试集(此数据集为原始数据,不可以用于分类,需后续处理)
    *****************************************

    代码:
    try.pl:和文件夹out同一目录层级下运行
    功能:生成五倍交叉验证的5个训练集合测试集
    输入:文件夹out,文件夹out中有 1.txt-10.txt共计10个标注好的微博语料
    输出:文件夹1; 文件夹1中有2个文件:train.txt和test.txt分别是训练语料和测试语料
    备注:
    手工修改文件目录,生成测试集和训练集(一次交叉验证运行一次代码,改一次输入输出),共运行5次。
    依次生成 文件夹1-文件夹5

    ==========================================================================================
    第二步:
    提取各个训练集、测试集的属性
    ****************************************

    代码:
    4.pl: 和文件夹out同一目录下运行
    功能:提取各个训练集、测试集的属性
    输入:文件夹1:文件夹1中有2个文件:train.txt和test.txt分别是训练语料和测试语料
    输出:1、文件夹1//文件夹train 文件夹train里面共有4个文件:
    gov.txt
    hos.txt
    pol.txt
    fir.txt
    是对训练语料按照2分类得到属性标注结果

    2、文件夹1//文件夹test 文件夹train里面共有4个文件(正确属性):
    gov.txt
    hos.txt
    pol.txt
    fir.txt
    是对测试语料按照2分类得到属性标注结果

    3、文件夹1//文件夹character 文件夹train里面共有4个文件:
    charactertest.txt 对测试语料提取的总属性(正确属性)
    charactertrain.txt 对训练语料提取的总属性
    备注:
    手工修改文件目录(一次交叉验证运行一次代码,改一次输入输出),共运行5次。

    **********
    这样,文件夹1里面有3个文件夹,存放训练语料和测试语料的属性
    train
    test
    character

    文件夹1里面有2个文件,存放原始的标注文件
    train.txt
    test.txt

    ===========================================================================================
    第三步:
    处理原始语料,对文件夹1里面的2个原始标注文件train.txt, test.txt进行如下处理:

    1、去标注符号 (结果存放在train_1.txt, test_1.txt)
    2、中科院分词系统分词 (对train_1.txt, test_1.txt进行分词,得到结果 train_2.txt, test_2.txt)
    3、去除分词产生的词性标注,去停止词(对train_2.txt, test_2.txt进行分词,得到结果 train_3.txt, test_3.txt)
    **************************************

    代码:
    5.pl:和文件夹out同一目录下运行
    功能:去掉文件夹(文件夹1-5)中训练集、测试集(train.txt, test.txt)的标注符号
    输入:文件夹中的文件 train.txt, test.txt;(共10个文件)
    输出:文件夹中的文件 train_1.txt, test_1.txt(共10个文件), 和输入文件同一目录层级
    备注:
    手工修改文件目录(一次交叉验证运行一次代码,改一次输入输出,共运行5次。


    6.pl:和文件夹out同一目录下运行(该层级目录下需有停止词标list.txt)
    功能:去掉文件夹(文件夹1-5)中训练集、测试集(train.txt, test.txt)的词性标注,停止词
    输入:文件夹中的文件 train_2.txt, test_2.txt;(共10个文件)
    输出:文件夹中的文件 train_3.txt, test_3.txt(共10个文件), 和输入文件同一目录层级
    备注:
    手工修改文件目录(一次交叉验证运行一次代码,改一次输入输出,共运行5次。

    ============================================================================================
    第四步:
    生出5倍交叉验证测试集和训练集(此数据时直接用于分类的)
    1、训练集:
    生成文件夹data,其中有4个文件夹
    文件夹gov (其中有文件government.txt, other.txt分别存放“政府”属性的语料,和“其他”属性的语料,下面的以此类推)
    文件夹fir
    文件夹pol
    文件夹hos

    2、测试集:文件test_3.txt

    3、测试结果存放:
    生成文件夹out,其中有4个文件,存放对文件test_3.txt按照不同属性进行二分类的结果。
    gov.txt
    fir.txt
    pol.txt
    hos.txt

    代码:
    1.pl 和文件夹out同一目录下运行
    功能:生成训练集(见1、训练集)
    输入:文件夹train(子目录下4个文件gov.txt等),文件train_3.txt
    输出:文件夹data
    备注:
    手工修改文件目录(一次交叉验证运行一次代码,改一次输入输出,共运行5次。


    ============================================================================================
    第五步:
    1、根据train_3.txt及其提取的属性,对test_3.txt进行分类;
    2、每个交叉验证进行4次2分类;
    3、每个交叉验证的分类结果存放在其文件目录下的文件夹out中,如(文件夹1\文件夹out)
    文件夹下面有4个文件:
    gov.txt
    fir.txt
    pol.txt
    hos.txt
    每个文件存放的是对test_3.txt进行二分类的结果。

    **********************************
    代码:
    classify.pl 和文件夹out同一目录下运行
    功能:生成训练集(见1、训练集)
    输入:文件夹data(子目录下4个文件夹gov.txt),
    输出:文件夹out(子目录下4个文件gov.txt等)
    备注:
    手工修改文件目录(一次交叉验证运行一次代码,改一次输入输出,共运行5次。

    =============================================================================================
    第六步:
    处理分类结果
    1、根据文件夹out下面的4个文件gov.txt等,得到多分类结果character.txt存放在文件夹1中(交叉验证一级目录)
    2、根据每个交叉验证下的测试语料的真实属性及分类属性,对比结果(文件夹test & 文件夹out, 文件夹character中的charatcertest.txt &文件夹1中的character.txt),
    结果存放在文件夹result中(result中有5个文件)
    gov.txt
    fir.txt
    pol.txt
    hos.txt
    character.txt(character结果是多分类)
    其中每个文件的存放格式(如gov.txt)为:正确分类结果:实际分类结果(代码得到)

    ***************************************
    代码:
    2.pl 和文件夹out同一目录下运行
    功能:生成测试集多分类结果
    输入:文件夹out(子目录下4个文件gov.txt),
    输出:文件character.txt
    备注:
    手工修改文件目录(一次交叉验证运行一次代码,改一次输入输出,共运行5次。

    3.pl 和文件夹out同一目录下运行
    功能:生成测试集多分类结果
    输入:文件夹out(子目录下4个文件gov.txt),文件夹test(子目录下4个文件gov.txt),文件夹character中的charatcertest.txt ,文件夹1中的character.txt
    输出:文件resutl(子目录下5个文件gov.txt)
    备注:
    手工修改文件目录(一次交叉验证运行一次代码,改一次输入输出,共运行5次。

  • 相关阅读:
    jquery ajax你会了吗?
    JS写Cookie
    [活动通知]Nanjing GDG 2013年4月活动
    UITableView刷新数据reLoadData
    FMS4.0 客户端访问服务器脚本文件 main.asc
    关于IOS6屏幕旋转
    Windows平台下Makefile学习笔记(二)
    编译MapWindowGis源码出现的重定义的问题及解决办法
    你的 mixin 兼容 ECMAScript 5 吗?
    有点坑爹的gdal库
  • 原文地址:https://www.cnblogs.com/hemi/p/4019999.html
Copyright © 2020-2023  润新知