Docker로 Syntaxnet 을 사용하고자 할 때 결과물의 포맷을 좀 더 쉽게 파싱하거나 다룰 수 있도록 수정하는 방법입니다.
먼저, Docker 상에서 Syntaxnet 을 실행하는 방법은 아래 경로를 참조해 주세요.
(* 여기서 컨테이너의 이름은 "syntaxnet"으로 지정되어 있습니다.)
수정전의 포맷은 아래와 같이 확인 할 수 있습니다. 아래의 명령어를 입력하면,
echo 'Bob brought the pizza to Alice .' | docker exec -i syntaxnet ./syntaxnet/demo.sh
아래와 같이 결과가 출력됩니다.
: : Input: Bob brought the pizza to Alice . Parse: brought VBD ROOT +-- Bob NNP nsubj +-- pizza NN dobj | +-- the DT det +-- to IN prep | +-- Alice NNP pobj +-- . . punct
이와 같은 결과의 형태를 수정하려면 먼저, Docker 이미지를 실행한 후 컨테이너에서 demo.sh 파일을 호스트로 꺼내 옵니다.
docker cp syntaxnet:/root/models/syntaxnet/syntaxnet/demo.sh demo.sh
아래와 같이 demo.sh 파일의 마지막 4라인을 주석처리 합니다.
PARSER_EVAL=bazel-bin/syntaxnet/parser_eval MODEL_DIR=syntaxnet/models/parsey_mcparseface [[ "$1" == "--conll" ]] && INPUT_FORMAT=stdin-conll || INPUT_FORMAT=stdin $PARSER_EVAL \ --input=$INPUT_FORMAT \ --output=stdout-conll \ --hidden_layer_sizes=64 \ --arg_prefix=brain_tagger \ --graph_builder=structured \ --task_context=$MODEL_DIR/context.pbtxt \ --model_path=$MODEL_DIR/tagger-params \ --slim_model \ --batch_size=1024 \ --alsologtostderr \ | \ $PARSER_EVAL \ --input=stdin-conll \ --output=stdout-conll \ --hidden_layer_sizes=512,512 \ --arg_prefix=brain_parser \ --graph_builder=structured \ --task_context=$MODEL_DIR/context.pbtxt \ --model_path=$MODEL_DIR/parser-params \ --slim_model \ --batch_size=1024 \ --alsologtostderr \ #| \ # bazel-bin/syntaxnet/conll2tree \ # --task_context=$MODEL_DIR/context.pbtxt \ # --alsologtostderr
그리고 다시 docker 컨테이너로 집어 넣습니다.
docker cp demo.sh syntaxnet:/root/models/syntaxnet/syntaxnet/demo.sh
자, 이제 syntaxnet을 아래와 같이 실행해 봅니다.
echo "Hello, gunman." | docker exec -i syntaxnet ./syntaxnet/demo.sh 1>result.txt
result.txt 파일의 내용을 확인합니다.
$ cat result.txt 1 Hello _ X UH _ 3 discourse _ _ 2 , _ . , _ 3 punct _ _ 3 gunman _ NOUN NN _ 0 ROOT _ _ 4 . _ . . _ 3 punct _ _