Acme-Lou

 view release on metacpan or  search on metacpan

lib/Acme/Lou.pm  view on Meta::CPAN

package Acme::Lou;
use 5.010001;
use strict;
use warnings;
use utf8;
our $VERSION = '0.04';

use Exporter 'import';
use Encode;
use File::ShareDir qw/dist_file/;
use Text::Mecabist;

our @EXPORT_OK = qw/lou/;

sub lou {
    my $text = shift || "";
    return Acme::Lou->new->translate($text);
}

sub new {
    my $class = shift;
    my $self = bless {
        mecab_option => {
            userdic => dist_file('Acme-Lou', Text::Mecabist->encoding->name .'.dic'),
        },
        lou_rate => 100,
        @_,
    }, $class;
}

sub translate {
    my ($self, $text, $opt) = @_;
    my $rate = $opt->{lou_rate} // $self->{lou_rate};
    
    my $parser = Text::Mecabist->new($self->{mecab_option});
    
    return $parser->parse($text, sub {
        my $node = shift;
        return if not $node->readable;
        
        my $word  = $node->extra1 or return; # ルー単語 found
        my $okuri = $node->extra2 // "";
        
        return if int(rand 100) > $rate;
        
        if ($node->prev and
            $node->prev->is('接頭詞') and
            $node->prev->lemma =~ /^[ごお御]$/) {
            $node->prev->skip(1);
        }
        
        if ($node->is('形容詞') and
            $node->is('基本形') and
            $node->next and $node->next->pos =~ /助詞|記号/) {
            $okuri = "";
        }

        $node->text($word . $okuri);
    })->stringify();
}

1;
__END__

=encoding utf-8

=head1 NAME

Acme::Lou - Let's together with Lou Ohshiba 

=head1 SYNOPSIS

    use utf8;
    use Acme::Lou qw/lou/;

    print lou("人生には、大切な三つの袋があります。");
    # => ライフには、インポータントな三つのバッグがあります。

=head1 DESCRIPTION

Translate Japanese text into Lou Ohshiba (Japanese comedian) style. 



( run in 2.315 seconds using v1.01-cache-2.11-cpan-d7f47b0818f )