나는 약 5천만 단어로 구성된 두 개의 문장 정렬 병렬 말뭉치(텍스트 파일)를 가지고 있습니다. (Europarl 코퍼스에서 -> 법률 문서의 병렬 번역). 이제 두 파일의 줄을 섞고 싶지만 같은 방식입니다. 저는 gshuf(저는 Mac을 사용하고 있습니다)를 사용하여 고유한 임의성 소스를 사용하여 이 문제를 해결하고 싶습니다.
gshuf --random-source /path/to/some/random/data file1
gshuf --random-source /path/to/some/random/data file2
end of file
그러나 분명히 무작위 시드에는 정렬 중인 파일에 포함된 모든 단어가 포함되어야 하기 때문에 오류가 발생합니다 . 정말? 그렇다면 내 필요에 맞는 무작위 시드를 어떻게 생성해야 합니까? 그렇지 않은 경우 파일을 병렬로 무작위화할 수 있는 다른 방법은 무엇입니까? 함께 붙여넣고 무작위로 추출한 다음 다시 분할하는 방법을 생각했습니다. 그러나 파일에 표시되지 않는 구분 기호를 먼저 찾아야 하기 때문에 이는보기 흉해 보입니다.
답변1
더 우아한 방법이 있는지는 모르겠지만 이것이 나에게 효과적입니다.
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
결과:
$ 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
하지만 파일의 행 수가 정확히 동일해야 합니다.
GNU Coreutils 문서는 openssl
반복 무작위성을 달성하기 위해 시드 무작위 생성기를 사용하기 위한 좋은 솔루션도 제공합니다.
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)
그러나 다른 사람들도 "귀하의" 무작위 결과를 재현할 수 있기를 원하지 않는 한 "42"보다 더 나은 시드를 사용하는 것을 고려하십시오.