레이블이 SyntaxNet인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SyntaxNet인 게시물을 표시합니다. 모든 게시물 표시

2016년 9월 11일 일요일

SyntaxNet 결과의 의미

SyntaxNet의 결과를 머신 러닝으로 통해 어떻게 만들었을까... 분석하려는 사람들은 먼저 tensorflow를 공부해야 하지않을까 생각이 드네요.
그래서, 여기에서는 syntaxnet의 결과를 어떻게 이해해야하는지 고민 해봤습니다.
아래와 같이 실행을 시키면
echo 'I have something to tell you' | syntaxnet/demo.sh

아래와 같은 결과가 나옵니다.
Input: I have something to tell you
Parse:
have VBP ROOT
 +-- I PRP nsubj
 +-- something NN dobj
     +-- tell VB infmod
         +-- to TO aux
         +-- you PRP dobj

VBP,PRP,NN,VB,....
ROOT,nsubj,dobj,infmod,aux.... 등이 나오는데 이게 뭔지 한참 고민해봤습니다.
http://universaldependencies.org/ 여기에서 그답을 찾을 수 있습니다. 이하 UD
VBP,PRP,NN 등은 POS(part-of-speech) tag라고 합니다.
Morphology 형태소 우리가 일반적으로 말하는 말하는 명사, 동사, 형용사와 같은 품사를 말합니다. 하지만 좀더 많습니다.
그렇지만 UD에 있는 POS tag와 google POS tag가 일치하지는 않습니다.
예를들어 UD POS tag 에서 명사는 NOUN 표시하고 있지만, syntaxnet에서는 NN으로 표시하고있습니다. 상위 예제에서는 something이 되겠네요.
그리고 ROOT,nsubj 이런것은 문장 성분이라고 합니다. 우리가 배워왔던 주어, 술어, 목적어... UD 의 dependency항목에서 찾아볼 수 있습니다.
dobj 는 직접 목적어, nsubj 명사주어, infmod ... 이건 뒤져도 안나오는데 아시는 분있으면 제보 좀 해주세요.

universal dependencies 말고 stanford dependencies 도 있습니다.
http://nlp.stanford.edu/software/dependencies_manual.pdf

http://nlp.stanford.edu/software/nndep.shtml


이걸로 뭘할 수 있을까...
어떤 자연어가 주어지면 컴퓨터가 뭐래는거야 parser를 돌리게 되죠.
root부터 분석해보면 have 가진다... 뭘가지지? dobj를 찾게되죠.. something 아하 무언가를 가지게 되군, 누가 가진다는 말이지 궁금하면 nsubj 를 찾아서 보면 되죠 I 음 말하는 사람이 어떤걸 가진다는 말이군,,, 이런식으로 처리가 될겁니다.
이걸 번역에도 이용할 수 있습니다. 해당되는 언어의 뜻의 말을 어순으로 다시 나타내면 번역이 되는 겁니다.

















2016년 9월 4일 일요일

docker를 이용한 syntaxnet 실행기

지난번에 syntaxnet 설치를 Vbox를 이용해서 하다가 망테크를 탄적이 있었습니다.
아래 내용 따라하신분 없기를 바랍니다.
http://swlock.blogspot.kr/2016/08/syntaxnet.html
이후 몇차례 더 시도 하였지만, 메모리 부족, 끊임없는 빌드등 온갖 고생은 모두하면서도 모두 실패로 돌아갔습니다.

결국 다른 방식을 찾아봤습니다.
docker라는 걸로 갈아탔습니다.

처음 docker라는 개념을 보면서 이해가 어려웠습니다.
http://webofthink.tistory.com/64
docker run -p 8888:8888 -p 6006:6006 -it b.gcr.io/tensorflow/tensorflow
http://airpage.org/xe/language_data/20725
docker run -it --name tensorflow-1 b.gcr.io/tensorflow/tensorflow /bin/bash

위에 명령어들을 보면서 python 버전도 확인안하고 뭐 이런게 다있어... 하고 무시했었습니다.
그렇지만, 여기까지 온거 포기할 수 없어서(사실은 syntaxnet을 꼭 실행해보고 싶어서)사용해 보았습니다.
의외로 쉽게된다는 사실을 오늘 알았습니다....
이런 일주일 동안 VBOX로 삽질하던 생각이 나는군요.




1. docker toolbox 설치관련해서는 아래 링크 참고해서 일단 설치하면 됩니다.

vbox를 설치하지 않았다면 설치시 같이 설치하면됩니다.

https://docs.docker.com/toolbox/toolbox_install_windows/#/step-2-install-docker-toolbox

Step 2: Install Docker Toolbox



2. 설치가 완료되면 바탕화면에 "Docker Quickstart Terminal" 이란 제목의 바로가기가 생깁니다. 해당 바로가기를 실행합니다.


3.  Docker Terminal 안에서 아래와 같은 명령을 차례로 줍니다.

$ docker pull brianlow/syntaxnet-docker:latest
$ docker run -it --name syntaxnet-1 brianlow/syntaxnet-docker /bin/bash
한번이라도 위 명령을 쳤다면 아래와 같은 오류가 발생할것입니다.
Error response from daemon: Conflict. The name "/syntaxnet-1" is already in use by container 35ea218488ce6b7dc05257262d6b8a4ae60e36c59bc07d76bf6d784600d31f1e. You have to remove (or rename) that container to be able to reuse that name..
이럴때는 docker rm syntaxnet-1을 해서 컨테이너를 삭제한뒤 위 docker run 을 사용하거나 docker start / attach를 이용하면 됩니다. 아래 참고

