プロレスの熱戦をUMLで図示化したった(概要)


Backgorund

【Qiita x COTOHA APIプレゼント企画】関連の投稿です。

スポーツ記事から選手と技名を抽出してみたで人物と技の名前を抽出したのですが、ここではこの応用でUMLを使って図示化してみようと思います。

アプローチとしてはCOTOHA APIで構文分析かキーワード抽出して選手が何をしているのかを取得し、その後でPlantUMLで図示化する流れです。

土日の休みを少し返上して開発しようとしたのですが(謎の忙しいアピール)、構文分析のレスポンス内にあるラベルを理解するのに時間がかかりそうだったので、ここではスポーツ記事からUMLに図示化する方法のみ着手しました。(単に時間切れ)

Dataset

東京スポーツ
前回と同様です。

【新日1・5東京ドーム】みのる US王座防衛のモクスリー襲撃「誰にケンカ売ってんだ!」

新日本プロレスの年間最大興行「レッスルキングダム14」(5日、東京ドーム)で行われたIWGP・USヘビー級王座戦は、王者ジョン・モクスリー(34)がIWGPタッグ王者のジュース・ロビンソン(30)の挑戦を退け、初防衛に成功した。
 前夜(4日)の東京ドーム大会では、モクスリーがランス・アーチャー(32)から王座を奪回。ジュースはデビッド・フィンレー(26)とのコンビでタッグ王座を獲得した。その翌日に新王者同士の決戦となったが、モクスリーは昨年6月にジュースから同王座を奪っており、前夜のリング上で決着をつけることを宣言していた。
 序盤はジュースが快調に先制したものの、モクスリーは場外でイスを持ち出して背中に一撃。さらにはジュースの額にかみついた。WWE時代に“狂犬”として暴れ回った荒くれ者が、強引にペースを奪い返した。
 ジュースは豪快なハイアングルパワーボムで反撃したが、王者は足4の字固めから鉄柱を使った4の字と意表を突いた攻撃を連発した。挑戦者は雪崩式ブレーンバスターからジャックハマーにジャーマン。モクスリーのデスライダー(ダブルアーム式DDT)をかわして、ラリアートでぶち抜いた。
だが、王者は乱打戦から強烈なランニングニーを一閃。ジュースのパルプフリクションを切り返して、DDTから必殺のデスライダーを炸裂させて12分48秒、3カウントを奪った。
 試合後には入場テーマ曲が流れ、いきなり鈴木みのる(51)が登場。昨年12月8日の広島大会でモスクリーからデスライダーを見舞われており、険しい表情で怒りを隠せない。花道でジャージーを脱いで戦闘態勢に入ると、リング上で王者とエルボーを打ち合った。ド迫力のみのるは裸絞めからゴッチ式パイルドライバーでモクスリーをKOした。
 みのるはマイクを握ると「誰にケンカ売ってんだ、このヤロー! オレはプロレスラーの鈴木みのるだ。こいつのケンカ、オレが買ってやる!」と宣戦布告。US王座を巡る“狂犬”対“性悪男”の抗争勃発で、危険な香りが漂ってきた。
 みのるの話「誰にケンカ売ってんだ、おい。俺は、お前が俺の前に来るのを待ってたんだよ。ジョン・モクスリー…いや、ジョン・ボーイ、心してかかってこい。ぶち殺す」
 ジュースの話「すべてはここで終わりだ。ジョン・モクスリーは今日も俺より強かった。また超えられなかった。今日のことを考えたのは昨日の試合が終わってから。それまでまったく今日の試合のことなんて考えていなかった」

Method

タイトルマッチ名と場所(日程)

スポーツ記事とはいえ、小説や随筆のような自由な記述とは違って形式は決まっていて、大抵はいつどこで誰が対戦したかの内容は1行目に書かれている。
UMLはパッケージを使えば雰囲気が出そうです。

対戦者

対戦者は固有表現抽出(/nlp/v1/ne)で取得できます。
(参照:スポーツ記事から選手と技名を抽出してみた)

懸念点としては過去の対戦で登場するプレイヤーをどのように識別するかです。「獲得した。」「宣言していた。」で過去に行われたとしてこの文章中にのみ出てくるプレイヤーはこのタイトルマッチでは出場していないと判断できそうですが、記事自体過去の時制で書かれているので過去の過去を判別する場合は「前夜(4日)」「昨年6月に」のような日時があるかどうかで判定すればいいかもしれません。
もし判定できたとした場合はリング外で表示できるのが理想です。

