CurlでWatson Relationship Extractionを使ってみる

Bluemix上のWatsonにはRelationship Extractionというサービスがあります。これはどのようなサービスでしょうか? 実はこのサービスは、自然言語の文を与えると、文脈依存文法や句構造文法を使ってパースし、その中で言及されている(mention)単語(entity)を抽出し、さらに単語間の関係(relation)を取り出す(extraction)というものです。[IBM Journal of Research and Developmentの記事(有償)](http://ieeexplore.ieee.org/xpl/tocresult.jsp?reload=true&isnumber=6177717)などを見ると、Relation ExtractionはWatsonの中核的な機能を切り出してAPI公開しているもののようです。

現在は英語とスペイン語にしか対応していませんが、今後日本語に対応するとなかなかおもしろいと思いますので、どんなことができるのか見てみましょう。

# 準備

以下は事前に準備されているものとします。

* IBM ID (Bluemixアカウント)
* [Cloud Foundry CLI (cfコマンド)](https://github.com/cloudfoundry/cli/releases)

# Relationship Extractionサービスの概要

Relationship Extractionサービスはダッシュボードでは以下のアイコンで表されています。

![watson-icon-relationship-extraction.png](https://qiita-image-store.s3.amazonaws.com/0/21963/9cb953bc-5b4f-9b8d-570f-735fea91ad06.png)

2015年8月末現在、このサービスはベータ版となっており、プランは無料のみです。

以下のページにて、詳細な説明を見ることができます。

* [ドキュメント](http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/doc/sireapi/)
* [API仕様](http://www.ibm.com/smarterplanet/us/en/ibmwatson/developercloud/apis/#!/relationship-extraction/extract)
* [デモ](http://ibmlaser.mybluemix.net/siredemo.html)


# Bluemixサービスの作成

それでは、サービスを作成してみましょう。この記事ではダッシュボードを使わずにCloud FoundryのCLIを使ってみます。

```console
# cfの接続先としてBluemixを指定
$ cf api https://api.ng.bluemix.net
(ログ省略)

# cfにログイン
$ cf login -u <ユーザ名>
(ログ省略)

# Relationship Extractionサービスを確認
# サービスの名前とプランを確認します
$ cf marketplace | grep relationship
relationship_extraction        relationship_extraction_free_plan                                                                                                                                              Intelligently finds relationships between sentences components (nouns, verbs, subjects, objects, etc.)

# サービスを作成(サービス名: re)
$ cf create-service relationship_extraction relationship_extraction_free_plan re
(ログ省略)

# 資格情報(サービスキー)を作成(資格情報名: re-credentials)
$ cf create-service-key re re-credentials
(ログ省略)

# 資格情報の内容を確認(username, password, urlを含むjsonが返ってきます)
$ cf service-key re re-credentials
Getting key re-credentials for service instance re as <mail-address>...

{
 "password": "<password>",
 "url": "<url>",
 "username": "<username>"
}
```

なお、今回はcurlからAPIをコールするだけですので、アプリケーションを作成せずに資格情報のみを取得しています。Bluemix上でアプリケーションを作成する場合は、`cf push`や`cf bind-service`を使って、アプリケーションの作成とサービスのバインドを行う必要があります。

# CurlによるAPI呼び出し

それでは早速curlからapiを呼び出してみましょう。
パラメータは以下のとおりです。

|パラメータ|パラエータ種別|意味|
|:--|:--|:--|:--|
|sid|クエリ|言語識別子("ie-en-news"または"ie-es-news")。現在は英語かスペイン語のみ。|
|txt|クエリ|対象のテキスト。|
|rt|クエリ|"xml"または"json"|

今回は、英語のテキストで、結果のフォーマットはjsonとします。サンプルテキストはsputniknews.comから[「こうのとり打ち上げ」のニュース](http://sputniknews.com/world/20150819/1025935101.html)をそのままとってきました。([kounotori.txt](https://gist.github.com/blackaplysia/c6a8a52e4d2feeb191e8)) このファイルの中身をAPIに渡し、返ってきたjsonを[kounotori.json](https://gist.github.com/blackaplysia/c885f042b1cf70ad4149)に保存しました。これを整形したものが[kounotori-pp.json](https://gist.github.com/blackaplysia/724ce1fe8f4be2e58577)です。もとのテキストは1Kバイトほどですが、返ってきたjsonは整形すると3,000行にもなっています。

```console
$ curl -s -u "<usename>:<password>" -X POST -F "sid=ie-en-news" -F "txt=$(cat kounotori.txt)" -F "rt=json" "<url>/v1/sire/0" > kounotori.json
$ cat kounotori.json | jq . > kounotori-pp.json
```

# 文の解析

Relationship Extractionのエンジンは依存文法(dependency grammer)と構成文法(constituency grammar)の2通りの分析を行っているようです。前者はさらに、[Stanford Natural Language Processing Group](http://nlp.stanford.edu/software/stanford-dependencies.shtml?cm_mc_uid=19652366171114170486115&cm_mc_sid_50200000=1440139411)によるものと[Penn Treebakn Project](http://www.cis.upenn.edu/~treebank/)によるものの2種類に沿ったパースツリーがあり、合計3種類のパースツリーが結果に含まれています。

* Constituency parse tree: .doc.sents.sent[].parse.text
* Universal Stanford dependency parse tree: .doc.sents.sent[].usd_dependency_parse
* Dependency parse tree depending on Penn Treebank Project: .doc.sents.sent[].dependency_parse

これらはそれぞれツリー構造になっているのですが、このままでは1文字列で表現されており読みにくいので、整形してみましょう。

## Constituency parse tree

```console
# 元の文(最初の1文のみ)
$ cat kounotori.json | jq -r '[ .doc.sents.sent[].text ] | .[0]'
The launch was originally scheduled for Sunday, August 16, but bad weather conditions at the launch site postponed the mission.

# 元データ(最初の1文のみ)
$ cat kounotori.json | jq -r '[ .doc.sents.sent[].parse.text ] | .[0]'
[S [S [NP The_DT launch_NN NP] [VP was_VBD [ADVP originally_RB ADVP] [VP scheduled_VBN [PP for_IN [NP Sunday_NNP NP] PP] VP] VP] S] ,_, [NP August_NNP 16_CD NP] ,_, but_CC [S [NP [NP bad_JJ weather_NN conditions_NNS NP] [PP at_IN [NP the_DT launch_NN site_NN NP] PP] NP] [VP postponed_VBD [NP the_DT mission_NN NP] VP] S] ._. S]

# ツリー構造をインデントに変換して表示(最初の1文のみ)
$ cat kounotori.json | jq -r '[ .doc.sents.sent[].parse.text ] | .[0]' | sed 's/ /\n/g' | awk '/^\[/{e=substr($0,2,length($0)-1);t="("}/\]$/{x--;t=")"}!/^\[/{e=$0}{if(t!=")"){for(i=0;i<x;i++)printf("  ");print(e)}if(t=="(")x++;t="";e=""}'
S
  S
    NP
      The_DT
      launch_NN
    VP
      was_VBD
      ADVP
        originally_RB
      VP
        scheduled_VBN
        PP
          for_IN
          NP
            Sunday_NNP
  ,_,
  NP
    August_NNP
    16_CD
  ,_,
  but_CC
  S
    NP
      NP
        bad_JJ
        weather_NN
        conditions_NNS
      PP
        at_IN
        NP
          the_DT
          launch_NN
          site_NN
    VP
      postponed_VBD
      NP
        the_DT
        mission_NN
  ._.
```

句構造規則に沿ったパースツリーでは、以下のような各構成素からなる木構造を表しています。

* S: 文
* NP: 名詞句
* VP: 動詞句
* PP: 前置詞句
* AP: 形容詞句
* ADVP: 副詞句

また、各単語の後ろに付加されている「DT」「NN」などといった記号は[part-of-speech (POS)タグ](ftp://ftp.cis.upenn.edu/pub/treebank/doc/tagguide.ps.gz)(ftp://ftp.cis.upenn.edu/pub/treebank/doc/tagguide.ps.gz)と呼ばれるものです。

## Universal Stanford dependency parse tree

```console
# 元の文(最初の1文のみ)
$ cat kounotori.json | jq -r '[ .doc.sents.sent[].text ] | .[0]'
The launch was originally scheduled for Sunday, August 16, but bad weather conditions at the launch site postponed the mission.

# 元データ(最初の1文のみ)
$ cat kounotori.json | jq -r '[ .doc.sents.sent[].usd_dependency_parse ] | .[0]'
The DT 1 det launch NN 4 nsubjpass was VBD 4 auxpass originally RB 4 advmod scheduled VBN 19 nfincl for IN 6 case Sunday NNP 4 nmod , , 19 punct August NNP 19 nsubj 16 CD 8 nummod , , 19 punct but CC 19 cc bad JJ 14 amod weather NN 14 compound conditions NNS 19 nsubj at IN 18 case the DT 18 det launch NN 18 compound site NN 14 nmod postponed VBD -1 root the DT 21 det mission NN 19 dobj . . 19 punct

# ツリー構造をインデントに変換して表示(最初の1文のみ)
$ cat kounotori.json | jq -r '[ { begin:.doc.sents.sent[].begin, usd_dependency_parse:.doc.sents.sent[].usd_dependency_parse } ] | .[0] | "^^^^ ^^^^ ^^^^ \(.begin) \(.usd_dependency_parse)"' | sed 's/ /\n/g' | sed 'N;N;N;s/\n/ /g' | awk "BEGIN{$(cat kounotori.json | jq -r '.doc.sents.sent[].tokens.token[] | "\(.text) \(.tid)"' | awk "{t=\$1;if(t==\"\\\"\")t=\"\\\\\\\"\";printf(\"token[%d]=\\\"%04d-%s\\\";\n\",\$2,\$2,t)}") }function e(i){d=\"\$\$\$\$\";print d,d,d,i}NF==4{if(\$1!=\"^^^^\"){if(\$3<0)t=\"\$\$\$-root\";else t=token[\$3+b];printf(\"%s %04d-%s %s %s\n\",t,b+i,\$1,\$2,\$4);i++}else{i=0;if(b>=0)e(b);b=\$4}}END{if(i>0)e(b)}" | awk "function f(x,i){for(s[x]=0;s[x]<n[x];s[x]++){for(k=0;k<i;k++)printf\" \";print r[x,s[x]],l[x,s[x]],g[x,s[x]];f(r[x,s[x]],i+2)}}{if(\$1==\"\$\$\$\$\"){f(\"\$\$\$-root\",0);delete n;delete r;delete l;delete g;delete s;}else{if(n[\$1]==\"\")n[\$1]=0;r[\$1,n[\$1]]=\$2;l[\$1,n[\$1]]=\$3;g[\$1,n[\$1]]=\$4;n[\$1]++}}"
0019-postponed VBD root
  0004-scheduled VBN nfincl
    0001-launch NN nsubjpass
      0000-The DT det
    0002-was VBD auxpass
    0003-originally RB advmod
    0006-Sunday NNP nmod
      0005-for IN case
  0007-, , punct
  0008-August NNP nsubj
    0009-16 CD nummod
  0010-, , punct
  0011-but CC cc
  0014-conditions NNS nsubj
    0012-bad JJ amod
    0013-weather NN compound
    0018-site NN nmod
      0015-at IN case
      0016-the DT det
      0017-launch NN compound
  0021-mission NN dobj
    0020-the DT det
  0022-. . punct
```

依存パースツリーでは、句構造パースツリーのような句がありません。それぞれの単語の後ろについている記号は前述のPOSタグ、行末の記号は上位の単語との文法的関係を表す[Universal Stanford Dependencies (USD)](http://nlp.stanford.edu/pubs/USD_LREC14_paper_camera_ready.pdf)であって、たとえばpostponed(0019)とscheduled(0004)の関係はnfincl (動詞節による修飾)だということを表しています。

## Dependency parse tree depending on Penn Treebank Project

最後のパースツリーはPenn Treebank Projectで検討されている依存パースツリーです。各記号は[Penn Treebank Projectのタグ定義](http://web.mit.edu/6.863/www/PennTreebankTags.html)に公開されています。

```console
# 元の文(最初の1文のみ)
$ cat kounotori.json | jq -r '[ .doc.sents.sent[].text ] | .[0]'
The launch was originally scheduled for Sunday, August 16, but bad weather conditions at the launch site postponed the mission.

# 元データ(最初の1文のみ)
$ cat kounotori.json | jq -r '[ .doc.sents.sent[].dependency_parse ] | .[0]'
The DT 1 -I launch NN 4 NP was VBD 4 -E originally RB 4 ADVP scheduled VBN 19 VP for IN 4 PP Sunday NNP 5 NP , , 19 -E August NNP 19 NP 16 CD 8 -I , , 19 -E but CC 19 -E bad JJ 14 -I weather NN 14 -I conditions NNS 19 NP at IN 14 PP the DT 18 -I launch NN 18 -I site NN 15 NP postponed VBD -1 VP the DT 21 -I mission NN 19 NP . . 19 -E 

# ツリー構造をインデントに変換して表示(最初の1文のみ)
$ cat kounotori.json | jq -r '[ { begin:.doc.sents.sent[].begin, dependency_parse:.doc.sents.sent[].dependency_parse } ] | .[0] | "^^^^ ^^^^ ^^^^ \(.begin) \(.dependency_parse)"' | sed 's/ /\n/g' | sed 'N;N;N;s/\n/ /g' | awk "BEGIN{$(cat kounotori.json | jq -r '.doc.sents.sent[].tokens.token[] | "\(.text) \(.tid)"' | awk "{t=\$1;if(t==\"\\\"\")t=\"\\\\\\\"\";printf(\"token[%d]=\\\"%04d-%s\\\";\n\",\$2,\$2,t)}") }function e(i){d=\"\$\$\$\$\";print d,d,d,i}NF==4{if(\$1!=\"^^^^\"){if(\$3<0)t=\"\$\$\$-root\";else t=token[\$3+b];printf(\"%s %04d-%s %s %s\n\",t,b+i,\$1,\$2,\$4);i++}else{i=0;if(b>=0)e(b);b=\$4}}END{if(i>0)e(b)}" | awk "function f(x,i){for(s[x]=0;s[x]<n[x];s[x]++){for(k=0;k<i;k++)printf\" \";print r[x,s[x]],l[x,s[x]],g[x,s[x]];f(r[x,s[x]],i+2)}}{if(\$1==\"\$\$\$\$\"){f(\"\$\$\$-root\",0);delete n;delete r;delete l;delete g;delete s;}else{if(n[\$1]==\"\")n[\$1]=0;r[\$1,n[\$1]]=\$2;l[\$1,n[\$1]]=\$3;g[\$1,n[\$1]]=\$4;n[\$1]++}}"
0019-postponed VBD VP
  0004-scheduled VBN VP
    0001-launch NN NP
      0000-The DT -I
    0002-was VBD -E
    0003-originally RB ADVP
    0005-for IN PP
      0006-Sunday NNP NP
  0007-, , -E
  0008-August NNP NP
    0009-16 CD -I
  0010-, , -E
  0011-but CC -E
  0014-conditions NNS NP
    0012-bad JJ -I
    0013-weather NN -I
    0015-at IN PP
      0018-site NN NP
        0016-the DT -I
        0017-launch NN -I
  0021-mission NN NP
    0020-the DT -I
  0022-. . -E
```

# Mention、entity、relationの抽出

Relationship Extractionは、これらの文解析をもとにして、文の中で実際に使われている主要な語であるmention、複数のmentionがさしている概念としてのentity、entity間の有意味な関係を表すrelationを抽出しています。
それではこれらをjsonから抜き出してみましょう。

## Mention

以下でmentionを抜き出しています。それぞれの列は以下の意味を示しています。

1. APIが付番したmentionの識別子
2. このmentionにおけるentityのロール
3. Mentionのクラス(SPC:通常の参照、NEG:否定的参照、GEN:その他)
4. Mentionのタイプ(NAM:固有名詞、NOM:名詞、PRO:代名詞、NONE:その他)
5. 確信度スコア
6. Mentionの対象語

```console
$ cat kounotori.json | jq -r '.doc.mentions.mention[] | "\(.mid) \(.role) \(.class) \(.mtype) \(.score) \(.text)"' | awk "{printf\"%s %s %s %s %.2f %s\\n\",\$1,\$2,\$3,\$4,\$5,\$6}"
-M0 DATE SPC NONE 0.94 Sunday
-M1 DATE SPC NONE 0.98 August
-M10 FACILITY SPC NAM 0.87 ISS
-M11 DATE SPC NONE 0.96 Wednesday
-M12 FACILITY SPC NAM 0.66 Tanegashima
-M13 LOCATION SPC NAM 0.54 Japan
-M14 ORGANIZATION SPC NAM 0.44 Space
-M15 ORGANIZATION SPC NAM 0.41 JAXA
-M16 DATE SPC NONE 0.97 Sunday
-M17 DATE SPC NONE 0.99 August
-M18 CARDINAL SPC NONE 0.86 more
-M19 MEASURE SPC NONE 0.34 tons
-M2 PEOPLE SPC NOM 0.37 Japanese
-M20 FACILITY SPC NAM 0.93 ISS
-M21 PEOPLE SPC NOM 0.74 crew
-M22 ORGANIZATION SPC NAM 0.34 Kounotori
-M23 ORGANIZATION SPC NAM 0.50 JAXA
-M24 ORDINAL SPC NONE 0.97 second
-M25 FACILITY SPC NAM 0.95 ISS
-M26 LOCATION SPC NAM 0.83 US
-M27 ORGANIZATION SPC NOM 0.64 company
-M28 ORGANIZATION SPC NAM 0.92 SpaceX
-M29 DATE SPC NONE 0.85 June
-M3 PERSON SPC NAM 0.51 Delay
-M30 DATE SPC NONE 0.71 when
-M31 ORGANIZATION SPC NAM 0.35 Falcon
-M32 WEAPON SPC NOM 0.80 rocket
-M33 DATE SPC NONE 0.97 July
-M34 PEOPLE SPC NAM 0.16 Russian
-M35 FACILITY SPC NAM 0.96 ISS
-M4 ORGANIZATION SPC NAM 0.34 Supply
-M5 FACILITY SPC NAM 0.66 ISS
-M6 LOCATION SPC NAM 0.61 TOKYO
-M7 ORGANIZATION SPC NAM 0.68 Sputnik
-M8 LOCATION SPC NAM 0.42 Japanese
-M9 FACILITY SPC NAM 0.94 International
```

## Entity

以下でentityと、それに関連するmentionを抜き出しています。それぞれの列は以下の意味を示しています。

* Entity
  1. APIが付番したentityの識別子
  2. Entityのタイプ(後述)
  3. Entityのサブタイプ(後述)
  4. Entityのクラス(SPC:通常の参照、NEG:否定的参照、GEN:その他)
  5. Entityのレベル(NAM:固有名詞、NOM:名詞、PRO:代名詞、NONE:その他)
  6. 確信度スコア

* Mention
  1. Mentionの識別子
  2. このmentionにおけるentityのロール(後述)
  3. Mentionのクラス(SPC:通常の参照、NEG:否定的参照、GEN:その他)
  4. Mentionのタイプ(NAM:固有名詞、NOM:名詞、PRO:代名詞、NONE:その他)
  5. Mentionの対象語

```console
$ cat kounotori.json | jq -r '.doc.entities.entity[] | "\(.eid) \(.type) \(.subtype) \(.class) \(.level) \(.score) \(.mentref[].mid)"' | awk "BEGIN{$(cat kounotori.json | jq -r '.doc.mentions.mention[] | "m[\"\(.mid)\"]=\"\(.text)\";mt[\"\(.mid)\"]=\"\(.mtype)\";mc[\"\(.mid)\"]=\"\(.class)\";mr[\"\(.mid)\"]=\"\(.role)\";"')}{if(\$1!=p)printf(\"%s %s %s %s %s %.2f\\n\",\$1,\$2,\$3,\$4,\$5,\$6);print\"  \",\$7,mr[\$7],mc[\$7],mt[\$7],m[\$7];p=\$1}"
-E0 PERSON OTHER SPC NAM 1.00
   -M3 PERSON SPC NAM Delay Japan Launch
-E1 ORGANIZATION OTHER SPC NAM 1.00
   -M4 ORGANIZATION SPC NAM Supply Mission
-E10 ORGANIZATION COMMERCIAL SPC NAM 0.52
   -M28 ORGANIZATION SPC NAM SpaceX
   -M27 ORGANIZATION SPC NOM company
-E11 ORGANIZATION COMMERCIAL SPC NAM 0.29
   -M31 ORGANIZATION SPC NAM Falcon 9
-E12 GPE COUNTRY SPC NAM 0.30
   -M34 PEOPLE SPC NAM Russian
-E13 GPE COUNTRY SPC NOM 0.30
   -M2 PEOPLE SPC NOM Japanese
-E14 PEOPLE OTHER SPC NOM 1.00
   -M21 PEOPLE SPC NOM crew members
-E15 WEAPON OTHER SPC NOM 1.00
   -M32 WEAPON SPC NOM rocket
-E16 DATE OTHER SPC NONE 0.51
   -M0 DATE SPC NONE Sunday
   -M1 DATE SPC NONE August 16
-E17 DATE OTHER SPC NONE 0.30
   -M11 DATE SPC NONE Wednesday
-E18 DATE OTHER SPC NONE 0.28
   -M16 DATE SPC NONE Sunday
   -M17 DATE SPC NONE August 16
-E19 CARDINAL OTHER SPC NONE 1.00
   -M18 CARDINAL SPC NONE more than 4.5
-E2 FACILITY OTHER SPC NAM 0.94
   -M5 FACILITY SPC NAM ISS
   -M9 FACILITY SPC NAM International Space Station
   -M10 FACILITY SPC NAM ISS
   -M20 FACILITY SPC NAM ISS
   -M25 FACILITY SPC NAM ISS
   -M35 FACILITY SPC NAM ISS
-E20 ORDINAL OTHER SPC NONE 1.00
   -M24 ORDINAL SPC NONE second
-E21 DATE OTHER SPC NONE 0.28
   -M29 DATE SPC NONE June
   -M30 DATE SPC NONE when
-E22 DATE OTHER SPC NONE 0.30
   -M33 DATE SPC NONE July
-E23 MEASURE OTHER SPC NONE 2.72
   -M19 MEASURE SPC NONE tons
-E3 GPE OTHER SPC NAM 1.00
   -M6 LOCATION SPC NAM TOKYO
-E4 ORGANIZATION COMMERCIAL SPC NAM 1.00
   -M7 ORGANIZATION SPC NAM Sputnik
-E5 GPE COUNTRY SPC NAM 0.98
   -M8 LOCATION SPC NAM Japanese
   -M13 LOCATION SPC NAM Japan
-E6 FACILITY OTHER SPC NAM 0.30
   -M12 FACILITY SPC NAM Tanegashima Space Center
-E7 ORGANIZATION GOVERNMENT SPC NAM 1.00
   -M14 ORGANIZATION SPC NAM Space Agency
   -M15 ORGANIZATION SPC NAM JAXA
   -M23 ORGANIZATION SPC NAM JAXA
-E8 ORGANIZATION OTHER SPC NAM 0.29
   -M22 ORGANIZATION SPC NAM Kounotori cargo vessel
-E9 GPE COUNTRY SPC NAM 0.30
   -M26 LOCATION SPC NAM US
```

### Entityのタイプ、サブタイプとmentionにおけるロール

Entityにはその意味分類としてのタイプ、サブタイプがあります。また、mentionにおいて依存する文脈を示すロールもあります。たとえば上記の例で、`-E9`というエンティティは米国を表す地政学的な概念ですが、文中「since the **US** company SpaceX's failed attempt in June〜」の文脈では、組織(政府)や米国人ではなく、場所としての米国を表している、ということになります。

|Entityのタイプ|Entityのサブタイプ|Mentionのロール|意味|
|:--|:--|:--|:--|
|AGE|None|PERSON|年齢|
|ANIMAL|None|PEOPLE, PERSON, PERSONPEOPLE|現実または想像上の動物|
|AWARD|None|EVENT_PERFORMANCE, PERSON|授与または表彰|
|CARDINAL|None|AGE, DATE, DURATION, ORDINAL, PERCENT, TIME以外|単位のない数|
|DATE|None|RATE|日時および時間|
|DEGREE|None|PERSON|学位|
|DISEASE|None|None|病気、病状、アレルギー|
|DURATION|None|RATE|期間|
|EMAIL|None|None|Eメールアドレス|
|EVENT|None|None|過去、現在、未来に発生する事象(event)一般|
|EVENT_AWARD|None|None|表彰、学位授与などの事象|
|EVENT_BUSINESS|None|None|組織における利益または損失の発生事象|
|EVENT_COMMUNICATION|None|None|言語を通じて考えを伝える意図的な行為|
|EVENT_CRIME|None|None|法律違反および過失に関する行為|
|EVENT_CUSTODY|None|None|逮捕、投獄、釈放、脱獄などの行為|
|EVENT_DEATH|None|None|人の死|
|EVENT_DEMONSTRATION|None|None|何かを訴えるための会合や行進|
|EVENT_DISASTER|None|None|交通事故や自然災害、伝染病など、負傷をともなう偶発的事象|
|EVENT_EDUCATION|None|None|教育や訓練を受けること|
|EVENT_ELECTION|None|None|政治的またはそれ以外の選挙|
|EVENT_GATHERING|None|None|社会的な目的のため意図的、物理的、同時に複数の人々を集めること
|EVENT_LEGAL|None|None|違法行為の可能性のある事象|
|EVENT_LEGISLATION|None|None|法律や法案、政策の作成、可決、署名|
|EVENT_MEETING|None|None|複数の人々が同時に言語によって情報交換をする集まり|
|EVENT_PERFORMANCE|None|None|聴衆の前で行うセレモニーやパフォーマンス|
|EVENT_PERSONNEL|None|None|役職変更や部署変更などを含む、雇用に関する変化|
|EVENT_SPORTS|None|AWARD|スポーツに関する事象|
|EVENT_VIOLENCE|None|None|人類や組織による物理的または軍隊的な戦闘|
|FACILITY|None|ORGANIZATION|人工構造物|
|FOOD|None|PRODUCT|飲食物|
|GEOLOGICALOBJ|None|None|海、湖沼、河川、島、山脈、惑星などの地図上の物体|
|GPE|AREA, COUNTRY, UNSPECIFIED|LOCATION, ORGANIZATION, PEOPLE, PERSON, PERSONPEOPLE|大陸、国家、政府、国民などの地政学的対象|
|IDEOLOGY|None|None|政治、経済、信仰、哲学的な信念|
|LAW|None|None|法律|
|LOCATION|None|None|地理的な場所|
|MEASURE|None|None|計測単位|
|MONEY|GAINLOSS, UNSPECIFIED, WORTH|AWARD|金銭および金銭的価値|
|ORDINAL|None|AGE, CARDINAL, DATE, DURATION, ORDINAL, PERCENT, TIME以外|序数|
|ORGAN|None|None|人や動物の体組織|
|ORGANIZATION|COMMERCIAL, EDUCATIONAL, GOVERNMENT, MILITARY, MULTIGOV, POLITICAL, RELIGIOUS, SPORTS, UNSPECIFIED|FACILITY, PRODUCT, TICKER, TITLEWORK|GPEに含まれる以外の階層的社会構造|
|PEOPLE|None|OCCUPATION|GPEに含まれる以外の人々の集合|
|PERCENT|None|AGE, CARDINAL, DATE, DURATION, ORDINAL, PERCENT, TIME以外|百分率|
|PERSON|None|OCCUPATION|現実または想像上の個人|
|PERSONPEOPLE|None|OCCUPATION|PERSONやPEOPLEに似ているが人数が明確でないもの|
|PHONE|FAX|None|電話番号|
|PLANT|None|SUBSTANCE|植物|
|PRODUCT|None|None|名前のある物体|
|SUBSTANCE|None|PRODUCT, WEAPON|薬物、化学物質、体液、転園の物質など|
|TICKER|None|None|株式市場における企業の識別符号(ティッカーシンボル)|
|TIME|None|RATE|時刻|
|TITLEWORK|PUBLICATION|None|出版物、歌、映像、芸術的表現や主観的意見などを表す文書|
|VEHICLE|None|PRODUCT, WEAPON|輸送のための物理的かつ人工的な媒体|
|WEAPON|None|None|人や構造物に対して物理的に危害を加えたり破壊するための媒体|
|WEATHER|None|None|災害以外の気象条件|
|WEB|None|ORGANIZATION|ウェブサイトアドレス|

## Relation

最後に、relationを抜き出します。それぞれの列は以下の意味を示しています。

* Relation
  1. APIが付番したrelationの識別子
  2. Relationのタイプ(後述)
  3. Relationのサブタイプ(後述)
  4. Relationのクラス(SPECIFIC:特定事物間関係、NEG:否定的関係、OTHER:その他)
  5. Relationのモダリティ(ASSERTED:現実に存在すると考えられる事物間関係、OTHER:その他)
  6. Relationの時制(PAST:過去、PRESENT:現在、FUTURE:未来、UNSPECIFIED:不明または時制なし)

* Mention
  1. Mentionの識別子
  2. このmentionにおけるentityのロール(後述)
  3. Mentionのクラス(SPC:通常の参照、NEG:否定的参照、GEN:その他)
  4. Mentionのタイプ(NAM:固有名詞、NOM:名詞、PRO:代名詞、NONE:その他)
  5. Mentionの対象語

```console
$ cat kounotori.json | jq -r '.doc.relations.relation[] | { rid, type, subtype, m:.relmentions.relmention[] } | { rid, type, subtype, mclass:.m.class, mmodality:.m.modality, mtense:.m.tense, mf:.m.rel_mention_arg[0].mid, ms:.m.rel_mention_arg[1].mid } | "\(.rid) \(.type) \(.subtype) \(.mclass) \(.mmodality) \(.mtense) \(.mf) \(.ms)"' | awk "BEGIN{$(cat kounotori.json | jq -r '.doc.mentions.mention[] | "m[\"\(.mid)\"]=\"\(.text)\";mt[\"\(.mid)\"]=\"\(.mtype)\";mc[\"\(.mid)\"]=\"\(.class)\";mr[\"\(.mid)\"]=\"\(.role)\";ms[\"\(.mid)\"]=\"\(.score)\";"')}{print\$1,\$2,\$3,\$4,\$5,\$6;print\"  (1)\",\$7,mr[\$7],mc[\$7],mt[\$7],m[\$7];print\"  (2)\",\$8,mr[\$8],mc[\$8],mt[\$8],m[\$8]}"
-R1 employedBy OTHER SPECIFIC ASSERTED UNSPECIFIED
  (1) -M3 PERSON SPC NAM Delay Japan Launch
  (2) -M4 ORGANIZATION SPC NAM Supply Mission
-R2 locatedAt OTHER SPECIFIC ASSERTED UNSPECIFIED
  (1) -M5 FACILITY SPC NAM ISS
  (2) -M6 LOCATION SPC NAM TOKYO
-R3 basedIn OTHER SPECIFIC ASSERTED UNSPECIFIED
  (1) -M14 ORGANIZATION SPC NAM Space Agency
  (2) -M13 LOCATION SPC NAM Japan
-R4 locatedAt OTHER SPECIFIC ASSERTED UNSPECIFIED
  (1) -M21 PEOPLE SPC NOM crew members
  (2) -M20 FACILITY SPC NAM ISS
-R5 basedIn OTHER SPECIFIC ASSERTED UNSPECIFIED
  (1) -M27 ORGANIZATION SPC NOM company
  (2) -M26 LOCATION SPC NAM US
```

### Relationのタイプとサブタイプ

Relationにもタイプとサブタイプがあります。これらは2つのmention(あるいはそれが表すentity)が具体的にどのような関係を持ってるのかを示すもので、以下のいずれかになっています。なお、サブタイプは現在timeOfのみに設定されるということのようです。

|Relationのタイプ|意味|
|:--|:--|
|affectedBy|事象によって明確な影響を受けた|
|affiliatedWith|提携関係がある|
|ageOf|年齢|
|agentOf|事象に対して最重要な役割を果たしている|
|authorOf|TITLWORKの著者|
|awardedBy|AWARDやDEGREEを授けられた|
|awardedTo|AWARDやDEGREEを授けた|
|basedIn|ORGANIZATIONが本来あるべき場所|
|before|時間的な前後関係|
|bornAt|人や動物が生まれた場所|
|bornOn|人や動物が生まれた日時|
|capitalOf|国家、州、郡などの首都、中心地|
|citizenOf|GPEの市民である|
|clientOf|ビジネスの顧客である|
|colleague|同じ組織に所属している|
|competitor|GPEまたはORGANIZATIONが経済的な競争関係にある|
|contactOf|接点や交流がある|
|diedAt|人や動物が死んだ場所|
|diedOf|人や動物が死んだ理由|
|diedOn|人や動物が死んだ日時|
|dissolvedOn|関係を解消した日時|
|educatedAt|人がORGANIZATIONで教育を受けた|
|employedBy|雇用されている|
|foundedOn|設立された日時|
|founderOf|設立した|
|hasDisease|DISEASEにかかっている|
|hasMoney|MONEYをもっている|
|instrumentOf|兵器などの事物が事象を引き起こす|
|locatedAt|事物が存在する物理的な場所|
|managerOf|仕事の管理者である|
|measureOf|高さや重さなどのMEASUREである|
|memberOf|所属している|
|near|近くにいる|
|overlaps|時間的に重なっている|
|ownerOf|永続的あるいは一時的な所有者である|
|parentOf|親である|
|participantIn|参加する|
|partner|GPEやORGANIZATIONが経済的に協調している|
|partOf|包含されている|
|partOfMany|包含されている(複数形)|
|playsRoleOf|パフォーマンスで演じている|
|populationOf|CARDINALが人口を表している|
|productOf|PRODUCTやTITLEWORKを製作したORGANIZATIONである|
|quantityOf|CARDINALだけの量がある|
|rateOf|RATEの発生頻度である|
|relative|親類である|
|residesIn|永続的に居住している|
|shareholdersOf|株主である|
|siblingOf|兄弟姉妹である|
|spokespersonFor|代表者である|
|spouseOf|配偶者である|
|subsidiaryOf|子会社組織である|
|timeOf|事象やTITLEWORKやLAWなどに関連するDATE、TIME、DURATIONである|

# Relationship Extractionの解析結果は何を表現しているのか

たとえば、上記の例のうち`-R10`では、`-M27`つまり*company*は`-M26`つまり*US*にある**ORGANIZATION**であることがわかります。さらに、Entityの一覧を参照すると、`-M27`が指す概念は`-E10`であり、entityタイプは**ORGANIZATIOIN:COMMERCIAL**つまり営利企業であることがわかります。また、この概念を表現しているmentionのうちmentionタイプが**NAM**である`-M28`を見ると、実際にはこれは*SpaceX*という企業のことを指していることがわかります。同様に、`-M26`が指す概念は`-E9`であり、entityタイプは**GPE:COUNTRY**つまり国家です。つまり、元の文を解析した結果の一部として、`-R10`は「*営利企業であるSpaceXは米国を本拠地とする企業である*」あるいは元記事が「*米国を本拠地とする企業である営利企業SpaceXについて言及している*」ことがわかります。

# まとめ

Relationship Extractionを使うと、文の構造から概念を抽出することができます。ここで実施している解析は自然言語処理としては古典的な方法に属する部類だと思いますが、ここでいうmention、entity、relationを容易に取り出す方法はこれまでありませんでした。たとえば個人のブログなどからこうしたものを抽出することで、ブログの傾向を表すなど、といった使い方ができるかもしれません。