#!/usr/local/bin/perl5 $binDir = "/afs/cs.cmu.edu/project/cmt-8/enthusiast/mlb/CMU-Cam_Toolkit_v2/bin"; $homeDir = "/afs/cs.cmu.edu/project/cmt-8/enthusiast/mlb/2"; $WORD = 1; $ACT = 2; $UNION = 3; $n = 3; $THRESH = 0.1; sub loadActInventory { %speech_acts; my $inventory = "/afs/cs.cmu.edu/project/cmt-8/enthusiast/mlb/acts.txt"; open(INV, "<$inventory") or die "Unable to open $inventory for input\n"; while() { chomp; $speech_acts{$_} = 1; } close(INV); } sub loadMI { %MI; my $data = "$homeDir/MODELS/mi.data"; open(MI, "<$data") or die "Unable to open $data for input\n"; my $word; while() { if(/.W/) { $word = ; chomp($word); } else { split(/ /, $_); my $act = $_[0]; my $mi = $_[1]; chomp($mi); $MI{$word}{$act} = $mi; } } close(MI); } sub getPrediction { %totalMI; my $utt = $_[0]; my @words = split(/\s+/, $utt); for $act (keys %speech_acts) { my $totalMI = 0; for $word (@words) { my $mi = $MI{$word}{$act}; $totalMI += $mi; } if ($totalMI >= $THRESH) { $total{$act} = $totalMI; } } my $maxAct = &getArgMax; $maxAct; } sub getArgMax { my @keys = sort { $total{$b} <=> $total{$a}} keys %total; my $top = $keys[0]; $top; } sub getMaxProb { my @keys = sort { $total{$b} <=> $total{$a}} keys %total; my $top = $keys[0]; my $max = $total{$top}; $max; } sub printTopN { my @keys = sort { $total{$b} <=> $total{$a}} keys %total; for $i (0..$n-1) { my $key = $keys[$i]; my $val = $total{$key}; print OUT "$key "; } print OUT "\n"; } sub Main { @ARGV == 1 or die "Usage: MI.pl "; my $infile = $ARGV[0]; my $outfile = "$infile.mi"; my $soupfile = "$infile.sp"; open(SOUP, "<$soupfile") or die "Cannot open SOUP input for $infile"; open(OUT, ">$outfile") or die "Unable to open file: $outfile for output\n"; &loadActInventory; &loadMI; @sequence = (); my $line; while(!eof(SOUP)) { my $utt = ; my $generated = ; print OUT $utt; chomp($generated); @generated = split(/\s+/, $generated); my $Sn; # no ambiguity if(@generated == 1) { $Sn = $generated[0]; print OUT "$Sn\n$Sn\n\n"; } # get prediction from ngram component using previous two @seq else { # MI prediction $Sn = &getPrediction($utt); &printTopN; my $max = &getMaxProb; print OUT "$Sn $max\n\n"; undef %total; } push(@sequence, $Sn); ; #eat newline } close(SOUP); } Main;