- 论坛徽章:
- 7
|
本帖最后由 rubyish 于 2014-03-26 22:14 编辑
Perltidy 下 4 楼代码:- #!/usr/bin/perl
- use IO::File;
- my $fh = IO::File->new('big.txt') or die;
- my $words = join '', <$fh>;
- sub words { return ( lc shift ) =~ /([a-z]+)/g; }
- sub train {
- my %model;
- $model{$_} = ( $model{$_} || 1 ) + 1 for @_;
- return %model;
- }
- my %nwords = train( words($words) );
- sub edits1 {
- my $word = shift;
- return (
- (
- map { ( substr $word, 0, $_ ) . ( substr $word, $_ + 1 ) }
- 0 .. ( length($word) - 1 )
- ),
- (
- map {
- ( substr $word, 0, $_ )
- . ( substr $word, $_ + 1, 1 )
- . ( substr $word, $_, 1 )
- . ( substr $word, $_ + 2 )
- } 0 .. ( length($word) - 2 )
- ),
- (
- map {
- my $c = $_;
- map { ( substr $word, 0, $_ ) . $c . ( substr $word, $_ + 1 ) }
- 0 .. ( length($word) - 1 )
- } 'a' .. 'z'
- ),
- (
- map {
- my $c = $_;
- map { ( substr $word, 0, $_ ) . $c . ( substr $word, $_ ) }
- 0 .. length($word)
- } 'a' .. 'z'
- )
- );
- }
- sub known_edits2 {
- return map {
- grep { exists $nwords{$_} } edits1($_)
- } edits1(shift);
- }
- sub known {
- return grep { exists $nwords{$_} } @_;
- }
- sub correct {
- my @candidates =
- known(@_) ? known(@_)
- : known( edits1(@_) ) ? known( edits1(@_) )
- : known_edits2(@_) ? known_edits2(@_)
- : @_;
- return ( sort { $nwords{$b} <=> $nwords{$a} } @candidates )[0];
- }
复制代码 |
|