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次。