前夜(4日)の東京ドーム大会では、モクスリーがランス・アーチャー(32)から王座を奪回。ジュースはデビッド・フィンレー(26)とのコンビでタッグ王座を獲得した。その翌日に新王者同士の決戦となったが、モクスリーは昨年6月にジュースから同王座を奪っており、前夜のリング上で決着をつけることを宣言していた。

クラス名はPlayer1を使わずに直接選手名を書きたいのですが、クラスにリンクさせるスクリプトを書く構造上英数字しか許容しないのでfieldに名前を記載しました。

王座奪回

モクスリーがランス・アーチャー(32)から王座を奪回。

誰かから何かを得る・奪う時は関連クラスを使うといいかもしれんす。

タッグ王座獲得

ジュースはデビッド・フィンレー(26)とのコンビでタッグ王座を獲得した。

何かを得る場合はCompositionを使っています。

背中に一撃

モクスリーは場外でイスを持ち出して背中に一撃。

この表現は少し難しいです。直接クラスにリンクすればいいのですが、選手のどの部位に攻撃したかがわかりにくいです。それで「選手が持っている背中に攻撃した。」として下記の表示にしています。
また、何らかの行為をするごとにクラスの attribute に追加しています。

ハイアングルパワーボムで反撃

ジュースは豪快なハイアングルパワーボムで反撃した

選手に技をかける時はクラスの attribute に技名を追加しつつ、誰が誰に技をかけたかを表示します。

選手コメント

ジュースの話「すべてはここで終わりだ。ジョン・モクスリーは今日も俺より強かった。また超えられなかった。今日のことを考えたのは昨日の試合が終わってから。それまでまったく今日の試合のことなんて考えていなかった」

最後の2~3行で試合後のコメントを書く場合があります。その場合はnoteを吹き出しがわりに使えば良さそうです。

Development

上記のmethodをもとにPlantUMLを使ってスクリプト化しました。

スクリプトコード (クリックするとコードが表示されます。)
@startuml

rectangle "レッスルキングダム14 IWGP・USヘビー級王座戦" {
    frame 東京ドーム {

        class Player1 {
          username = ジョン・モクスリー
          奪回()
          宣言()
          一撃()
          かみつく()
          足4の字固め()
          デスライダー(ダブルアーム式DDT)()
          ランニングニー()
          エルボー()
        }

        class Player2 {
          username = ジュース・ロビンソン
          ハイアングルパワーボム()
          雪崩式ブレーンバスター()
          ジャックハマー()
          ジャーマン()
          ラリアート()
          パルプフリクション()
          エルボー()
        }

        class senaka {
            name = 背中
        }

        class hitai {
            name = 額
        }

        class Player5 {
            username = 鈴木みのる
            エルボー()
            裸絞め()
            ゴッチ式パイルドライバー()
        }

    }
}

class Player3 {
    username = ランス・アーチャー
}

class Player4 {
    username = デビッド・フィンレー
}

class oza {
    name = 王座
}

class tag_oza {
    name = タッグ王座
}


Player1 --> Player3 : 奪回 >
(Player1, Player3) .. oza

Player2 -- Player4
Player2 *- tag_oza
Player4 *- tag_oza

Player1 --> Player2 : 奪回 >
(Player1, Player2) .. oza

Player1 --> senaka : 一撃 >
Player1 --> hitai : かみつく >
Player2 *- senaka
Player2 *- hitai

Player2 --> Player1 : ハイアングルパワーボム >
Player2 --> Player1 : 足4の字固め >
Player2 --> Player1 : 雪崩式ブレーンバスター >
Player2 --> Player1 : ジャックハマー >
Player2 --> Player1 : ジャーマン >
Player2 --> Player1 : ラリアート >

Player1 x-- Player2 : デスライダー(ダブルアーム式DDT) >
Player1 --> Player2 : ランニングニー >
Player2 x-- Player1 : パルプフリクション >
Player1 --> Player2 : デスライダー(ダブルアーム式DDT) >

Player1 --> Player5 : エルボー >
Player5 --> Player1 : エルボー >
Player5 --> Player1 : 裸絞め >
Player5 --> Player1 : ゴッチ式パイルドライバー >

note "すべてはここで終わりだ。\nジョン・モクスリーは今日も俺より強かった。\nまた超えられなかった。\n今日のことを考えたのは昨日の試合が終わってから。\nそれまでまったく今日の試合のことなんて考えていなかった" as N1
note "誰にケンカ売ってんだ、このヤロー! \nオレはプロレスラーの鈴木みのるだ。\nこいつのケンカ、オレが買ってやる!" as N2
note "誰にケンカ売ってんだ、おい。\n俺は、お前が俺の前に来るのを待ってたんだよ。\nジョン・モクスリー…いや、ジョン・ボーイ、心してかかってこい。\nぶち殺す" as N3

