6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

CurlでWatson Relationship Extractionを使ってみる

Last updated at Posted at 2015-08-26

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

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

準備

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

Relationship Extractionサービスの概要

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

watson-icon-relationship-extraction.png

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

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

Bluemixサービスの作成

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

# 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 pushcf bind-serviceを使って、アプリケーションの作成とサービスのバインドを行う必要があります。

CurlによるAPI呼び出し

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

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

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

$ 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によるものとPenn Treebakn Projectによるものの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

# 元の文(最初の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)と呼ばれるものです。

Universal Stanford dependency parse tree

# 元の文(最初の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)であって、たとえばpostponed(0019)とscheduled(0004)の関係はnfincl (動詞節による修飾)だということを表しています。

Dependency parse tree depending on Penn Treebank Project

最後のパースツリーはPenn Treebank Projectで検討されている依存パースツリーです。各記号はPenn Treebank Projectのタグ定義に公開されています。

# 元の文(最初の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の対象語
$ 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の対象語
$ 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の対象語
$ 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を容易に取り出す方法はこれまでありませんでした。たとえば個人のブログなどからこうしたものを抽出することで、ブログの傾向を表すなど、といった使い方ができるかもしれません。

6
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?