# A script to convert wordnet files to ZZ.
# Uses Lingua::Wordnet from CPAN.
$N = 10000;
$NLETT = 3;
use Lingua::Wordnet;
$wn = new Lingua::Wordnet;
for my $k (keys %{$wn->{indexhash}}) {
print $k,"\n" if ++$n % 1000 == 0;
last if $n > $N;
local $_ = $k;
s/\%.*//;
# Only nouns.
@synsets = $wn->lookup_synset($_, "n");
next if !@synsets;
push @words, $_;
}
@words = sort @words;
$id = 1;
$txt = "";
$conns = "";
$pref = "";
$hiercon = "";
@hier = ();
$conns .=qq{};
# Cells for all words.
print "WORDS\n";
undef $prev;
for(@words) {
my $prevhier;
if($pref ne substr $_, 0, $NLETT) {
for my $i (1..$NLETT) {
my $sub = substr($_, 0, $i);
if(substr($pref, 0, $i) ne $sub) {
$sub = qxml($sub);
$txt .=
qq{$sub | \n};
if(defined $hier[$i]) {
$conns .= qq{
};
}
$hier[$i] = $id;
if(defined $prevhier) {
$hiercon .= qq{
};
}
$prevhier = $id;
$id++;
}
}
$pref = substr $_, 0, $NLETT;
}
my $t = qxml($_);
$txt .= qq{$t | \n};
$conns .= qq{\n} if defined $prev;
if(defined $prevhier) {
$hiercon .= qq{
\n};
}
$prev = $id;
$words{$_} = $id++;
}
$conns .= qq{};
$conns .= qq{ $hiercon };
# Look for synsets.
print "SYNSETS\n";
$conns .=qq{};
for my $w (@words) {
@synsets = $wn->lookup_synset($w, "n");
$prev = $words{$w};
for my $synset (@synsets) {
my $offs = $synset->offset();
if(!exists $synsets{$offs}) {
$gloss = qxml($synset->gloss());
$txt .= qq{$gloss | \n};
$synsets{$offs} = $id++;
}
$txt .= qq{ | \n};
$conns .= qq{\n};
$prev = $id;
$ssw{$offs."%".$w} = $id++;
}
}
$conns .= qq{};
# Connect words inside synset.
print "WORDS IN SYNSETS\n";
$conns .=qq{};
for my $k (keys %synsets) {
$synset = $wn->lookup_synset_offset($k);
my @w = $synset->words();
$prev = $synsets{$k};
for my $w (@w) {
$w =~ s/\%.*//;
next unless exists $words{$w};
$c = $ssw{$k."%".$w};
die "NO SSW '$k' '$w'" unless defined $c;
$conns .= qq{\n};
$prev = $c;
}
}
$conns .= qq{};
undef %ssw;
undef @words;
undef %words;
# Hypo- and hypernyms.
print "HYPO\n";
$conns .=qq{};
for my $k (keys %synsets) {
@hypos = $wn->lookup_synset_offset($k)->hyponyms();
$prev = $synsets{$k};
for my $h (@hypos) {
my $offs = $h->offset();
next unless exists $synsets{$offs};
$txt .= qq{ | \n};
$conns .= qq{\n};
$prev = $id;
$hyp{$offs."%".$k} = $id++;
}
}
$conns .= qq{};
print "HYPER\n";
$conns .=qq{};
for my $k (keys %synsets) {
@hyper = $wn->lookup_synset_offset($k)->hypernyms();
$prev = $synsets{$k};
for my $h (@hyper) {
$lid = $hyp{$k."%".$h->offset()};
next unless defined $lid;
$conns .= qq{\n};
$prev = $lid;
}
}
$conns .= qq{};
undef %hyp;
open F, ">out.xml";
print F qq{ }, $txt, $conns, "";
sub qxml {
local $_ = $_[0];
s/&/&/g;
s/</g;
s/>/>/g;
s/"/"/g;
return $_;
}