Текстовая проблема сжатия Твиттера

Нажмите значок «Отладка приложения» рядом со значком «Запуск приложения» или нажмите SHIFT + F9. Это, кажется, помогает мне.

7
задан 6 revs 23 May 2017 в 12:16
поделиться

4 ответа

PAQ8O10T << FTW

0
ответ дан 7 December 2019 в 14:37
поделиться

Не уверен, что у меня будет время / силы, чтобы дополнить это фактическим кодом, но вот моя идея:

  • Любая произвольная строка LATIN 1 меньшей длины может быть просто закодирована (даже не сжатый ) без потерь на 140 символов. Наивная оценка составляет 280 символов, хотя с учетом ограничений кодовых точек в правилах конкурса, она, вероятно, немного короче, чем это.
  • Строки немного длиннее указанной выше длины (предположим, от 280 до 500 символов), скорее всего, могут быть сокращены используя стандартные методы сжатия, в строку, достаточно короткую, чтобы разрешить указанное выше кодирование.

Что-нибудь длиннее, и мы начинаем терять информацию в тексте. Поэтому выполните минимальное количество следующих шагов, чтобы уменьшить строку до длины, которую затем можно сжать / закодировать с помощью вышеуказанных методов. Кроме того, не выполняйте эти замены для всей строки , если простое выполнение их для подстроки сделает ее достаточно короткой (я бы, вероятно, прошел по строке назад).

  1. Замените все символы LATIN 1 выше 127 (в основном буквы с диакритическими знаками и забавные символы) их ближайшим эквивалентом в буквенных символах без акцента или, возможно, общей заменой символа, например "#"
  2. Замените все прописные буквы их эквивалентными строчными буквами
  3. Замените все не буквенно-цифровые символы (любые оставшиеся символы или знаки препинания) пробелом
  4. Замените все числа на 0

Хорошо, теперь мы ' мы удалили столько лишних символов, сколько мы можем разумно избавиться. Теперь мы собираемся сделать еще несколько резких сокращений:

  1. Заменим все двойные буквы (балон) на одну букву (балон). Будет выглядеть странно, но, надеюсь, читатель сможет его расшифровать.
  2. Замените другие распространенные буквенные комбинации более короткими эквивалентами (CK на K, WR на R и т. Д.)

Хорошо, это все, что мы можем, и получить текст должен быть читаемым . Помимо этого, давайте посмотрим, сможем ли мы придумать способ, чтобы текст напоминал оригинал, даже если он в конечном итоге не дешифрируемый (опять же, выполните этот единственный символ на время от конца строки и остановитесь, когда она станет достаточно короткой):

  1. Замените все гласные (aeiouy) на
  2. Замените все "высокие" буквы (bdfhklt) на l
  3. Заменить все «короткие» буквы (cmnrsvwxz) на n
  4. Заменить все «висящие» буквы (gjpq) на p

Это должно оставить строку, состоящую ровно из 5 возможных значений (a, l, n, p и пробел), что должно позволить нам кодировать довольно длинные строки.

Помимо этого, нам просто нужно было бы усечь.

Единственный другой метод, о котором я могу думать, - это кодирование на основе словаря для общих слов или групп букв. Это может дать нам некоторую выгоду для правильных предложений, но, вероятно, не для произвольных строк.

Помимо этого, нам просто нужно было бы усечь.

Единственный другой метод, о котором я могу думать, - это кодирование на основе словаря для общих слов или групп букв. Это может дать нам некоторую выгоду для правильных предложений, но, вероятно, не для произвольных строк.

Помимо этого, нам просто нужно было бы усечь.

Единственный другой метод, о котором я могу думать, - это кодирование на основе словаря для общих слов или групп букв. Это может дать нам некоторую выгоду для правильных предложений, но, вероятно, не для произвольных строк.

3
ответ дан 7 December 2019 в 14:37
поделиться

Вот простой пример, который берет входной файл и удаляет все символы, не являющиеся словами.

#! perl
use strict;
use warnings;
use 5.010;


