Tengo dos corpus paralelos (archivos de texto) alineados con oraciones con aproximadamente 50 mil palabras. (del corpus Europarl -> traducción paralela de documentos legales). Ahora me gustaría barajar las líneas de los dos archivos, pero ambos de la misma manera. Quería abordar eso usando gshuf (estoy en una Mac) usando una fuente aleatoria única.
gshuf --random-source /path/to/some/random/data file1
gshuf --random-source /path/to/some/random/data file2
Pero recibí el mensaje de error end of file
, porque aparentemente la semilla aleatoria debe contener todas las palabras que contiene el archivo a ordenar. ¿Es eso cierto? En caso afirmativo, ¿cómo debo crear una semilla aleatoria que sea buena para mis necesidades? Si no, ¿de qué otra manera podría aleatorizar los archivos en paralelo? Pensé en pegarlos, aleatorizarlos y luego dividirlos nuevamente. Sin embargo, esto parece feo ya que primero necesitaría encontrar un delimitador que no ocurra en los archivos.
fuente
random sources
. En cuanto apaste
, podría usar como delimitador algunos caracteres de baja ascii que es poco probable que ocurran en sus archivos (como\x02
,\x03
...).Respuestas:
No sé si hay un método más elegante, pero esto funciona para mí:
Resultado:
Pero los archivos deben tener exactamente el mismo número de líneas.
La documentación de GNU Coreutils también proporciona una buena solución para la aleatoriedad repetida utilizando
openssl
como generador aleatorio sembrado:Sin embargo, considere usar una semilla mejor que "42", a menos que quiera que alguien más pueda reproducir "su" resultado aleatorio también.
fuente
end of file
no se produzca el error?/dev/null
es porquetee
también imprime astdout
. Podría usar> threerandom
en su lugar, pero es más difícil de escribir. Las canalizaciones con nombre producirán tantos datos aleatorios como sea necesario, por lo que no tiene que saber de antemano cuánto necesitará.tee
que ...