Acme-Lingua-ZH-Remix
view release on metacpan or search on metacpan
lib/Acme/Lingua/ZH/Remix.pm view on Meta::CPAN
package Acme::Lingua::ZH::Remix;
use v5.10;
our $VERSION = "0.99";
=pod
=encoding utf8
=head1 NAME
Acme::Lingua::ZH::Remix - The Chinese sentence generator.
=head1 SYNOPSIS
use Acme::Lingua::ZH::Remix;
my $x = Acme::Lingua::ZH::Remix->new;
# Generate a random sentance
say $x->random_sentence;
=head1 DESCRIPTION
Because lipsum is not funny enough, that is the reason to write this
module.
This module is a L<Moo>-based, with C<new> method being the constructor.
The C<random_sentence> method returns a string of one sentence
of Chinese like:
çæ¯å®å
¨å¤±æï¼å©åï¼æéº¼ä¸åäºå¢ï¼
By default, it uses small corpus data from Project Gutenberg. The generated
sentences are remixes of the corpus.
You can feed you own corpus data to the `feed` method:
my $x = Acme::Lingua::ZH::Remix->new;
$x->feed($my_corpus);
# Say something based on $my_corpus
say $x->random_santence;
The corpus should use full-width punctuation characters.
=cut
use utf8;
use Moo;
use Types::Standard qw(HashRef Int);
use List::MoreUtils qw(uniq);
use Hash::Merge qw(merge);
has phrases => (is => "rw", isa => HashRef, lazy => 1, builder => "_build_phrases");
sub _build_phrases {
my $self = shift;
local $/ = undef;
my $corpus = <DATA>;
my %phrase;
my @phrases = $self->split_corpus($corpus);
for (@phrases) {
my $p = substr($_, -1);
push @{$phrase{$p} ||=[]}, \$_;
}
return \%phrase;
}
sub phrase_count {
my $self = shift;
my %p = %{$self->phrases};
my $count = 0;
for(keys %p) {
$count += scalar @{$p{$_}};
}
return $count;
}
sub random(@) { $_[ rand @_ ] }
=head1 METHODS
=head2 split_corpus($corpus_text)
Takes a scalar, returns an list.
This is an utility method that does not change the internal state of
the topic object.
=cut
sub split_corpus {
my ($self, $corpus) = @_;
return () unless $corpus;
$corpus =~ s/^\#.*$//gm;
# Squeeze whitespaces
$corpus =~ s/(\s|ã)*//gs;
# Ignore certain punctuations
$corpus =~ s/(ââ|ââ)//gs;
my @xc = split /(?:ï¼(.+?)ï¼|ï¼?ã(.+?)ã|ã(.+?)ã|â(.+?)â)/, $corpus;
my @phrases = uniq sort grep /.(ï¼|ã|ï¼|ï¼)$/,
map {
my @x = split /(ï¼|ã|ï¼|ï¼)/, $_;
my @r = ();
while (@x) {
my $s = shift @x;
my $p = shift @x or next;
$s =~ s/^(ï¼|ã|ï¼|ï¼|\s)+//;
push @r, "$s$p";
}
@r;
} map {
s/^\s+//;
s/\s+$//;
lib/Acme/Lingua/ZH/Remix.pm view on Meta::CPAN
unshift @phrases, $ending;
my $l = length($ending);
my $iterations = 0;
my $max_iterations = 1000;
my $average = ($options{min} + $options{max}) / 2;
my $desired = int(rand($options{max} - $options{min}) + $options{min}) || $average || $options{max};
while ($iterations++ < $max_iterations) {
my $x;
do {
$x = random('ï¼', 'ã', 'ï¼', '/')
} while ($self->phrase_ratio($x) == 0);
my $p = $self->random_phrase($x);
if ($l + length($p) < $options{max}) {
unshift @phrases, $p;
$l += length($p);
}
my $r = abs(1 - $l/$desired);
last if $r < 0.1;
last if $r < 0.2 && $iterations >= $max_iterations/2;
}
$str = join "", @phrases;
$str =~ s/ï¼$//;
$str =~ s/^ã(.+)ã$/$1/;
if (rand > 0.5) {
$str =~ s/(ï¼)â¦â¦/$1/gs;
} else {
$str =~ s/ï¼(â¦â¦)/$1/gs;
}
return $str;
}
1;
=head1 AUTHOR
Kang-min Liu <gugod@gugod.org>
=head1 COPYRIGHT
Copyright 2010- by Kang-min Liu, <gugod@gugod.org>
This program is free software; you can redistribute it a nd/or modify
it under the same terms as Perl itself.
See L<http://www.perl.com/perl/misc/Artistic.html>
=cut
# Data coming from Wikisource
# http://zh.wikisource.org/zh-hant/%E5%BF%98%E4%B8%8D%E4%BA%86%E7%9A%84%E9%81%8E%E5%B9%B4
__DATA__
#c9s
éä¸è³´ï¼éä¸è³´ãéä¸è³´ï¼éä¸è³´ï¼
# åé²
å¨ä¸åæä¸ï¼æ¯é»æçæä¸ï¼æé»çæ°£æ°ï¼æ¿æ¿å¯å¯æç©ºéå
å¡èï¼ä¸è®ææçå
æï¼æ¼å°å°å°ä¸ãé£é»æéå¨å¹¾ç¾å±¤çå°åºï¼ä¹æ¯ç¶é©ä¸å°ï¼æ¯æªæ¾æéé§äººç黿ã
ããå¨éè¢«é»ææå
å¡çå°ä¸ï¼æåå被æä»£æ¯è¦ªæéºæ£çå©ç«¥ãä»åç便·æäºä¸æï¼ä¸æå¾æ¯è¿½æ
ä¸è¿æ¯è¦ªçæ
æï¼èªå·±èµ°åºå®¶ä¾ï¼ä¹æ¯ä¸å徿¯æè¨ï¼è¢«éçå人ä¹åã
ããä»åä¸ç¥ç«çä»éº¼å°æ¹ï¼ä¹ä¸ç¥ä»éº¼æ¯æ¹åï¼ä¸ç¥ç«çå°é¢æ¯å¦ç©©åºï¼ä¹ä¸ç¥ç«çå卿¯å¦å±éªï¼å çºä¸çæé»ï¼ç¼ç已失äºä½ç¨ã
ããä»åå·²ç¶å¿å»äºä¸åï¼å¿è£¡ä¸æ·æ±é©æï¼ä¹ä¸å¸æ±æ
°å®ï¼åªæä¸ç¨®çç´è¦ºæ¯é
èä»åï¼ââåé²ï¼
ããä»åæå°æä¸ç¨®ï¼ä¸è¨±ä»åæ°¸ä¹
ç«ååä¸ä½ç½®çå¢åãä»åä¾¿ä¹æèæï¼å
åºå°ä¿¡è³´ãäºç¸ææï¼ç±æ¬è½çè¡åï¼åé¢çæåï¼é£ä¸ç¥å»èçåéï¼ç§»åèªå·±çè
³æ¥ãåé²ï¼ç²ç®å°åé²ï...
ç¡ç®çå°åé²ï¼èªç¶å¿è¨ä»åè¡ç¨çé è¿ï¼åªæ¯åé²ï¼äºç¸ä¿¡è³´ï¼äºç¸ææï¼çºèåé²èåé²ã
ããä»åæ²æå°æ±å
æä¹è·¯çæèï¼ä¹æ²æèµ°å°èªç±ä¹è·¯çæ
¾æï¼åªæ¯æé¢çæåèè¡ãç¤æ¥çç³é ï¼åºè
³çèæ£ï¼é·äººçæ³¥æ¾¤ï¼æººäººçæ°´çªªï¼ææä¸ååé²çé»ç¤åå±éªï¼å¨éé»æçµ±æ²»ä¹ä...
ããå¨ä»åèªå§å°±ç¡æè¦éµèãäººé¡æ¾ç¶è¡éä¹è·¡ãç念é ãå¨é黿ä¹ä¸ï¼ç«ä¹æ²æè¡ä¸åé²çäºï¼ééæäºé¡è¹¶ï¼ä¹ä¸è½ææ¢ä»åçåé²ãåé²ï¼å¿äºä¸åå±éªèåé²ã
ããå¨éæ¨£é»æä¹ä¸ï¼ææä¸åï¼ç¡æä¼å¨æ»ä¸è¬ç坿»
裡ï¼åªæé¢¨å
ççæ
æï¼é¨å¤ªå¤ªç好æï¼ç¹å¥çºä»ååå¥èé²è¡æ²ï¼åªæéæ¨è²å¨é黿䏿å±èï¼è¦ä»¥æ
°å®ä»åéä¸çå¯å¯ï¼æ
°åä...
ããä¸ç¥è¡æå¤å°æå»ï¼ç¶é幾許éç¨ï¼å¿½å¾é¢¨é¨åå¥çé²è¡æ²ä¸ï¼åè¾¨åºæµ©è©ç溪è²ãæ¾æ¾æ¹æ¹å¦å¹¾åè¬é¡æ®ç³ç±ç©ºä¸çä¸ãéæ¾æ¹è²ä¸ï¼ä¸ç¥æµå¤±å¤å°äººé¡æè¨å½çç°îï¼ä¸ç¥åªè¬å¹¾è¨±ç...
ããä»ååªæåé²çè¡åå¬è¿«èï¼å¿å»äºæºªåæ°´ï¼å¿å»äºä¸åãä»åå䏿¯ãå
ç¥ãï¼å¨éæåç¼çä¹ä¸è½éå
¶æç¨ã使¯ä»åç«æèªå·±èµ°å°æ©ä¸ï¼éå¨ä»åèªå·±ä¸é»ä¹æ²ææèå°ï¼åªç¶æ¯å...
ããåé²ï¼åé²ï¼ä»å䏿³å°ä¼æ¯ï¼ä½æ¯å¨ä»åç¼éæªå®æçèé«ä¸ï¼èªç¶æ²æé樣åéââç¾å¨ç人é¡ï¼éæ¯å±å¼±ç坿ï¼çççä½ç¨å¨ä¸ç¨åº¦ä»¥å¤ï¼éä¸è½ç¨æå¿å»æµæå»å
å¶ãââä»å...
ããæéçé²è¡ï¼å çºç©ºéç黿ï¼ä¼¼ä¹æç¨é²ç·©ï¼ç¶éäºå¾ä¹
ï¼çºè¦æäºç½å
ï¼å·²åå°å°é»æä¹åãä»å人ä¸çä¸åï¼ä¸ç¥æ¯å
奿å°å¼ï¼èº«ééç¶è¼é«ï¼çèæ¯è¼çç¦å¼±ï¼ä¼¼æ¯åå°è¼å¤ç...
ããä»ä¸èªç¦å°è¸´èºå°èµ°ååå»ï¼å¿è¨ä»çä¼´ä¾¶ï¼èµ°éäºä¸æ®µéç¨ï¼æ³å çºè
³æäºç²è»ï¼ä¹å çºå°é¢çå´å¶ï¼å¿½ç¶å°é¡è¹¶ï¼éªäºå
è·åãæ¤å»ï¼ä»çºæè¦ºå°èªå·±æ¯å¨å¤ç¨å°åé²ï¼å¤±äºä»¥åäºç...
ããéå¹¾è²å¼åï¼æç ´æ»ä¸è¬çéå¹ï¼é³é¿ç餿³¢ï¼æ¾å°å°å°å¹³ç·ä»¥å¤ï¼æåäºéæ¢æé»çæ°£æ°ï¼é¢¨é¨å調åèç¯å¥ï¼å¥èµ·æ²å£¯çé²è¡æ²ãä»çä¼´ä¾¶ï¼ç¶å¨æè夢ä¹åçå¿«æ¨ï¼è®ä»ç¨èªä¸åï...
ãã失äºä¼´ä¾¶çä»ï¼å¤ç¨å°å¨é»æä¸ç¹¼çºèåé²ã
ããåé²ï¼åèé£ä¸ç¥å°èèçéä¸ãâ¦â¦
# åååæ/è³´å
ææçæ°å£«å·²é½æ»å»ï¼
åªæ®åäºå©¦å¥³å°å
ï¼
é天大çå¥è®ï¼
誰æ¢èªªæ¯èµ·æ¼ä¸æï¼
人åæçéè«å¦çå½ï¼
æªåæäººæ¢èªçè¼ï¼
éä¸èæä½¿ç¨®ææ»
亡ï¼
å¨ä»åç¶ç¶æ©å°±çæï¼
ä½çµæ¼è¦ºæå°èµ°åæ»
亡ï¼
éåå å°±ä¸å®¹å¦æ¸¬ã
é說ä»åéè »ç¡ç¥ï¼
çè¦é®®ç´
çè¡ï¼
便å¿å»ä¸åæ¡èºçåï¼
使¯éä¸çªåï¼
ææå徿¥åºèæç°ã
å¨åä»ååä¸å¢éï¼
䏿¨£å»åæ¼ä¸å¹¸ç人åï¼
é£äºææ»å·ççä¸ç¾¤ï¼
( run in 0.752 second using v1.01-cache-2.11-cpan-800906f7e73 )