2018年5月11日金曜日

AMRについて

Abstract Meaning Representation
のことですが、
NLPをやっている人は皆が知っている技術と推察しますが、
今日まで知りませんでした。

どうやら色々な事情があるようです。

Ontology,WordNet,Word2Vecの順で自然言語の
概念が進化してきていますが、
本当はAMRはここの仲間として登場するべきものでした。
2013に登場したようなので、
Word2Vecと同時期に注目される技術だと勝手に考えます。

AMRとは、
自然言語の意味を中心に、
中間言語AMR(あらかじめ用意されたノードタグ)に変換して使う規格で、
単語を有向非巡回ノードに変換できる情報を持ちます。
予め意味を人間が定義したもので構成されているので、
このノードに落とし込めば、
自動的に意味が取り出せる仕組みになっていると思います。
パーサーもあるようです。
現実の翻訳ツールとして使う場合は、
欠点があり同じ単語が出現した場合は、
弱いようで複雑な文にも対応ができないようです。

概念は理解できるので、
何か体験できるツールがないか探したところ、
JAMRというツール群がありました。

JAVAで動作させるようで、
とはいってもScalaもついてきます。
巨大6GBもあるモデルをダウンロードしてから起動してみましたが、

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
        at edu.cmu.lti.nlp.amr.AMRParser$$anonfun$main$3.apply(AMRParser.scala:358)
        at edu.cmu.lti.nlp.amr.AMRParser$$anonfun$main$3.apply(AMRParser.scala:211)
        at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:772)
        at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
        at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:108)
        at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:771)
        at edu.cmu.lti.nlp.amr.AMRParser$.main(AMRParser.scala:211)
        at edu.cmu.lti.nlp.amr.AMRParser.main(AMRParser.scala)
でエラーファイルに怒られました。
ここではこれ以上調査しないことにします。

他にもサイトを調べました。
1.日本ではT大ともう一つの大学で論文が数件あるようです。
2.2014年から2017年までの結構多数論文が出ている。
3.大量のモデルが定義されている。多分英語はほとんど網羅しているのでは?
4.理論的には面白いし、地道な技術であると思った。
5.モデルの内容を確認したところ、RDFのコア+実例のような、意味ノードの辞書のような感じを受けた。

何やら残念な結果に終わりましたが、
Word2Vecで体験したインパクトはなさそうです。
NLPとして使うには、
少し問題があり、
意味を中心においているので、
表現できない部分があるようです。

とはいえ、
PropBankを継承した考え方である、
AMRはしっかりした理論的基盤の元に規格化されたものなので、
今後もNLPへの貢献を期待できる技術だと思う。