use Getopt::Long;
use Pod::Usage;
use autodie;

my %opts = (
  infile  => '-',
  outfile => '-',
);
GetOptions (
  'encode|e'    => \$opts{encode},
  'decode|d'    => \$opts{decode},
  'infile|i=s'  => \$opts{infile},
  'outfile|o=s' => \$opts{outfile},
  'help|h'      => \&help,
  'man|m'       => \&man,
);

unless(
  # exactly one of these should be set
  $opts{encode} xor $opts{decode}
){
  help();
}


{
  my $infile;
  if( $opts{infile} ~~ ['-', '&0'] ){
    $infile = *STDIN{IO};
  }else{
    open $infile, '<', $opts{infile};
  }

  my $outfile;
  if( $opts{outfile} ~~ ['-', '&1'] ){
    $outfile = *STDOUT{IO};
  }elsif( $opts{outfile} ~~ '&2' ){
    $outfile = *STDERR{IO};
  }else{
    open $outfile, '>', $opts{outfile};
  }

  if( $opts{decode} ){
    while( my $line = <$infile> ){
      chomp $line;

      say {$outfile} $line;
    }
  }elsif( $opts{encode} ){
    while( my $line = <$infile> ){
      chomp $line;

      $line =~ s/[\W_]+/ /g;

      say {$outfile} $line;
    }
  }else{
    die 'How did I get here?';
  }
}

sub help{
  pod2usage();
}
sub man{
  pod2usage(1);
}
__END__

=head1 NAME

sample.pl - Using GetOpt::Long and Pod::Usage

=head1 SYNOPSIS

sample.pl [options] [file ...]

 Options:
   --help     -h      brief help message
   --man      -m      full documentation
   --encode   -e      encode text
   --decode   -d      decode text
   --infile   -i      input  filename
   --outfile  -o      output filename

=head1 OPTIONS

=over 8

=item B<--help>

Print a brief help message and exits.

=item B<--man>

Prints the manual page and exits.

=item B<--encode>

Removes any character other than /\w/.

=item B<--decode>

Just reads from one file, and writes to the other.

=item B<--infile>

Input filename. If this is '-' or '&0', then read from STDIN instead.
If you use '&0', you must pass it in with quotes.

=item B<--outfile>

Output filename. If this is '-' or '&1', then write to STDOUT instead.
If this is '&2', then write to STDERR instead.
If you use '&1' or '&2', you must pass it in with quotes.

=back

=head1 DESCRIPTION

B<This program> will read the given input file(s) and do something
useful with the contents thereof.

=cut
echo Hello, this is, some text | perl sample.pl -e
Hello this is some text
0
ответ дан 7 December 2019 в 14:37
поделиться

Вот мой вариант для реального английского.

Каждая кодовая точка имеет примерно 1100000 возможных состояний. Что ж, это много места.

Итак, мы объединяем весь исходный текст и получаем из него синсеты Wordnet. Числа превращаются в английские имена («сорок два»). 1,1M состояний позволят нам хранить идентификатор synset (который может быть от 0 до 82114), позицию внутри synset (я полагаю, ~ 10 вариантов) и тип synset (который является одним из четырех - существительное, глагол, прилагательное, наречие) . У нас даже может быть достаточно места для хранения исходной формы слова (например, идентификатора времени глагола).

Декодер просто передает синсеты в Wordnet и извлекает соответствующие слова.

Исходный текст:

A white dwarf is a small star composed mostly of electron-degenerate matter. Because a
white dwarf's mass is comparable to that of the Sun and its volume is comparable to that 
of the Earth, it is very dense.

Становится:

A white dwarf be small star composed mostly electron degenerate matter because white
dwarf mass be comparable sun IT volume be comparable earth IT be very dense

(проверено с Интернет Wordnet ). Этот «код» должен занимать 27 кодовых точек. Конечно, вся тарабарщина вроде «lol» и «L33T» будет потеряна навсегда.

1
ответ дан 7 December 2019 в 14:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: