The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w
#
# A example which takes in text file and represents each word as a
# node and places edges where the nodes are used together.

use strict;
use lib '../lib';
use GraphViz;

my $graph = GraphViz->new(layout => 'neato', directed => 0, concentrate => 1, epsilon => 0.001, random_start => 1, no_overlap => 1m);

open(IN, shift || '../README');

my @words;
while (<IN>) {
  tr/[^A-Za-z]+/ /cs;
  push @words, split(/\s+/, lc);
}
@words = grep { ! /^\s*$/ } @words;

my %words;
my $lastword = shift @words;
foreach my $word (@words) {
  $words{$lastword}{$word}++;
  $lastword = $word;
}

foreach my $left (keys %words) {
  foreach my $right (keys %{$words{$left}}) {
    if ($words{$left}{$right} == 1) {
      $graph->add_edge($left => $right, weight => $words{$left}{$right} - 1);
    } else {
      $graph->add_edge($left => $right);
    }
  }
}

#warn $graph->_as_debug;
$graph->as_png("text.png");
#print $graph->as_text;