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