Embaralhe dois arquivos de texto paralelos

5

Eu tenho dois corpora paralelos alinhados à frase (arquivos de texto) com cerca de 50 mil palavras. (do corpus Europarl - tradução paralela de documentos jurídicos). Eu gostaria agora de embaralhar as linhas dos dois arquivos, mas ambos da mesma maneira. Eu queria abordar isso usando o gshuf (estou no Mac) usando uma única fonte aleatória.

gshuf --random-source /path/to/some/random/data file1
gshuf --random-source /path/to/some/random/data file2

Mas recebi a mensagem de erro end of file , porque aparentemente a semente aleatória precisa conter todas as palavras que o arquivo a ser classificado contém. Isso é verdade? Se sim, como devo criar uma semente aleatória que seja boa para minhas necessidades? Se não, de que outra forma eu poderia randomizar os arquivos em paralelo? Eu pensei em colá-los juntos, randomizando e depois separando novamente. No entanto, isso parece feio, já que eu precisaria primeiro encontrar um delimitador que não ocorra nos arquivos.

    
por conipo 05.08.2015 / 19:12

1 resposta

6

Eu não sei se existe um método mais elegante, mas isso funciona para mim:

mkfifo onerandom tworandom threerandom
tee onerandom tworandom threerandom < /dev/urandom > /dev/null &
shuf --random-source=onerandom onefile > onefile.shuf &
shuf --random-source=tworandom twofile > twofile.shuf &
shuf --random-source=threerandom threefile > threefile.shuf &
wait

Resultado:

$ head -n 3 *.shuf
==> onefile.shuf <==
24532 one
47259 one
58678 one

==> threefile.shuf <==
24532 three
47259 three
58678 three

==> twofile.shuf <==
24532 two
47259 two
58678 two

Mas os arquivos devem ter exatamente o mesmo número de linhas.

A documentação do GNU Coreutils também fornece uma boa solução para aleatoriedade repetida usando openssl como um gerador aleatório semeado:

https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html#Random-sources

get_seeded_random()
{
  seed="$1"
  openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \
    </dev/zero 2>/dev/null
}

shuf -i1-100 --random-source=<(get_seeded_random 42)

No entanto, considere o uso de uma semente melhor que "42", a menos que você queira que qualquer outra pessoa seja capaz de reproduzir "seu" resultado aleatório também.

    
por 05.08.2015 / 19:25