Morph.pm 3.31 KB
Newer Older
priyank's avatar
priyank committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
package ILMT::HIN::PAN::Morph;
use strict;
use warnings;
use Dir::Self;
use Data::Dumper;
use ILMT::HIN::PAN::Morph::adj_gen;

my %daemons = (
    "morph" => {
        "path" => __DIR__ . "/Morph/morph-socket-server.py",
        "args" => "-d " . __DIR__ . "/Morph/data/dict_final.txt " .
                  "-e " . __DIR__ . "/Morph/data/exception_words.txt " .
                  "-s " . __DIR__ . "/Morph/data/suff_info.dbm.c " .
		  "-f " . __DIR__ . "/Morph/data/features-final.txt " .
                  "-p " . __DIR__ . "/Morph/data/pdgm_offset_info -port " ,
        "port" => "13003"
    },
    "nuqta_adder" => {
        "path" => __DIR__ . "/Morph/nuqta-adder.py",
        "args" => "",
        "port" => "12004"
    }
);

my @dispatch_seq = (
    "remove_sentence_tag",
    "remove_ssf",
    "morph_analyser",
    "nuqta_adder_hin",
    "add_sentence_tag",
    "adjective_generator"
);

sub add_sentence_tag {
    my %par = @_;
    my $data = $par{'data'};
    open INFILE, '<', \$data  or die $!;
    my $result = "<Sentence id=\"1\">\n";
    while (my $line=<INFILE>) {
        $result .= $line;
    }
    $result .= "</Sentence>\n";
    return $result;
}

sub morph_analyser {
    my %args = @_;
    return call_daemon("morph", $args{data});
}

sub nuqta_adder_hin {
    my %args = @_;
    return call_daemon("nuqta_adder", $args{data});
}

sub process {
    my %args = @_;
    foreach my $submodule (@dispatch_seq) {
        $args{'data'} = __PACKAGE__->can($submodule)->(%args);
    }
    return $args{"data"};
}

sub remove_sentence_tag {
    my %par = @_;
    my $data = $par{'data'};
    open INFILE, '<', \$data or die $!;
    my $result = "";
    while(my $line=<INFILE>) {
        if($line=~/^</) {
            next;
        } else {
            $result .= $line;
        }
    }
    return $result;
}

sub remove_ssf {
    my %par = @_;
    my $data = $par{'data'};
    open INFILE, '<', \$data  or die $!;
    my $result = "";
    my $_prev = 1;
    while (my $line=<INFILE>) {
        if ($line=~m/^0\t/) {
            $_prev=2;
            next;
        } elsif ($line=~/^\t\)\)/ and $_prev=~/^\t\)\)/) {
            $_prev="\t))";
            next;
        } else {
            $_prev="$line";
            $result .= "$line";
        }
    }
    return $result;
}

sub run_daemons {
    my @daemon_names = @_;
    foreach my $daemon_name (@daemon_names) {
        my %daemon = %{$daemons{$daemon_name}};
        my $cmd = "$daemon{path} $daemon{args} $daemon{port} &";
        my $runfile = __DIR__ . "/run/${daemon_name}_$daemon{port}";
        system("flock -e -w 0.01 $runfile -c '$cmd'") == 0
            or warn "[" . __PACKAGE__ . "]: Port $daemon{port} maybe unavailable! $?\n";
    }
}

sub call_daemon {
    my ($daemon_name, $input) = @_;
    my $port = $daemons{$daemon_name}{port};
    my ($socket, $client_socket);
    $socket = new IO::Socket::INET (
        PeerHost => '127.0.0.1',
        PeerPort => $port,
        Proto => 'tcp',
    ) or die "ERROR in Socket Creation : $!\n";
    $socket->send("$input\n");
    my $result = "";
    while (my $line = $socket->getline) {
        $result .= $line;
    }
    $socket->close();
    return $result;
}

sub adjective_generator {
    my %par = @_;
    my $data = $par{'data'};
    my $result = "";
    adj_gen(\$data, \$result);
    return ($result);
}

run_daemons(("morph", "nuqta_adder"));

1;