Advertisement
machalda

PERL homework #1

Jun 9th, 2012
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 11.19 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use locale;
  3. use utf8;
  4. use encoding 'utf8';
  5.  
  6. ####################### config variables
  7. $operation;
  8. $input;
  9. $output;
  10. $minCharCount;
  11. $minFrequency;
  12. ####################### procedures and functions
  13. sub readConfig
  14. {
  15.         my $source = shift(@_);
  16.         if(open(SOURCE,$source))
  17.         {
  18.                 while ($row = <SOURCE>)
  19.                 {
  20.                 chomp($row);
  21.                 push(@arrayRow,$row);
  22.                 }
  23.         $operation              = uc($arrayRow[0]);
  24.         $input                  = $arrayRow[1];
  25.         $output                 = $arrayRow[2];
  26.         $minCharCount           = $arrayRow[3];
  27.         $minFrequency           = $arrayRow[4];
  28.         }
  29.         else
  30.         {
  31.                 print "FATAL ERROR: unable to read configuration\n";
  32.                 exit();
  33.         }
  34.         if($operation ne "TP")
  35.         {
  36.          if($operation ne "TF")
  37.          {
  38.           if($operation ne "TF_IDF")
  39.            {
  40.                 print "FATAL ERROR: unknown operation!\n";
  41.                 print "HINT: use tp, tf or tf_idf only.\n";
  42.                 exit();
  43.         }}}
  44. }
  45.  
  46. sub writeConfig()
  47. {
  48.         print "##       Configuration file: $ARGV[0]    ##\n";
  49.         print "Operation:                       $operation\n";
  50.         print "Input file:                      $input\n";
  51.         print "Output file:                     $output\n";
  52.         print "Minimal char count:              $minCharCount\n";
  53.         print "Minimal Frequency:               $minFrequency\n";
  54.         print "###########################################\n";
  55. }
  56.  
  57. sub getWords
  58. {
  59.                 open(DATA, $input);#otevre soubor zadany argumentem
  60.                 @radky=<DATA>; #rozdeleno po radcich
  61.         $pocetSouboru=0; #pocitadlo
  62.         for $lala (@radky)              #pro kazde slovo na predhozenem radku
  63.         {
  64.                 $lala =~s/^.+\t//;              #odstraneni tridy
  65.                 $lala =~s/\n//; #odstraneni konce radku
  66.                 $lala =~s/<(.*)>//; #odstraneni tagu
  67.                 push(@slova,  split(/\s+/, $lala)); #pridani do vektoru slov
  68.                 $pocetSouboru++; #pocet souboru +1
  69.         }
  70.         $pocetSouboru--;#odecteni posledniho prazdneho radku
  71.         $counter=0;
  72.         for $lala (@slova) #prazdnych slov
  73.         {
  74.                 $lala=lc($lala);#lower case
  75.                 $lala =~s/\s//; #prazdne znaky
  76.                 $lala =~s/[^a-zA-Z]//;#jiny znaky nez pismena
  77.                 if($lala eq "")
  78.                 {
  79.                         splice(@slova, $counter, 1);#odstraneni prazdnych veci
  80.                 };
  81.                 $counter++;
  82.         }
  83.         $counter=0;
  84.  
  85.         if($minFrequency > 1) #ma smysl jen pokud minimalni vyskyt je vetsi nez 1
  86.         {
  87.         #print "-> minFrequency greater than 1\n";
  88.                 for($counter=0;$counter<=$#slova;$counter++)    #minimalni vyskyt
  89.                 {
  90.                         $i=0;
  91.                         #print"-> testuji slovo: ( $slova[$i] ) |>  $slova[$counter]\n";
  92.                         $frequency=0; #nulovy vyskyt
  93.                         for($i=0;$i<=$#slova;$i++)
  94.                         {
  95.                                 #print" $slova[$counter] -> $slova[$i] \n";
  96.                                 if($slova[$i] eq $slova[$counter])
  97.                                 {
  98.                                         $frequency++;
  99.                                         #print"Stejna slova! F: $frequency\n";
  100.                                 }
  101.                         }
  102.                         if($frequency < $minFrequency)
  103.                         {
  104.                                 #print "odstranuji slovo: $slova[$counter]\n";
  105.                                 splice(@slova, $counter, 1);
  106.  
  107.                         }
  108.                 #print"####################\n\n";
  109.                 }
  110.         }
  111.         $counter=0;
  112.         for $lala (@slova)#odstraneni duplicit
  113.         {
  114.                 for($i=0;$i<$counter;$i++)
  115.                 {
  116.                         if($slova[$i] eq $slova[$counter])
  117.                         {
  118.                                 splice(@slova, $i, 1);
  119.                                 $i=0;#nutny reset
  120.                         }
  121.                 }
  122.                 $counter++;
  123.         }
  124.         $counter = 0;
  125.         for $lala(@slova)#ostrani slova kratsi nez pozadovane
  126.         {
  127.                 if(length($lala) <= $minCharCount)
  128.                 {
  129.                         #print "nalezeno slovo: $lala\n";
  130.                         #print length($lala);
  131.                         #print "\n";
  132.                         splice(@slova, $counter, 1);
  133.                 }
  134.                 $counter++;
  135.         }
  136. return @slova;  #vraci vektor cistych slov
  137. }
  138.  
  139. sub writeWords
  140. {
  141.         print "\n##     Vectore of clear word   ##\n";
  142.         for $lala (@words)
  143.         {
  144.                 $lala=uc($lala);
  145.                 $lala =~s/\s//;
  146.                 print  $lala;
  147.                 print " ";
  148.         }
  149.         print "\n##     End of vector   ##\n\n";
  150. }
  151.  
  152. sub TP
  153. {
  154.         open(DATA, $input); #otevre soubor zadany argumentem
  155.         @radky=<DATA>; #rozdeleno po radcich
  156.  
  157.         for $lala (@slova)
  158.         {
  159.                 $lala=uc($lala);
  160.                 $lala =~s/\s//;
  161.                 print  $lala;
  162.                 print "   ";
  163.         }
  164.         print "_CLASS_\n";
  165.  
  166.         for $radek (@radky)
  167.         {
  168.                 $class = $radek;
  169.                 $radek =~s/\n//;
  170.                 $class =~s/\t.*\n//;
  171.                 $radek =~s/^.*\t//;
  172.                 $radek=uc($radek);
  173.                 for $word (@words)
  174.                 {
  175.                         $word=uc($word);
  176.                         if(index(" ".$radek." "," ".$word." ") != -1)
  177.                         {
  178.                                 print "1";
  179.                                 for($i=0;$i<(length($word)+2);$i++)
  180.                                 {
  181.                                         print " ";
  182.                                 }
  183.  
  184.  
  185.                         }
  186.                         else
  187.                         {
  188.                                 print "0";
  189.                                 for($i=0;$i<(length($word)+2);$i++)
  190.                                 {
  191.                                         print " ";
  192.                                 }
  193.                         }
  194.                 }
  195.                 print "$class\n";
  196.         }
  197. }
  198.  
  199.  
  200. sub TF
  201. {
  202.         open(DATA, $input); #otevre soubor zadany argumentem
  203.         @radky=<DATA>; #rozdeleno po radcich
  204.  
  205.         for $lala (@slova)
  206.         {
  207.                 $lala=uc($lala);
  208.                 $lala =~s/\s//;
  209.                 print  $lala;
  210.                 print "   ";
  211.         }
  212.         print "_CLASS_\n";
  213.         for $radek (@radky)
  214.         {
  215.                 $class = $radek;
  216.                 $radek =~s/\n//;
  217.                 $class =~s/\t.*\n//;
  218.                 $radek =~s/^.*\t//;
  219.                 $radek=uc($radek);
  220.                 @wordsOnRow = split(' ',$radek);
  221.  
  222.                 for $word (@words)
  223.                 {
  224.                         $word=uc($word);
  225.                         $sum=0;
  226.                         for $wordOnRow (@wordsOnRow)
  227.                         {
  228.                                 if($wordOnRow eq $word)
  229.                                 {
  230.                                         $sum++;
  231.                                 }
  232.                         }
  233.                         print "$sum";
  234.                         for($i=0;$i<(length($word)+2);$i++)
  235.                         {
  236.                                 print " ";
  237.                         }
  238.  
  239.                 }
  240.                 print "$class\n";
  241.         }
  242. }
  243.  
  244.  
  245. sub TF_IDF
  246. {
  247.         open(DATA, $input); #otevre soubor zadany argumentem
  248.         @radky=<DATA>; #rozdeleno po radcich
  249.  
  250.         $docCount = @radky;     # N -> log(N) -> pocet dokumentu
  251.         $docIncCount = 0;       # n(t_i) -> pocet dokumentu obsahujici vyraz
  252.         $countInDoc = 0;        # n_ij -> pocet vyskytu v dokumentu
  253.         $sumInDoc = 0;          # suma n_ij -> pocet termu v danem dokumentu
  254.  
  255.                 ##      TF-IDF = TF * IDF =  n_ij / suma n_ij  *  log N / n(t_i)
  256.  
  257.         for $lala (@slova)
  258.         {
  259.                 $lala=uc($lala);
  260.                 $lala =~s/\s//;
  261.                 print  $lala;
  262.                 print "      ";
  263.         }
  264.         print "_CLASS_\n";
  265.  
  266.         @pomRows = @radky;
  267.         for $radek (@radky)
  268.         {
  269.                 $class = $radek;
  270.                 $radek =~s/\n//;
  271.                 $class =~s/\t.*\n//;
  272.                 $radek =~s/^.*\t//;
  273.                 $radek=uc($radek);
  274.                 @wordsOnRow = split(' ',$radek);
  275.  
  276.                 for $word (@words)
  277.                 {
  278.                         $word=uc($word);
  279.                         $countInDoc=0; #pocet vyhovujicich
  280.                         $sumInDoc=0;   #celkovy pocet
  281.                         $docInCount=0;
  282.                         for $wordOnRow (@wordsOnRow)
  283.                         {
  284.                                 for $row (@pomRows)
  285.                                 {
  286.                                         $row =~s/\n//;
  287.                                         $row =~s/^.*\t//;
  288.                                         $row=uc($row);
  289.                                         @wordsOnPomRow = split(' ',$row);
  290.                                         for $wordOnPomRow (@wordsOnPomRow)
  291.                                         {
  292.                                                 if($wordOnPomRow eq $word)
  293.                                                 {
  294.                                                         $docInCount++;
  295.                                                         last;
  296.                                                 }
  297.                                         }
  298.                                         }
  299.  
  300.                                 if($wordOnRow eq $word)
  301.                                 {
  302.                                         $countInDoc++;
  303.                                 }
  304.                                 $sumInDoc++;
  305.                         }
  306.                         # TF-IDF = TF * IDF =  n_ij / suma n_ij  *  log N / n(t_i)
  307.                         $TF = $countInDoc / $sumInDoc;
  308.                         if($countInDoc <= 0)
  309.                         {
  310.                                 $result=0;
  311.                         }
  312.                         else
  313.                         {
  314.                                 $IDF = log($docCount)/$countInDoc;
  315.                                 $result = $TF*$IDF;
  316.                         }
  317.                         if($result == 0) {print "$result   ";}
  318.                         else {  printf("%.2f", $result);}
  319.                         for($i=0;$i<(length($word)+2);$i++)
  320.                         {
  321.                                 print " ";
  322.                         }
  323.  
  324.                 }
  325.                 print "$class\n";
  326.         }
  327. }
  328.  
  329.  
  330. ####################### main program
  331. readConfig($ARGV[0]);
  332. writeConfig();
  333. @words = getWords();
  334. writeWords();
  335. if($operation eq "TP")
  336. {
  337.         TP();
  338. }
  339. elsif($operation eq "TF")
  340. {
  341.         TF();
  342. }
  343. elsif($operation eq "TF_IDF")
  344. {
  345.         TF_IDF();
  346. }
  347. else
  348. {
  349.         print"FATAL ERROR: unknown operation\n";
  350. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement