项目准备(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次。

原文地址:https://www.cnblogs.com/hemi/p/4019999.html