package WordNet::Similarity::Visual;
=head1 NAME
WordNet::Similarity::Visual - Perl extension for providing visualization tools
for WordNet::Similarity
=head1 SYNOPSIS
=head2 Basic Usage Example
use WordNet::Similarity::Visual;
$gui = WordNet::Similarity::Visual->new;
$gui->initialize;
=head1 DESCRIPTION
This package provides a graphical extension for WordNet::Similarity.
It provides a gui for WordNet::Similarity and visualization tools for
the various edge counting measures like path, wup, lch and hso.
=head2 Methods
The following methods are defined in this package:
=head3 Public methods
=over
=cut
use 5.008004;
use WordNet::Similarity::Visual::QueryDataInterface;
use WordNet::Similarity::Visual::GUI_Window;
use WordNet::Similarity::Visual::SimilarityInterface;
use Gtk2 '-init';
use strict;
use warnings;
use constant TRUE => 1;
use constant FALSE => 0;
my $main_window;
my $querydata_vbox;
my $similarity_vbox;
my $similarity_interface;
my $querydata_interface;
my $trace_result_box;
my $values_result_box;
my $querydata_result_box;
my $progbar;
my $initial_flag;
my $start_window;
my $tooltip;
my $toolflag;
my $tooltip_label;
my $vpaned;
my $main_statusbar;
my $canvas;
our $VERSION = '0.07';
=item $obj->new
The constructor for WordNet::Similarity::Visual objects.
Return value: the new blessed object
=cut
sub new
{
my ($class) = @_;
my $self = {};
bless $self, $class;
}
=item $obj->initialize
To initialize the Graphical User Interface and pass the control to it.
=cut
sub initialize
{
my ($self)=@_;
$self->configure;
$self->{ initial_flag }=0;
#################################################################################
$self->{ tooltip_label } = Gtk2::Label->new;
$self->{ tooltip } = Gtk2::Window->new('popup');
$self->{ tooltip }->set_decorated(FALSE);
$self->{ tooltip }->set_destroy_with_parent(TRUE);
$self->{ tooltip }->set_position('mouse');
$self->{ tooltip }->modify_bg ('normal', Gtk2::Gdk::Color->parse('yellow'));
$self->{ tooltip }->add($self->{ tooltip_label });
$self->{ toolflag }=0;
#################################################################################
$self->{ querydata_interface } = WordNet::Similarity::Visual::QueryDataInterface->new;
$self->{ similarity_interface } = WordNet::Similarity::Visual::SimilarityInterface->new;
$self->{ start_window }= Gtk2::Window->new("toplevel");
$self->{ start_window }->set_resizable(FALSE);
$self->{ start_window }->set_position("GTK_WIN_POS_CENTER");
$self->{ start_window }->set_skip_taskbar_hint(TRUE);
$self->{ start_window }->set_destroy_with_parent(TRUE);
$self->{ start_window }->set_size_request(300,300);
$self->{ start_window }->set_decorated(FALSE);
$self->{ start_window }->stick;
my $start_vbox = Gtk2::VBox->new;
$self->{ progbar } = Gtk2::ProgressBar->new;
$self->{ progbar }->set_text("Initializing WordNet::Similarity....");
$self->{ progbar }->set_fraction(0);
$self->{ progbar }->set_pulse_step(0.05);
my $start_canvas = Gnome2::Canvas->new;
$start_canvas->set_size_request(300,250);
$start_vbox->add($start_canvas);
$start_vbox->add($self->{ progbar });
$self->{ start_window }->add($start_vbox);
my $timer = Glib::Timeout->add(100,\&update_progressbar,$self);
$self->{ start_window }->signal_connect(destroy=> sub {
my($self)=@_;
Gtk2->main_quit;
});
$self->{ start_window }->show_all;
Gtk2->main;
###########################################################################################
$self->{ main_window } = WordNet::Similarity::Visual::GUI_Window->new;
$self->{ main_window }->initialize("WordNet::Similarity GUI",0, 800,600);
$self->{ main_statusbar } = Gtk2::Statusbar->new;
my $main_menu = Gtk2::MenuBar->new();
$self->{ main_window }->pack_start($main_menu,FALSE, FALSE, 0);
my $tabbedwindow = Gtk2::Notebook->new;
$tabbedwindow->set_show_border(0);
my $querydata_scrollwindow = Gtk2::ScrolledWindow->new;
my $similarity_scrollwindow = Gtk2::ScrolledWindow->new;
###########################################################################################
$self->{ similarity_vbox } = Gtk2::VBox->new(FALSE, 6);
$self->{ similarity_vbox }->set_border_width(6);
my $similarity_entry_align = Gtk2::Alignment->new(0.0,0.0,0.3,0.0);
my $similarity_entry_hbox = Gtk2::HBox->new(FALSE,6);
my $word1_similarity_entry = Gtk2::Entry->new;
my $word2_similarity_entry = Gtk2::Entry->new;
my $measure_touse = Gtk2::ComboBox->new_text;
$measure_touse->append_text("All Measures");
$measure_touse->append_text("Hist & St-Onge");
$measure_touse->append_text("Leacock & Chodorow");
$measure_touse->append_text("Adapted Lesk");
$measure_touse->append_text("Lin");
$measure_touse->append_text("Jiang & Conrath");
$measure_touse->append_text("Path length");
$measure_touse->append_text("Random numbers");
$measure_touse->append_text("Resnik");
$measure_touse->append_text("Context vector");
$measure_touse->append_text("Wu & Palmer");
$measure_touse->set_active(0);
my $compute_button = Gtk2::Button->new('_Compute');
my $stop_button = Gtk2::Button->new('_Stop');
# my $save_button = Gtk2::Button->new('_Save');
$similarity_entry_hbox->pack_start($word1_similarity_entry, TRUE, TRUE, 0);
$similarity_entry_hbox->pack_start($word2_similarity_entry, TRUE, TRUE, 0);
$similarity_entry_hbox->pack_start($measure_touse, TRUE, TRUE, 0);
$similarity_entry_hbox->pack_start($compute_button,FALSE, FALSE, 0);
$compute_button->signal_connect(clicked=>sub {
my ($self, $gui)=@_;
$gui->{ similarity_interface }->{ STOPPED }=0;
$gui->set_statusmessage("Similarity", "Computing the Similarity Scores");
my $word1 = $word1_similarity_entry->get_text();
my $word2 = $word2_similarity_entry->get_text();
my $measure = $measure_touse->get_active();
my ($result,$errors,$traces)=$gui->{ similarity_interface }->compute_similarity($word1, $word2,$measure);
$gui->display_similarity_results($result,$errors,$traces,$measure);
}, $self);
$stop_button->signal_connect(clicked=>sub {
my ($self,$gui)=@_;
$gui->{ similarity_interface }->{ STOPPED }=1;
}, $self);
$similarity_entry_hbox->pack_start($stop_button,FALSE, FALSE, 0);
# ############################################################################################
# # ##Change
# $save_button->signal_connect(clicked=>sub {
# my ($self,$gui)=@_;
# my $file_selector = Gtk2::FileSelection->new("Save File as...");
# $file_selector->set_select_multiple(FALSE);
# $file_selector->ok_button->set_label("Save");
# my @data = ($file_selector, $gui);
# $file_selector->ok_button->signal_connect(clicked=>sub {
# my ($self,$data)=@_;
# my $file_selector = $data->[0];
# my $gui = $data->[1];
# my $file_name=$file_selector->get_filename();
# print $file_name;
# $gui->save_file($file_name);
# $file_selector->destroy;
# },\@data);
# $file_selector->ok_button->signal_connect(clicked=>sub {
# my ($self,$file_selector)=@_;
# $file_selector->destroy;
# },$file_selector);
#
# $file_selector->show_all;
# }, $self);
# ###########################################################################################
# $similarity_entry_hbox->pack_start($save_button,FALSE, FALSE, 0);
$similarity_entry_align->add($similarity_entry_hbox);
$self->{ similarity_vbox }->pack_start($similarity_entry_align, FALSE, FALSE, 0);
my $hseparator = Gtk2::HSeparator->new;
$self->{ similarity_vbox }->pack_start($hseparator, FALSE, FALSE, 0);
$self->{ trace_result_box }=Gtk2::VBox->new(FALSE,4);
$self->{ values_result_box }=Gtk2::VBox->new(FALSE,4);
my $hpaned = Gtk2::HPaned->new;
$self->{ vpaned } = Gtk2::VPaned->new;
my $trace_scrollwindow = Gtk2::ScrolledWindow->new;
$trace_scrollwindow->add_with_viewport($self->{ trace_result_box });
$trace_scrollwindow->set_policy("GTK_POLICY_AUTOMATIC", "GTK_POLICY_AUTOMATIC");
my $values_scrollwindow = Gtk2::ScrolledWindow->new;
$values_scrollwindow->add_with_viewport($self->{ values_result_box });
$values_scrollwindow->set_policy("GTK_POLICY_AUTOMATIC", "GTK_POLICY_AUTOMATIC");
$hpaned->add1($values_scrollwindow);
$self->{ vpaned }->add1($trace_scrollwindow);
$hpaned->add2($self->{ vpaned });
$hpaned->set_position(320);
$self->{ similarity_vbox }->pack_start($hpaned, TRUE, TRUE, 0);
#####################################################################################################################333
$self->{ querydata_vbox }= Gtk2::VBox->new(FALSE, 6);
$self->{ querydata_vbox }->set_border_width(6);
my $querydata_entry_align = Gtk2::Alignment->new(0.0,0.0,0.3,0.0);
my $querydata_entry_hbox = Gtk2::HBox->new(FALSE,6);
# my $back_button = Gtk2::Button->new('<< _Back');
# my $forward_button = Gtk2::Button->new('_Forward >>');
my $searchword_entry = Gtk2::Entry->new;
my $querydata_search_button = Gtk2::Button->new('_Search');
my $print_button = Gtk2::Button->new('_Print');
# $querydata_entry_hbox->pack_start($back_button,FALSE, FALSE, 0);
# $querydata_entry_hbox->pack_start($forward_button,FALSE, FALSE, 0);
$querydata_entry_hbox->pack_start($searchword_entry, TRUE, TRUE, 0);
$querydata_entry_hbox->pack_start($querydata_search_button,FALSE, FALSE, 0);
$querydata_entry_hbox->pack_start($print_button,FALSE, FALSE, 0);
$querydata_search_button->signal_connect(clicked=>sub {
my ($self, $gui)=@_;
$gui->set_statusmessage("QueryData", "Crawling Through WordNet for Senses!");
my $word = $searchword_entry->get_text();
my $result_wps = $gui->{ querydata_interface }->search_senses($word);
$gui->display_querydata_results($result_wps);
}, $self);
$querydata_entry_align->add($querydata_entry_hbox);
$self->{ querydata_vbox }->pack_start($querydata_entry_align, FALSE, FALSE, 0);
my $querydata_hseparator = Gtk2::HSeparator->new;
$self->{ querydata_vbox }->pack_start($querydata_hseparator, FALSE, FALSE, 0);
$self->{ querydata_result_box }=Gtk2::VBox->new(FALSE,4);
$self->{ querydata_vbox }->pack_start($self->{ querydata_result_box }, TRUE, TRUE, 0);
###########################################################################################
$similarity_scrollwindow->add_with_viewport($self->{ similarity_vbox });
$similarity_scrollwindow->set_policy("GTK_POLICY_NEVER", "GTK_POLICY_AUTOMATIC");
$querydata_scrollwindow->add_with_viewport($self->{ querydata_vbox });
$querydata_scrollwindow->set_policy("GTK_POLICY_NEVER", "GTK_POLICY_AUTOMATIC");
$tabbedwindow->append_page($querydata_scrollwindow, "WordNet::QueryData");
$tabbedwindow->append_page($similarity_scrollwindow, "WordNet::Similarity");
$self->{ main_window }->pack_start($tabbedwindow,TRUE, TRUE,0);
$self->{ main_window }->pack_end($self->{ main_statusbar },FALSE, FALSE, 0);
$self->{ main_window }->display;
###############################################################################################3
}
sub update_progressbar
{
my ($gui)=@_;
if($gui->{ initial_flag }<2)
{
if($gui->{ initial_flag }==0)
{
while (Gtk2->events_pending)
{
Gtk2->main_iteration;
}
$gui->{ querydata_interface }->initialize;
$gui->{ progbar }->set_fraction($gui->{ progbar }->get_fraction+0.1);
while (Gtk2->events_pending)
{
Gtk2->main_iteration;
}
$gui->{ similarity_interface }->initialize;
$gui->{ initial_flag }=1;
}
if($gui->{ progbar }->get_fraction >= 1)
{
$gui->{ start_window }->destroy;
$gui->{ initial_flag }=2;
return TRUE;
}
else
{
$gui->{ progbar }->set_fraction($gui->{ progbar }->get_fraction+0.1);
$gui->{ start_window }->show_all;
}
}
return TRUE;
}
sub display_querydata_results
{
my ($self, $result)=@_;
my $wps;
my %labels;
my %hbox;
my %txtview;
my %txtbuffer;
my $children;
my @prev_results = $self->{ querydata_result_box }->get_children();
foreach $children (@prev_results)
{
$self->{ querydata_result_box }->remove($children);
}
foreach $wps (sort keys %$result)
{
$labels{$wps}=Gtk2::Label->new($wps);
$hbox{$wps}=Gtk2::HBox->new();
$txtbuffer{$wps}=Gtk2::TextBuffer->new();
$txtbuffer{$wps}->set_text($result->{$wps});
$txtview{$wps}=Gtk2::TextView->new;
$txtview{$wps}->set_editable(FALSE);
$txtview{$wps}->set_cursor_visible(FALSE);
$txtview{$wps}->set_wrap_mode("word");
$txtview{$wps}->set_buffer($txtbuffer{$wps});
$hbox{$wps}->pack_start($labels{$wps},FALSE,FALSE,0);
$hbox{$wps}->pack_start($txtview{$wps},TRUE, TRUE, 0);
$self->{ querydata_result_box}->pack_start($hbox{$wps},FALSE, FALSE, 4);
}
$self->{ querydata_result_box}->show_all;
$self->update_ui;
}
# This function writes the initial configuration files for the various measures.
sub configure
{
if (!chdir($ENV{ HOME } . "/.wordnet-similarity"))
{
mkdir ($ENV{ HOME } . "/.wordnet-similarity");
open CONFIG, "+>".$ENV{ HOME } . "/.wordnet-similarity/config-path.conf";
print CONFIG "WordNet::Similarity::path\ntrace::1\ncache::0\nmaxCacheSize::5000\nrootNode::1";
close CONFIG;
open CONFIG, "+>".$ENV{ HOME } . "/.wordnet-similarity/config-wup.conf";
print CONFIG "WordNet::Similarity::wup\ntrace::1\ncache::0\nmaxCacheSize::5000\nrootNode::1";
close CONFIG;
open CONFIG, "+>".$ENV{ HOME } . "/.wordnet-similarity/config-hso.conf";
print CONFIG "WordNet::Similarity::hso\ntrace::1\ncache::0\nmaxCacheSize::5000";
close CONFIG;
open CONFIG, "+>".$ENV{ HOME } . "/.wordnet-similarity/config-lch.conf";
print CONFIG "WordNet::Similarity::lch\ntrace::1\ncache::0\nmaxCacheSize::5000\nrootNode::1";
close CONFIG;
}
}
sub update_ui
{
my ($self) = @_;
$self->{ main_window }->update_ui();
}
sub set_statusmessage
{
my ($self, $context, $message) = @_;
my $status_context_id = $self->{ main_statusbar }->get_context_id("MainStatusBar");
$self->{ main_statusbar }->push($status_context_id,$message);
$self->{ main_window }->update_ui();
}
sub display_similarity_results
{
my ($self, $values, $errors, $traces, $measure_index) = @_;
my @allmeasures = ("hso","lch","lesk","lin","jcn","path","random","res","vector_pairs","wup");
my $measure;
my $synset1;
my $synset2;
my $button;
my $str;
my $children;
my @prev_results = $self->{ values_result_box }->get_children();
foreach $children (@prev_results)
{
$self->{ values_result_box }->remove($children);
}
if($measure_index!=0)
{
$measure = $allmeasures[$measure_index-1];
foreach $synset1 (keys %$values)
{
foreach $synset2 (keys %{$values->{$synset1}})
{
if($values->{$synset1}{$synset2}!=-1)
{
$str = sprintf("The Relatedness of %s and %s is %.4f",$synset1, $synset2, $values->{$synset1}{$synset2});
$button=Gtk2::Button->new_with_label($str);
$button->signal_connect(clicked=>sub {
my ($self,$gui)=@_;
my $word1;
my $word2;
my @splitlabel;
my $measure;
my $string = $self->get_label();
@splitlabel=split " ",$string;
$measure = $allmeasures[$measure_index-1];
$word1 = $splitlabel[3];
$word2 = $splitlabel[5];
$gui->trace_results($word1,$word2,$measure,$traces);
$gui->update_ui;
}, $self);
$button->set_relief("none");
$self->{ values_result_box }->pack_start($button,FALSE, FALSE, 4);
}
}
}
}
else
{
foreach $synset1 (keys %$values)
{
foreach $synset2 (keys %{$values->{$synset1}})
{
for $measure (keys %{$values->{$synset1}{$synset2}})
{
if($errors->{$synset1}{$synset2}{$measure})
{
}
else
{
$str = sprintf("The Relatedness of %s and %s using %s is %.4f",$synset1, $synset2, $measure, $values->{$synset1}{$synset2}{$measure});
$button=Gtk2::Button->new_with_label($str);
$button->signal_connect(clicked=>sub {
my ($self,$gui)=@_;
my $word1;
my $word2;
my $measure;
my @splitlabel;
my $string = $self->get_label();
@splitlabel=split " ",$string;
$word1 = $splitlabel[3];
$word2 = $splitlabel[5];
$measure = $splitlabel[7];
$gui->trace_results($word1,$word2,$measure,$traces);
$gui->update_ui;
}, $self);
$button->set_relief("none");
$self->{ values_result_box }->pack_start($button,FALSE, FALSE, 4);
}
}
}
}
}
$self->{ values_result_box }->show_all;
$self->update_ui;
}
sub trace_results
{
my ($self, $word1, $word2, $measure, $traces)=@_;
my $meta;
my $children;
my @prev_results = $self->{ trace_result_box }->get_children();
foreach $children (@prev_results)
{
$self->{ trace_result_box }->remove($children);
}
if($measure=~/path/)
{
$meta = $self->{ similarity_interface }->convert_to_meta($word1,$word2,$traces->{$word1}{$word2}{$measure},$measure);
my $canvas = $self->display_tree($meta,450,450);
$self->{ trace_result_box }->pack_start($canvas, TRUE, TRUE, 0);
}
elsif($measure=~/wup/)
{
$meta = $self->{ similarity_interface }->convert_to_meta($word1,$word2,$traces->{$word1}{$word2}{$measure},$measure);
my $canvas = $self->display_tree($meta,450,450);
$self->{ trace_result_box }->pack_start($canvas, TRUE, TRUE, 0);
}
elsif($measure=~/lch/)
{
$meta = $self->{ similarity_interface }->convert_to_meta($word1,$word2,$traces->{$word1}{$word2}{$measure},$measure);
my $canvas = $self->display_tree($meta,450,450);
$self->{ trace_result_box }->pack_start($canvas, TRUE, TRUE, 0);
}
elsif($measure=~/hso/)
{
if($traces->{$word1}{$word2}{$measure}=~/MedStrong\srelation\spath\.\.\./)
{
$meta = $self->{ similarity_interface }->convert_to_meta($word1,$word2,$traces->{$word1}{$word2}{$measure},$measure);
my $canvas = $self->display_tree($meta,450,450);
$self->{ trace_result_box }->pack_start($canvas, TRUE, TRUE, 0);
}
elsif($traces->{$word1}{$word2}{$measure}=~/Strong\sRel\s\(Synset\sMatch\)/)
{
$meta = $self->{ similarity_interface }->convert_to_meta($word1,$word2,$traces->{$word1}{$word2}{$measure},$measure);
my $canvas = $self->display_tree($meta,450,450);
$self->{ trace_result_box }->pack_start($canvas, TRUE, TRUE, 0);
}
else
{
$meta = $traces->{$word1}{$word2}{$measure}."\nNo strong relation path found!!";
my $txtbuffer = Gtk2::TextBuffer->new();
$txtbuffer->set_text($meta);
my $txtview = Gtk2::TextView->new;
$txtview->set_editable(FALSE);
$txtview->set_cursor_visible(FALSE);
$txtview->set_wrap_mode("word");
$txtview->set_buffer($txtbuffer);
$self->{ trace_result_box }->pack_start($txtview, TRUE, TRUE, 0);
}
}
else
{
$meta = $traces->{$word1}{$word2}{$measure};
my $txtbuffer = Gtk2::TextBuffer->new();
$txtbuffer->set_text($meta);
my $txtview = Gtk2::TextView->new;
$txtview->set_editable(FALSE);
$txtview->set_cursor_visible(FALSE);
$txtview->set_wrap_mode("word");
$txtview->set_buffer($txtbuffer);
$self->{ trace_result_box }->pack_start($txtview, TRUE, TRUE, 0);
}
$self->{ trace_result_box }->show_all;
}
sub display_tree
{
my ($self, $string, $width, $height)=@_;
my @trace_strings = split "\n",$string;
my $i;
my @wps;
my $diffx;
my $diffy;
my $x = 0;
my $y = $height;
my $word;
my %wpspos = ();
my $prevx;
my $prevy;
my $maxx=0;
my $maxy=0;
my $minx=0;
my $miny=0;
my $hx;
my $hy;
my @vbox;
my $j;
my $center;
my %text;
my %line;
my $rflag=0;
my $jflag=0;
my $mpflag=0;
my @connectedto;
my $connect;
my @roots;
my @mult_wps1_path;
my @mult_wps2_path;
my $wps1_path;
my $wps2_path;
my $notebook;
my $color;
my $k=0;
my @colorpos;
my @canvas;
my $lcs_x;
my $lcs_y;
my @canvas_root;
my @shortest_path_group;
my @root_group;
my @shortest_path_group_wps1;
my @shortest_path_group_wps2;
if($trace_strings[0]=~/path/)
{
@mult_wps1_path = split /\sOR\s/, $trace_strings[1];
@mult_wps2_path = split /\sOR\s/, $trace_strings[2];
if($#mult_wps1_path+$#mult_wps2_path+1>1)
{
$notebook = Gtk2::Notebook->new;
# $notebook->signal_connect(switch_page=>sub {
# my ($self,$gui) = @_;
# my $child=$self->get_current_page;
# print $child;
# my @children = $self->get_children;
# $gui->{ canvas }= $children[$child];
# },$self);
$mpflag = 1;
}
else
{
$notebook = Gtk2::VBox->new;
}
foreach $wps1_path (@mult_wps1_path)
{
foreach $wps2_path (@mult_wps2_path)
{
$canvas[$k] = Gnome2::Canvas->new;
$canvas_root[$k] = $canvas[$k]->root;
$shortest_path_group[$k] = Gnome2::Canvas::Item->new($canvas_root[$k], "Gnome2::Canvas::Group");
$root_group[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
$shortest_path_group_wps1[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
$shortest_path_group_wps2[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
%text=();
%line=();
$diffy = 40;
$diffx = 0;
$x=0;
$y=0;
$maxx=0;
$maxy=0;
$minx=0;
$miny=0;
@roots = grep /Root\b/, @trace_strings;
if(length($roots[0]) == length($trace_strings[1]) or length($roots[0]) == length($trace_strings[2]))
{
@wps= split /\shypernym\s/, $roots[0];
$word = $wps[$#wps];
$y = $y-$diffy;
if($miny>$y)
{
$miny = $y;
}
if($maxy<$y)
{
$maxy = $y;
}
if($minx>$x)
{
$minx = $x;
}
if($maxx<$x)
{
$maxx = $x;
}
$wpspos{$word}{"x"}=$x;
$wpspos{$word}{"y"}=$y;
$lcs_x=$x;
$lcs_y=$y;
@colorpos = split '#', $word;
if($colorpos[1]=~ 'v')
{
$color = 'red';
}
elsif($colorpos[1]=~ 'n')
{
$color = 'dark green';
}
else
{
$color = 'purple';
}
$text{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Text",
x => $x,
y => $y,
font => 'Sans 10',
anchor => 'GTK_ANCHOR_CENTER',
fill_color => $color,
text => $word);
if($word !~ /Root/)
{
$text{$word}->signal_connect (event => sub {
my ($self,$event,$gui) = @_;
$gui->display_tooltip($self,$event);
},$self);
}
}
else
{
$jflag=0;
@wps= split /\shypernym\s/, $roots[0];
foreach $j (0...$#wps)
{
$word = $wps[$j];
$y = $y-$diffy;
if($miny>$y)
{
$miny = $y;
}
if($maxy<$y)
{
$maxy = $y;
}
if($minx>$x)
{
$minx = $x;
}
if($maxx<$x)
{
$maxx = $x;
}
if($j==0)
{
$lcs_x=$x;
$lcs_y=$y;
}
$wpspos{$word}{"x"}=$x;
$wpspos{$word}{"y"}=$y;
@colorpos = split '#', $word;
if($colorpos[1]=~ 'v')
{
$color = 'red';
}
elsif($colorpos[1]=~ 'n')
{
$color = 'dark green';
}
else
{
$color = 'purple';
}
$text{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Text",
x => $x,
y => $y,
font => 'Sans 10',
anchor => 'GTK_ANCHOR_CENTER',
fill_color => $color,
text => $word);
if($word !~ /Root/)
{
$text{$word}->signal_connect (event => sub {
my ($self,$event,$gui) = @_;
$gui->display_tooltip($self,$event);
},$self);
}
if($j>0)
{
if($roots[0] =~ /$trace_strings[1]/ or $roots[0] =~ /$trace_strings[2]/)
{
$line{$wps[$j-1]}{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy-$diffy/5,$x,$y+$diffy/5],
width_pixels => 1,
last_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'blue',
);
}
else
{
$line{$wps[$j-1]}{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy-$diffy/5,$x,$y+$diffy/5],
width_pixels => 1,
last_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'blue',
line_style => 'on-off-dash'
);
}
}
$prevx = $x;
$prevy = $y;
}
$diffx=0;
}
$x=$lcs_x;
$y=$lcs_y;
$prevx=$lcs_x;
$prevy=$lcs_y;
@wps= split /\shypernym\s/,$wps2_path;
foreach $i (reverse 0...$#wps)
{
$word = $wps[$i];
if(!exists $text{$word})
{
$x = $x+$diffx;
$y = $y+$diffy;
if($miny>$y)
{
$miny = $y;
}
if($maxy<$y)
{
$maxy = $y;
}
if($minx>$x)
{
$minx = $x;
}
if($maxx<$x)
{
$maxx = $x;
}
@colorpos = split '#', $word;
if($colorpos[1]=~ 'v')
{
$color = 'red';
}
elsif($colorpos[1]=~ 'n')
{
$color = 'dark green';
}
else
{
$color = 'purple';
}
$text{$word} = Gnome2::Canvas::Item->new($shortest_path_group_wps2[$k], "Gnome2::Canvas::Text",
x => $x,
y => $y,
fill_color => $color,
font => 'Sans 10',
anchor => 'GTK_ANCHOR_CENTER',
text => $word);
$text{$word}->signal_connect (event => sub {
my ($self,$event,$gui) = @_;
$gui->display_tooltip($self,$event);
},$self);
$wpspos{$word}{"x"}=$x;
$wpspos{$word}{"y"}=$y;
$line{$word}{$wps[$i+1]} = Gnome2::Canvas::Item->new($shortest_path_group_wps2[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy+$diffy/5,$x,$y-$diffy/5],
width_pixels => 1,
first_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'blue'
);
$prevx = $x;
$prevy = $y;
}
else
{
my ($x1,$y1,$x2,$y2)=$text{$word}->get_bounds;
$x = $x1 - 5;
$y = $y2;
$prevx = $x;
$prevy = $y;
$x = $x-60;
$y = $y+10;
next;
}
}
$x=$lcs_x;
$y=$lcs_y;
$prevx=$lcs_x;
$prevy=$lcs_y;
$diffx=0;
@wps= split /\shypernym\s/,$wps1_path;
foreach $i (reverse 0...$#wps)
{
$word = $wps[$i];
if(!exists $text{$word})
{
$x = $x+$diffx;
$y = $y+$diffy;
if($miny>$y)
{
$miny = $y;
}
if($maxy<$y)
{
$maxy = $y;
}
if($minx>$x)
{
$minx = $x;
}
if($maxx<$x)
{
$maxx = $x;
}
@colorpos = split '#', $word;
if($colorpos[1]=~ 'v')
{
$color = 'red';
}
elsif($colorpos[1]=~ 'n')
{
$color = 'dark green';
}
else
{
$color = 'purple';
}
$text{$word} = Gnome2::Canvas::Item->new($shortest_path_group_wps1[$k], "Gnome2::Canvas::Text",
x => $x,
y => $y,
fill_color => $color,
font => 'Sans 10',
anchor => 'GTK_ANCHOR_CENTER',
text => $word);
$text{$word}->signal_connect (event => sub {
my ($self,$event,$gui) = @_;
$gui->display_tooltip($self,$event);
},$self);
$wpspos{$word}{"x"}=$x;
$wpspos{$word}{"y"}=$y;
$line{$word}{$wps[$i+1]} = Gnome2::Canvas::Item->new($shortest_path_group_wps1[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy+$diffy/5,$x,$y-$diffy/5],
width_pixels => 1,
first_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'blue'
);
$prevx = $x;
$prevy = $y;
}
else
{
my ($x1,$y1,$x2,$y2)=$text{$word}->get_bounds;
$x = $x2 + 5;
$y = $y2;
$prevx = $x;
$prevy = $y;
$x = $x+60;
$y = $y+10;
next;
}
}
$hx = abs($maxx-$minx)+100;
$hy = abs($maxy-$miny)+80;
$canvas[$k]->set_size_request($hx,$hy);
$canvas[$k]->set_scroll_region (0, 0, $hx, $hy);
$shortest_path_group[$k]->set(x=>abs($minx)+60);
$shortest_path_group[$k]->set(y=>abs($miny)+10);
$minx = $k+1;
if($mpflag)
{
$notebook->append_page($canvas[$k], "Path ".$minx);
}
else
{
$notebook->add($canvas[0]);
}
$k++;
}
}
$self->{ canvas } = $canvas[0];
}
elsif($trace_strings[0]=~/wup/)
{
my @temp = split /\s=\s/, $trace_strings[$#trace_strings-2];
my $word1 = $temp[0];
my $word_lcs_flag;
@temp = split /\s=\s/, $trace_strings[$#trace_strings];
my $lcs = $temp[0];
@temp = split /\s=\s/, $trace_strings[$#trace_strings-1];
my $word2 = $temp[0];
my $sub;
my @trees = grep /\shypernym\s/, @trace_strings;
my @syns1;
my @syns2;
my $syn;
my @mult_wps1_path;
@syns1 = $self->{ querydata_interface }->find_allsyns($word1);
my $syns_group = join " ",@syns1;
foreach $syn (@syns1)
{
push @mult_wps1_path, grep(/\b$syn\b/, @trees);
}
my @mult_wps2_path;
@syns2 = $self->{ querydata_interface }->find_allsyns($word2);
foreach $syn (@syns2)
{
push @mult_wps2_path, grep(/\b$syn\b/, @trees);
}
if($#mult_wps1_path+$#mult_wps2_path+1>1)
{
$notebook = Gtk2::Notebook->new;
# $notebook->signal_connect(switch_page=>sub {
# my ($self,$gui) = @_;
# my $child=$self->get_current_page;
# my @children = $self->get_children;
# $gui->{ canvas }= $children[$child];
# },$self);
$mpflag = 1;
}
else
{
$notebook = Gtk2::VBox->new;
}
my $lcsflag=0;
$syn = join " ",@syns1;
if($syn =~ /\b$word2\b/)
{
foreach $wps1_path (@mult_wps1_path)
{
$lcsflag=0;
$x=0;
$y=0;
$maxx=0;
$maxy=0;
$minx=0;
$miny=0;
$canvas[$k] = Gnome2::Canvas->new;
$canvas_root[$k] = $canvas[$k]->root;
$shortest_path_group[$k] = Gnome2::Canvas::Item->new($canvas_root[$k], "Gnome2::Canvas::Group");
$root_group[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
$shortest_path_group_wps1[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
$shortest_path_group_wps2[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
%text=();
%line=();
$diffy = 40;
$diffx = 0;
$jflag=0;
@wps= split /\shypernym\s/, $wps1_path;
foreach $j (0...$#wps)
{
$word = $wps[$j];
$y = $y-$diffy;
if($miny>$y)
{
$miny = $y;
}
if($maxy<$y)
{
$maxy = $y;
}
if($minx>$x)
{
$minx = $x;
}
if($maxx<$x)
{
$maxx = $x;
}
$wpspos{$word}{"x"}=$x;
$wpspos{$word}{"y"}=$y;
@colorpos = split '#', $word;
if($colorpos[1]=~ 'v')
{
$color = 'red';
}
elsif($colorpos[1]=~ 'n')
{
$color = 'dark green';
}
else
{
$color = 'purple';
}
$text{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Text",
x => $x,
y => $y,
fill_color => $color,
font => 'Sans 10',
anchor => 'GTK_ANCHOR_CENTER',
text => $word);
if($word !~ /Root/)
{
$text{$word}->signal_connect (event => sub {
my ($self,$event,$gui) = @_;
$gui->display_tooltip($self,$event);
},$self);
}
if($j>0)
{
$sub=0;
$line{$wps[$j-1]}{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy-$diffy/5,$x+$sub,$y+$diffy/5],
width_pixels => 1,
last_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'blue'
);
}
$prevx = $x;
$prevy = $y;
}
$hx = abs($maxx-$minx)+100;
$hy = abs($maxy-$miny)+80;
$canvas[$k]->set_size_request($hx,$hy);
$canvas[$k]->set_scroll_region (0, 0, $hx, $hy);
$shortest_path_group[$k]->set(x=>abs($minx)+60);
$shortest_path_group[$k]->set(y=>abs($miny)+10);
$minx = $k+1;
if($mpflag)
{
$notebook->append_page($canvas[$k], "Path ".$minx);
}
else
{
$notebook->add($canvas[0]);
}
$k++;
}
}
else
{
foreach $wps1_path (@mult_wps1_path)
{
foreach $wps2_path (@mult_wps2_path)
{
if($wps1_path !~ /wps2_path/ and length($wps1_path)>1 and length($wps2_path)>1)
{
$lcsflag=0;
$x=0;
$y=0;
$maxx=0;
$maxy=0;
$minx=0;
$miny=0;
$canvas[$k] = Gnome2::Canvas->new;
$canvas_root[$k] = $canvas[$k]->root;
$shortest_path_group[$k] = Gnome2::Canvas::Item->new($canvas_root[$k], "Gnome2::Canvas::Group");
$root_group[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
$shortest_path_group_wps1[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
$shortest_path_group_wps2[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
%text=();
%line=();
$diffy = 40;
$diffx = 0;
$jflag=0;
@wps= split /\shypernym\s/, $wps1_path;
foreach $j (0...$#wps)
{
$word = $wps[$j];
if($wps2_path=~/$word/)
{
if($lcsflag==0)
{
$lcs = $word;
$x=$x-length($word)*9;
$lcs_x=$x;
$lcs_y=$y-$diffy;
}
}
$y = $y-$diffy;
if($miny>$y)
{
$miny = $y;
}
if($maxy<$y)
{
$maxy = $y;
}
if($minx>$x)
{
$minx = $x;
}
if($maxx<$x)
{
$maxx = $x;
}
$wpspos{$word}{"x"}=$x;
$wpspos{$word}{"y"}=$y;
@colorpos = split '#', $word;
if($colorpos[1]=~ 'v')
{
$color = 'red';
}
elsif($colorpos[1]=~ 'n')
{
$color = 'dark green';
}
else
{
$color = 'purple';
}
$text{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Text",
x => $x,
y => $y,
fill_color => $color,
font => 'Sans 10',
anchor => 'GTK_ANCHOR_CENTER',
text => $word);
if($word !~ /Root/)
{
$text{$word}->signal_connect (event => sub {
my ($self,$event,$gui) = @_;
$gui->display_tooltip($self,$event);
},$self);
}
if($j>0)
{
$sub=0;
if($wps2_path=~/$word/)
{
if($lcsflag==0)
{
$sub=length($word)*3;
$lcsflag=1;
}
}
$line{$wps[$j-1]}{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy-$diffy/5,$x+$sub,$y+$diffy/5],
width_pixels => 1,
last_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'blue'
);
}
$prevx = $x;
$prevy = $y;
}
$diffx=0;
@wps= split /\shypernym\s/,$wps2_path;
$word_lcs_flag=0;
$x=$lcs_x;
$y=$lcs_y;
$prevx = $x-length($lcs)*3;
$prevy = $y;
foreach $i (reverse 0...$#wps)
{
$word = $wps[$i];
if($word_lcs_flag==1)
{
if(!exists $text{$word})
{
$x = $x+$diffx;
$y = $y+$diffy;
if($miny>$y)
{
$miny = $y;
}
if($maxy<$y)
{
$maxy = $y;
}
if($minx>$x)
{
$minx = $x;
}
if($maxx<$x)
{
$maxx = $x;
}
@colorpos = split '#', $word;
if($colorpos[1]=~ 'v')
{
$color = 'red';
}
elsif($colorpos[1]=~ 'n')
{
$color = 'dark green';
}
else
{
$color = 'purple';
}
$text{$word} = Gnome2::Canvas::Item->new($shortest_path_group_wps2[$k], "Gnome2::Canvas::Text",
x => $x,
y => $y,
fill_color => $color,
font => 'Sans 10',
anchor => 'GTK_ANCHOR_CENTER',
text => $word);
if($word !~ /Root/)
{
$text{$word}->signal_connect (event => sub {
my ($self,$event,$gui) = @_;
$gui->display_tooltip($self,$event);
},$self); }
$wpspos{$word}{"x"}=$x;
$wpspos{$word}{"y"}=$y;
$line{$word}{$wps[$i+1]} = Gnome2::Canvas::Item->new($shortest_path_group_wps2[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy+$diffy/5,$x,$y-$diffy/5],
width_pixels => 1,
first_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'blue'
);
$prevx = $x;
$prevy = $y;
}
else
{
my ($x1,$y1,$x2,$y2)=$text{$word}->get_bounds;
$x = $x1 - 5;
$y = $y2;
$prevx = $x;
$prevy = $y;
$x = $x-60;
$y = $y+10;
next;
}
}
elsif($lcs =~ /$word/)
{
$x = $x-length($lcs)*6;
$word_lcs_flag=1;
}
}
$hx = abs($maxx-$minx)+100;
$hy = abs($maxy-$miny)+80;
$canvas[$k]->set_size_request($hx,$hy);
$canvas[$k]->set_scroll_region (0, 0, $hx, $hy);
$shortest_path_group[$k]->set(x=>abs($minx)+60);
$shortest_path_group[$k]->set(y=>abs($miny)+10);
$minx = $k+1;
if($mpflag)
{
$notebook->append_page($canvas[$k], "Path ".$minx);
}
else
{
$notebook->add($canvas[0]);
}
$k++;
}
}
}
}
$self->{ canvas } = $canvas[0];
}
elsif($trace_strings[0]=~/lch/)
{
$k=-1;
if($#trace_strings>3)
{
$notebook = Gtk2::Notebook->new;
# $notebook->signal_connect(switch_page=>sub {
# my ($self,$gui) = @_;
# my $child=$self->get_current_page;
# my @children = $self->get_children;
# $gui->{ canvas }= $children[$child];
# },$self);
$mpflag = 1;
}
else
{
$notebook = Gtk2::VBox->new;
}
$i=0;
my $sub=0;
my $lcsflag=0;
foreach $i (1...$#trace_strings-1)
{
if($i%2==1)
{
$k++;
$x=0;
$y=0;
$maxx=0;
$maxy=0;
$minx=0;
$miny=0;
$canvas[$k] = Gnome2::Canvas->new;
$canvas_root[$k] = $canvas[$k]->root;
$shortest_path_group[$k] = Gnome2::Canvas::Item->new($canvas_root[$k], "Gnome2::Canvas::Group");
$root_group[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
$shortest_path_group_wps1[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
$shortest_path_group_wps2[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
%text=();
%line=();
$diffy = 40;
$diffx = 0;
$lcsflag=0;
$jflag=0;
@wps= split /\shypernym\s/, $trace_strings[$i];
$diffx=0;
foreach $j (0...$#wps)
{
$word = $wps[$j];
$y = $y-$diffy;
if($j==$#wps)
{
if($lcsflag==0)
{
$x=$x-length($word)*9;
}
}
if($miny>$y)
{
$miny = $y;
}
if($maxy<$y)
{
$maxy = $y;
}
if($minx>$x)
{
$minx = $x;
}
if($maxx<$x)
{
$maxx = $x;
}
$wpspos{$word}{"x"}=$x;
$wpspos{$word}{"y"}=$y;
@colorpos = split '#', $word;
if($colorpos[1]=~ 'v')
{
$color = 'red';
}
elsif($colorpos[1]=~ 'n')
{
$color = 'dark green';
}
else
{
$color = 'purple';
}
$text{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Text",
x => $x,
y => $y,
fill_color => $color,
font => 'Sans 10',
anchor => 'GTK_ANCHOR_CENTER',
text => $word);
if($word !~ /Root/)
{
$text{$word}->signal_connect (event => sub {
my ($self,$event,$gui) = @_;
$gui->display_tooltip($self,$event);
},$self);
}
if($j>0)
{
$sub=0;
if($j==$#wps)
{
if($lcsflag==0)
{
$sub=length($word)*3;
$lcsflag=1;
}
}
$line{$wps[$j-1]}{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy-$diffy/5,$x+$sub,$y+$diffy/5],
width_pixels => 1,
last_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'blue'
);
}
$prevx = $x;
$prevy = $y;
}
}
else
{
$diffx=0;
@wps= split /\shypernym\s/,$trace_strings[$i];
foreach $i (reverse 0...$#wps)
{
$word = $wps[$i];
if(!exists $text{$word})
{
$x = $x+$diffx;
$y = $y+$diffy;
if($miny>$y)
{
$miny = $y;
}
if($maxy<$y)
{
$maxy = $y;
}
if($minx>$x)
{
$minx = $x;
}
if($maxx<$x)
{
$maxx = $x;
}
@colorpos = split '#', $word;
if($colorpos[1]=~ 'v')
{
$color = 'red';
}
elsif($colorpos[1]=~ 'n')
{
$color = 'dark green';
}
else
{
$color = 'purple';
}
$text{$word} = Gnome2::Canvas::Item->new($shortest_path_group_wps2[$k], "Gnome2::Canvas::Text",
x => $x,
y => $y,
fill_color => $color,
font => 'Sans 10',
anchor => 'GTK_ANCHOR_CENTER',
text => $word);
if($word !~ /Root/)
{
$text{$word}->signal_connect (event => sub {
my ($self,$event,$gui) = @_;
$gui->display_tooltip($self,$event);
},$self);
}
$wpspos{$word}{"x"}=$x;
$wpspos{$word}{"y"}=$y;
$line{$word}{$wps[$i+1]} = Gnome2::Canvas::Item->new($shortest_path_group_wps2[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy+$diffy/5,$x,$y-$diffy/5],
width_pixels => 1,
first_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'blue'
);
$prevx = $x;
$prevy = $y;
}
else
{
my ($x1,$y1,$x2,$y2)=$text{$word}->get_bounds;
$x = $x1 - 5;
$y = $y2;
$prevx = $x;
$prevy = $y;
$x = $x-60;
$y = $y+10;
next;
}
}
$hx = abs($maxx-$minx)+100;
$hy = abs($maxy-$miny)+80;
$canvas[$k]->set_size_request($hx,$hy);
$canvas[$k]->set_scroll_region (0, 0, $hx, $hy);
$shortest_path_group[$k]->set(x=>abs($minx)+60);
$shortest_path_group[$k]->set(y=>abs($miny)+10);
$minx = $k+1;
if($mpflag)
{
$notebook->append_page($canvas[$k], "Path ".$minx);
}
else
{
$notebook->add($canvas[0]);
}
}
}
$self->{ canvas } = $canvas[0];
}
elsif($trace_strings[0]=~/hso/)
{
$k=-1;
if($#trace_strings>1)
{
$notebook = Gtk2::Notebook->new;
# $notebook->signal_connect(switch_page=>sub {
# my ($self,$gui) = @_;
# my $child=$self->get_current_page;
# my @children = $self->get_children;
# $gui->{ canvas }= $children[$child];
# },$self);
$mpflag = 1;
}
else
{
$notebook = Gtk2::VBox->new;
}
$i=0;
my $sub=0;
my $lcsflag=0;
my $prevword;
foreach $i (1...$#trace_strings)
{
$k++;
$x=0;
$y=0;
$maxx=0;
$maxy=0;
$minx=0;
$miny=0;
$canvas[$k] = Gnome2::Canvas->new;
$canvas_root[$k] = $canvas[$k]->root;
$shortest_path_group[$k] = Gnome2::Canvas::Item->new($canvas_root[$k], "Gnome2::Canvas::Group");
$root_group[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
$shortest_path_group_wps1[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
$shortest_path_group_wps2[$k] = Gnome2::Canvas::Item->new($shortest_path_group[$k], "Gnome2::Canvas::Group");
%text=();
%line=();
$diffy = 60;
$diffx = 0;
$lcsflag=0;
$jflag=0;
@wps= split /\s/, $trace_strings[$i];
$diffx=60;
$prevword="";
foreach $word (@wps)
{
if(length($word)>=1)
{
if($miny>$y)
{
$miny = $y;
}
if($maxy<$y)
{
$maxy = $y;
}
if($minx>$x)
{
$minx = $x;
}
if($maxx<$x)
{
$maxx = $x;
}
if($word=~/hypernym/)
{
$y=$y+$diffy;
$x=$x+$diffx+5;
if($prevx!=0)
{
$prevx+=5;
}
$prevy=$prevy+15;
$line{$prevword}{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy-$diffy/7,$x+$sub,$y-$diffy/7],
width_pixels => 1,
last_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'blue'
);
}
elsif($word=~/hyponym/)
{
$x=$x+$diffx;
$y=$y-$diffy;
if($prevx!=0)
{
$prevx+=5;
}
$line{$prevword}{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Line",
points => [$prevx,$prevy-$diffy/7,$x+$sub,$y+$diffy/7],
width_pixels => 1,
last_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'green'
);
}
elsif($word=~/merynym/)
{
$prevx = $prevx + length($prevword)*3.5;
$x = $x+2*$diffx;
$line{$prevword}{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Line",
points => [$prevx+5,$prevy,$x-5,$y],
width_pixels => 1,
last_arrowhead => 1,
arrow_shape_a => 3.57,
arrow_shape_b => 6.93,
arrow_shape_c => 4,
fill_color => 'black'
);
}
else
{
if($prevword=~/merynym/)
{
$x=$x+length($word)*3.5;
}
@colorpos = split '#', $word;
if($colorpos[1]=~ 'v')
{
$color = 'red';
}
elsif($colorpos[1]=~ 'n')
{
$color = 'dark green';
}
else
{
$color = 'purple';
}
$text{$word} = Gnome2::Canvas::Item->new($root_group[$k], "Gnome2::Canvas::Text",
x => $x,
y => $y,
fill_color => $color,
font => 'Sans 10',
anchor => 'GTK_ANCHOR_CENTER',
text => $word);
if($word !~ /Root/)
{
$text{$word}->signal_connect (event => sub {
my ($self,$event,$gui) = @_;
$gui->display_tooltip($self,$event);
},$self);
}
$prevx = $x;
$prevy = $y;
}
$prevword = $word;
}
}
$hx = abs($maxx-$minx)+100;
$hy = abs($maxy-$miny)+80;
$canvas[$k]->set_size_request($hx,$hy);
$canvas[$k]->set_scroll_region (0, 0, $hx, $hy);
$shortest_path_group[$k]->set(x=>abs($minx)+60);
$shortest_path_group[$k]->set(y=>abs($miny)+10);
$minx = $k+1;
if($mpflag)
{
$notebook->append_page($canvas[$k], "Path ".$minx);
}
else
{
$notebook->add($canvas[0]);
}
}
$self->{ canvas } = $canvas[0];
}
return $notebook;
}
sub display_tooltip
{
my ($gui,$self,$event)=@_;
my $px=$self->parent->parent->get("x");
my $py=$self->parent->parent->get("y");
my @glos = $gui->{ querydata_interface }->{ wn }->querySense($self->get("text"),"glos");
my @text = split ";",$glos[0];
my $length = length($text[0]);
my ($x1,$y1,$x2,$y2)=$self->get_bounds;
if($gui->{ toolflag } == 0)
{
if($event->type =~ /enter/)
{
my $width = $length*6.7;
my $height = $y2-$y1+1;
$gui->{ tooltip_label }->set_text($text[0]);
$gui->{ tooltip_label }->set_size_request($width,$height);
$gui->{ tooltip }->resize($width,$height);
$gui->{ tooltip }->show_all;
my ($posx, $posy) = $gui->{ tooltip }->get_position;
$gui->{ tooltip }->move($posx+$width/2+7,$posy+$height);
$gui->{ toolflag }=1;
}
elsif($event->type=~/leave/)
{
if($event->x-$px<$x1 or $event->y-$py<$y1 or $event->x-$px>$x2 or $event->y-$py>$y2)
{
$gui->{ tooltip }->hide;
$gui->{ toolflag }=0;
}
}
}
else
{
if($event->type=~/leave/)
{
my ($x1,$y1,$x2,$y2)=$self->get_bounds;
if($event->x-$px<$x1 or $event->y-$py<$y1 or $event->x-$px>$x2 or $event->y-$py>$y2)
{
$gui->{ tooltip }->hide;
$gui->{ toolflag }=0;
$gui->{ tooltip_label }->set_size_request(1,1);
$gui->{ tooltip }->set_size_request(1,1);
}
}
}
if($event->type=~/button.press/)
{
my @syns = $gui->{ querydata_interface }->{ wn }->querySense($self->get("text"),"syns");
my $string = "Glos: ".$glos[0]."\n\nSynonyms: ";
my $syn;
foreach $syn (@syns)
{
$string = $string.", ".$syn;
}
my $children;
if(defined $gui->{ vpaned }->child2)
{
my @prev_results = $gui->{ vpaned }->child2->get_children();
foreach $children (@prev_results)
{
$gui->{ vpaned }->child2->remove($children);
}
$gui->{ vpaned }->remove($gui->{ vpaned }->child2);
}
my $txtbuffer = Gtk2::TextBuffer->new();
$txtbuffer->set_text($string);
my $txtview = Gtk2::TextView->new;
$txtview->set_editable(FALSE);
$txtview->set_cursor_visible(FALSE);
$txtview->set_wrap_mode("word");
$txtview->set_buffer($txtbuffer);
$gui->{ vpaned }->add2($txtview);
($x1,$y1,$x2,$y2)=$self->parent->parent->parent->get_bounds;
$gui->{ vpaned }->set_position($y2+40-$y1);
$gui->{ vpaned }->show_all;
}
}
# sub save_file
# {
# my ($self,$filename)=@_;
# # my $window = Gtk2::Gdk::Drawable->new;
# # $window = $self->{ canvas }->get_window();
# my $pixbuf = Gtk2::Gdk::Pixbuf->new('rgb',0,8,1000,1000);
# $pixbuf->get_from_drawable(undef,$self->{ canvas }->get_colormap(),0,0,0,0,1000,1000);
# # my $pixbuf = Gtk2::Gdk::pixbuf->new_from_data($window,$window->get_colormap(),0,0,0,0,1000,1000);
# pixbuf->save($filename,"png");
# }
1;
__END__
=back
=head2 Discussion
The path measure defines the semantic similarity between two concepts as the
inverse of length of the shortest path between the concepts in the hypernym
trees of WordNet. This module displays the hypernym trees for both the concepts
and the shortest path between these concepts.
The wup measure is based on the method proposed by Wu & Palmer and uses the
depth of the two concepts in the hypernym tree and the depth of the Least Common
Subscumer. It is based on the This module enables the user to view the
hypertrees for the concepts. The lch measure implements a semantic measure
proposed by Leacock & Chodrow. It uses the length of the shortest path between
the two concepts and scales it by the maximum depth of the tree to compute the
similarity score. For this measure this module displays the shortest path.
The hso measure measure computes the semantic relatedness between two concepts
using the method proposed Hirst & St-Onge. They define the relatedness between
two concepts based on the quality of links in the lexical chain connecting the
two concepts.
The trace output from these measures is converted to a meta-language. This
meta-language serves as the input ot the visualization module. The trace output
is not used as the input to the visualization, because it might change in the
furure versions of WordNet::Similarity, thus converting it to metalanguage
prevents any of these changes to cause a major changes in the visualization
module.
=head3 Meta-language
The first line in the meta language is the measure name. The next two line list
all the possible shortest paths between the two concepts. The synsets represent
the nodes along these paths, thile the relation names between these synsets
represent the edges. If there is more than one shortest path they are also
listed. The alternate shortest paths are seperated using the OR operator. The
rest of the lines list all the other paths in the hypernym tree. These alternate
hypernym trees also use the same system as used in the shortest path. The next
line is the maximum depth of the hypertree
path
cat#n#1 hypernym feline#n#1 hypernym carnivore#n#1
dog#n#1 hypernym canine#n#2 hypernym carnivore#n#1
carnivore#n#1 hypernym placental#n#1 hypernym mammal#n#1 hypernym vertebrate#n#1 hypernym
chordate#n#1 hypernym animal#n#1 hypernym organism#n#1 hypernym living_thing#n#1 hypernym
object#n#1 hypernym entity#n#1 hypernym Root#n#1
Max Depth = 13
Path length = 5
=head1 SEE ALSO
WordNet::Similarity
WordNet::QueryData
Mailing List: E<lt>wn-similarity@yahoogroups.comE<gt>
=head1 AUTHOR
Saiyam Kohli, University of Minnesota, Duluth
kohli003@d.umn.edu
Ted Pedersen, University of Minnesota, Duluth
tpederse@d.umn.edu
=head1 COPYRIGHT
Copyright (c) 2005-2006, Saiyam Kohli and Ted Pedersen
This program is free software; you can purpleistribute it and/or modify it
under the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to
The Free Software Foundation, Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
Note: a copy of the GNU General Public License is available on the web
at <http://www.gnu.org/licenses/gpl.txt> and is included in this
distribution as GPL.txt.
=cut