Mac OSでccg2lambdaとJiggを動かす
動作環境_
- Mac OS 10.15 Catalina
事前準備_
CCG2Lambdaのインストール_
Python3ライブラリ以外のものをインストールする。
% brew install python3 % which python3 /usr/local/bin/python3 % python3 --version Python 3.9.0 % brew install libxml2 % brew install libxslt % echo 'export PATH="/usr/local/opt/libxslt/bin:$PATH"' >> ~/.zshrc % source ~/.zshrc
リポジトリをクローンする。
% cd % git clone https://github.com/mynlp/ccg2lambda.git my_ccg2lambda % cd ccg2lambda
Pythonの仮想環境venv上にpipでライブラリーをインストールする。
% python3 -m venv py3 % source py3/bin/activate % which python /Users/gotoh/my_ccg2lambda/py3/bin/python % which pip /Users/gotoh/my_ccg2lambda/py3/bin/pip % pip install lxml simplejson pyyaml -I nltk==3.0.5 % python -c "import nltk; nltk.download('wordnet')"
動作確認をする。
% python scripts/run_tests.py test_func_application_backward (ccg2lambda_tools_test.AssignSemanticsToCCGTestCase) ... ok 〜省略〜 Ran 162 tests in 2.085s OK (expected failures=3)
Jiggのインストール_
Javaのインストール_
先にopenjdkをインストールする。
% brew install openjdk % echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc % source ~/.zshrc % which java % /usr/local/opt/openjdk/bin/java
Jigg 0.8.0_
Jiggのバージョン8をダウンロード
% pwd /Users/gotoh/my_ccg2lambda % cd ja % wget https://github.com/mynlp/jigg/releases/download/v-0.8.0/jigg-0.8.0.zip % unzip jigg-0.8.0.zip % cd jigg-0.8.0
jigg_location.txtを作成する。
% echo `pwd` > ../jigg_location.txt
動作確認をする。
% java -cp "*" jigg.pipeline.Pipeline -annotators "corenlp[tokenize,ssplit],berkeleyparser" [main] INFO edu.stanford.nlp.pipeline.StanfordCoreNLP - Adding annotator tokenize [main] INFO edu.stanford.nlp.pipeline.TokenizerAnnotator - No tokenizer type provided. Defaulting to PTBTokenizer. [main] INFO edu.stanford.nlp.pipeline.StanfordCoreNLP - Adding annotator ssplit Loading berkeleyparser model from jigg-models/berkeleyparser/eng_sm6.gr ... done [1.2 sec] > テレビで自転車で走っている少女を見た! <root> <document id="d0"> <sentences> <sentence id="s0" characterOffsetBegin="0" characterOffsetEnd="19"> テレビで自転車で走っている少女を見た! <tokens annotators="corenlp berkeleyparser"> <token pos="SYM" characterOffsetEnd="18" characterOffsetBegin="0" id="t0" form="テレビで自転車で走っている少女を見た"/> <token pos="NN" characterOffsetEnd="19" characterOffsetBegin="18" id="t1" form="!"/> </tokens> <parse annotators="berkeleyparser" root="s0_berksp0"> <span id="s0_berksp0" symbol="FRAG" children="s0_berksp1 s0_berksp2"/> <span id="s0_berksp1" symbol="X" children="t0"/> <span id="s0_berksp2" symbol="NP" children="t1"/> </parse> </sentence> </sentences> </document> </root> > 「Ctrl-Dで終了」
Jigg 0.4_
ccg2lambdaにバンドルされているのはバージョン0.4。
% cd ~/my_ccg2lambda % ./ja/download_dependencies.sh
ccg2lambdaを用いた文間の含意関係の認識_
作業ディレクトリと例文を用意する。
% cd ~/my_ccg2labmda % mkdir -p sandbox % cd sandbox % echo "東京は晴れです。 京都はどうですか。" > sample.txt % cp ../coqlib.v .
jiggを用いて解析ファイルを生成する。
(Jigg 0.8.0の場合) % java -cp "../ja/jigg-0.8.0/*" jigg.pipeline.Pipeline -file sample.txt -output sentences-0.8.0.xml -annotators "ssplit,kuromoji,jaccg" Annotating sample.txt with ssplit, kuromoji, jaccg { Loading parser model in jigg-models/jaccg/parser/beam=64.ser.gz ...done [3.9 sec] ssplit: [0.0 sec] kuromoji: [0.1 sec] jaccg: [0.2 sec] } [4.6 sec] Writing to sentences.xml... done [0.1 sec] (Jigg 0.4.0の場合) % java -cp "../ja/jigg-v-0.4/jar/*" jigg.pipeline.Pipeline -file sample.txt -output sentences-0.4.0.xml -annotators "ssplit,kuromoji,ccg" Annotating sample.txt with ssplit, kuromoji, ccg { The path of CCG parser model: Search for model: ccg-models/parser/beam=64.ser.gz Loading supertagger ...done [2.9 sec] Loading feature weights of CCG parser ...done [0.4 sec] ssplit: [0.0 sec] kuromoji: [0.0 sec] ccg: [0.3 sec] } [4.7 sec] Writing to sentences-0.4.0.xml... done [0.1 sec]
Jigg 0.4とJigg 0.8では出力が微妙に異なっている。
% diff sentences-0.4.0.xml sentences-0.8.0.xml
意味解析(?)を行う。なお、私の環境では「--ncores=1」として逐次処理をするように指定しないとエラーで動かない。Jigg 0.8.0の出力結果の場合はエラーがでる。たぶん、YAMLファイルの定義と対応していない。
(Jigg 0.4の出力結果の処理) % python ../scripts/semparse.py --ncores=1 sentences-0.4.0.xml ../ja/semantic_templates_ja_emnlp2016.yaml sentences.sem-0.4.0.xml 〜出力省略〜 (Jigg 0.8の出力結果の処理) % python ../scripts/semparse.py --ncores=1 sentences-0.8.0.xml ../ja/semantic_templates_ja_emnlp2016.yaml sentences.sem-0.8.0.xml /Users/gotoh/my_ccg2lambda/scripts/semantic_index.py:140: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. loaded = yaml.load(infile) ERROR:root:An error occurred: 'category' Sentence: Tree XML: <sentence characterOffsetEnd="8" characterOffsetBegin="0" id="s0"> 東京は晴れです。 〜出力省略〜 </sentence> ERROR:root:An error occurred: 'category' Sentence: Tree XML: <sentence characterOffsetEnd="18" characterOffsetBegin="9" id="s1"> 京都はどうですか。 〜出力省略〜
構文木を可視化する。Jigg 0.8.0の出力結果はエラーがでて可視化できない。生成されたHTMLファイルはブラウザで閲覧できる。
% python ../scripts/visualize.py sentences-0.4.0.xml > sentences-0.4.0.html
なお、Pythonのバージョンアップに伴い以下の2つのファイルについて修正が必要となっている(Python 3.9では動かなかった)。
- scripts/utils.py中の「time.clock()」を「time.process_time()」に変更。
- scripts/visualization_tools.py中の「cgi」を「html」に変更。
含意・矛盾関係認識を行う。Jigg 0.8.0の出力結果はエラーがでて処理できない。
% python ../scripts/prove.py sentences.sem-0.4.0.xml --graph_out graphdebug-0.4.0.html WARNING:root:Requested gold_tree has a failed semantic parse: {'id': 's0'} {'status': 'failed'} WARNING:root:Cartesian product of semantic interpretations exhausted with i == 0 unknown