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