Player1 .. N1
Player5 .. N2
Player5 .. N3

@enduml

Figure

もっと見やすくするのにクラスの配置やラインのつなぎ方を最適化した方が良さそうです。出力はデフォルトです。

Future

ここではスポーツ記事からUMLに図示化する方法をまとめてみました。おそらくあと数記事を使って図示化しようとした時に新規で表現方法を考えなければならないパターンがいくつか出てくるかもしれません。次にCOTOHAを使って文章の主従関係を抽出する方法を考える必要があるのですが、構文解析(nlp/v1/parse)のレスポンスには「依存関係ラベル」があるのでこれが使えそうです。


しかしながら、下記の通りパターンが多いです。何回か文章をリクエストしてみてどのラベルが返ってくるかを判別しないと厳しそうです。

依存関係ラベル名称 説明 構文
nsubj 主格で述語に係る名詞句。 空気が美味い 美味い → nsubj 空気
nsubjpass 主格で受身の助動詞を伴う用言に係る名詞句。 希望が託される 託さ → nsubjpass 希望
dobj 目的格で述語に係る名詞句。 手を繋ぐ 繋ぐ → dobj 手
iobj 格助詞「に」を伴うなどして述語に係る名詞句。 花子にあげる あげる → iobj 花子
nmod 「が」「を」「に」以外の格の名詞句や、時相名詞により用言を修飾する場合。 ここで叫ぶ 叫ぶ → nmod ここ
csubj 主語になる名詞節。準体助詞を伴う用言句が主語となる場合。 笑うのが下手 下手 → csubj 笑う
csubjpass 準体助詞を伴う用言句が主語となる場合に、受身の助動詞を伴う用言を修飾する場合。 言ったのが悔やまれる。 悔やま → csubjpass 言っ
ccomp 補文。 甘えたいと思う 思う → ccomp 甘え
advcl 副詞節。主に接続助詞を伴って用言を修飾する節。 平凡だけどそこが良い 良い → advcl 平凡
advmod 副詞による修飾。 絶対許さない 許さ → advmod 絶対
neg 否定語の付与。 絶対許さない 許さ → neg ない
nummod 数量の指定。 3冊の本 冊 → nummod 3
appos 同格の表現。 友達(♀) 友達 → appos ♀
acl 連体修飾節。ただしamodに該当する場合を除く。また「てからの」「ながらの」等の接続表現。 愛を込めたプレゼント プレゼント → acl 込め
amod 形容詞・形状詞・連体詞(DET(この、その、あんな、どんな等)以外)が格を伴わずに名詞を修飾する場合。 偉大な力 力 → amod 偉大
det DET(この、その、あんな、どんな等)による修飾。 この本 本 → det この
compound 名詞と名詞・動詞と動詞の複合。 自覚症状 症状 → compound 自覚
name 固有名詞の複合語。 山田太郎 山田 → name 太郎
conj 並列構造。左側の要素を主辞とする。 アダムとイブ アダム → conj イブ
cc 等位接続詞。 アダムとイブ アダム → cc と
aux 用言につく助動詞や、非自立の補助用言。「か」などの終助詞を含む。 甘えたいと思う 甘え → aux たい
auxpass 受動態で動詞句を形成するために、動詞に接続する助動詞。「れる/られる」。 希望が託される 託さ → auxpass れる
cop コピュラ。 太郎は学生だ。 学生 → cop だ
case 助詞による格の表示。 空気が美味い 空気 → case が
mark 従属接続詞、接続助詞、補文標識の「と」「か」等が付く場合。 笑うのが下手 笑う → mark の
punct 句読点。 食べます。 食べ → punct 。
vocative 呼びかけ。 太郎君、走れ 走る → vocative 君
discourse 談話要素。 あー疲れる 疲れる → discourse あー

PostScript

このコンテンツは実現するのに実感としてボリュームがあります。
いくつかのプロレスの記事からUMLに落とし込むことと記事をCOTOHAで構文分析して特徴を捉えることをしつつ、傾向がつかめたらPlantUMLに記述するスクリプトを書くことまでを全てやるには時間がかかりそうです。
【Qiita x COTOHA APIプレゼント企画】ではできたてのコンテンツかCOTOHA自体の使い方についてのことが多いのですが、サクラダファミリア的に中途半端な状態で書くのもありと思ったので締め切りギリギリに書いてみました

Reference