Eu tenho dois corpora paralelos alinhados por sentenças (arquivos de texto) com cerca de 50 mil palavras. (do Europarl corpus -> tradução paralela de documentos legais). Agora eu gostaria de embaralhar as linhas dos dois arquivos, mas ambos da mesma maneira. Eu queria abordar isso usando gshuf (estou em um Mac) usando uma fonte aleatória única.
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 maneira eu poderia aleatoriamente os arquivos em paralelo? Pensei em colá-los juntos, aleatoriamente e depois me separar novamente. No entanto, isso parece feio, pois eu precisaria primeiro encontrar um delimitador que não ocorra nos arquivos.
fonte
random sources
. Quanto apaste
, você pode usar como delimitador algum caractere de baixo ASCII que é improvável que ocorra em seus arquivos (como\x02
,\x03
...).Respostas:
Não sei se existe um método mais elegante, mas isso funciona para mim:
Resultado:
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:No entanto, considere usar uma semente melhor que "42", a menos que você queira que mais alguém possa reproduzir "seu" resultado aleatório também.
fonte
end of file
erro não ocorra?/dev/null
ocorre porquetee
também imprime emstdout
. Poderia usar,> threerandom
mas é mais difícil de fazer scripts. Os pipes nomeados produzirão tantos dados aleatórios quanto necessários, para que você não precise saber de antemão quanto precisará.tee
faz ...