$ docker start syntaxnet-1 << 이렇게 입력
syntaxnet-1

$ docker attach syntaxnet-1 << 이렇게 입력 그리고 나서 엔터를 한번 더 칩니다. 연결해서 되는거라 출력이 없으므로 엔터를 보내서 echo가 될 수 있도록 합니다.
root@de214495bd76:~/models/syntaxnet#

4. 제대로 설치가 완료되었으면 실행해 봅니다.

~/models/syntaxnet# echo 'I saw the man with glasses.' | syntaxnet/demo.sh

아래와 같이 나오면 정상적으로 설치된겁니다.





2016년 8월 28일 일요일

SyntaxNet 설치기


일단 참고
http://cpuu.postype.com/post/197684/

SyntaxNet
https://github.com/tensorflow/models/tree/master/syntaxnet

환경 windows10

사전 준비

SyntaxNet 정보로는 아래와 같은것을 설치해아합니다.

Installation

Running and training SyntaxNet models requires building this package from source. You'll need to install:
  • python 2.7:
    • python 3 support is not available yet
  • bazel:
    • versions 0.2.0 - 0.2.2b, NOT 0.2.3
    • follow the instructions here
  • swig:
    • apt-get install swig on Ubuntu
    • brew install swig on OSX
  • protocol buffers, with a version supported by TensorFlow:
    • check your protobuf version with pip freeze | grep protobuf
    • upgrade to a supported version with pip install -U protobuf==3.0.0b2
  • asciitree, to draw parse trees on the console for the demo:
    • pip install asciitree
  • numpy, package for scientific computing:
    • pip install numpy

1. Ubuntu 설치
참고 : https://rorlab.gitbooks.io/railsguidebook/content/appendices/ubuntu14server.html
1.1 VirtualBox 설치
1.1.1 Ubuntu Desktop 다운로드 (16.04 LTS가 최신 이미지이네요.)
http://www.ubuntu.com/download/desktop 에서 iso 이미지 다운받음
1.1.2 VirtualBox에서 Ubuntu 설치
VirtualBox에서 iso 이미를 넣어서 Ubuntu를 설치합니다.


2. python 정보
설치된 ubuntu에서 python -V로 버전 확인이 가능합니다.
다행히 2.7.12 버전이 설치되어있네요.

3. bazel 설치
이건 빌드하는데 도움이 되는거라고 합니다.
설치하는 방법이 좀 까다롭습니다.
아래 링크를 보면 설치방법이 나와있습니다.
https://www.bazel.io/docs/install.html#install-with-installer-ubuntu

1. Install JDK 8 =>Ubuntu 16.04를 설치했기 때문에 아래 사항을 skip해봤습니다.

If you are running Ubuntu Wily (15.10), you can skip this step. But for Ubuntu Trusty (14.04 LTS) users, since OpenJDK 8 is not available on Trusty, please install Oracle JDK 8:
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
Note: You might need to sudo apt-get install software-properties-common if you don't have the add-apt-repository command. Seehere.

2. Add Bazel distribution URI as a package source (one time setup) => 이건 그대로 쳐줬습니다.

$ echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
$ curl https://storage.googleapis.com/bazel-apt/doc/apt-key.pub.gpg | sudo apt-key add -
If you want to use the JDK 7, please replace jdk1.8 with jdk1.7 and if you want to install the testing version of Bazel, replace stablewith testing.

3. Update and install Bazel => 업그레이드를 제외한 부분을 수행했습니다.

$ sudo apt-get update && sudo apt-get install bazel
Once installed, you can upgrade to newer version of Bazel with:
$ sudo apt-get upgrade bazel => 이부분 제외
0.2.0 ~0.2.2 사이 버전을 설치하라고 했는데 설치를 모두 하고 나니 최신 버전으로 설치가 됩니다. 0.3.1
  • versions 0.2.0 - 0.2.2b, NOT 0.2.3

4. swig 설치
apt-get install swig

sudo apt install python-pip

pip freeze | grep protobuf 
8.1.1 나옴
pip install asciitree
pip install numpy

git없으면 설치
sudo apt install git

소스 받기
  git clone --recursive https://github.com/tensorflow/models.git

  cd models/syntaxnet/tensorflow
  ./configure
몇가지 질문이 나오는데 모두 그냥 엔터
  cd ..
  bazel test syntaxnet/... util/utf8/...

VBOX로 빌드하니 한 두시간 이상 시간이 걸리네요

echo 'Bob brought the pizza to Alice.' | syntaxnet/demo.sh
실행했더니 ImportError: No module named _pywrap_tensorflow 에러가 발생하네요

https://github.com/tensorflow/tensorflow/issues/1013

텐서플로 설치 다시 확인
sudo apt-get install python-pip python-dev python-virtualenv
sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl

pip install -U protobuf==3.0.0b2

아래와 같이 해보니 에러가 없습니다. 뭐가 뭔지 모르겠네요
$ python
>>> import tensorflow as tf

bazel 관련 update
$ sudo apt-get update
$ sudo apt-get install bazel=0.2.2
$ sudo apt-get upgrade bazel

rm -rf .cache 삭제후 재빌드
자세히 보니 빌드시 virtual memory 부족으로 에러가 발생하네요

결론 성공 못함.... 따라하지 마세요 ^^