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

# Backgorund
[【Qiita x COTOHA APIプレゼント企画】](https://zine.qiita.com/event/collaboration-cotoha-api/?utm_source=qiita&utm_medium=article_banner)関連の投稿です。

[スポーツ記事から選手と技名を抽出してみた](https://qiita.com/satsukiya/items/c7b96765ccf8cb5c5d69)で人物と技の名前を抽出したのですが、ここではこの応用でUMLを使って図示化してみようと思います。

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

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


# Dataset
[東京スポーツ](https://www.tokyo-sports.co.jp/)
前回と同様です。

##### 【新日１・５東京ドーム】みのる　ＵＳ王座防衛のモクスリー襲撃「誰にケンカ売ってんだ！」
https://www.tokyo-sports.co.jp/prores/njpw/1682622/

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

# Method

### タイトルマッチ名と場所（日程）

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

![ground.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/712013b6-bf49-a714-9178-9d5e715b5b02.png)

### 対戦者

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

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

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

![player.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/917d4c38-38fb-364d-54f4-4c024ffe1c70.png)

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

### 王座奪回

```
モクスリーがランス・アーチャー（３２）から王座を奪回。
```

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

![rob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/054d4b22-d50e-d13c-b5f8-939bdabf840e.png)

### タッグ王座獲得

```
ジュースはデビッド・フィンレー（２６）とのコンビでタッグ王座を獲得した。
```

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

![rob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/177b2e60-c226-2a51-3107-8c637dcde748.png)

### 背中に一撃

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

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

![rob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/ca33a7c9-a9a2-0728-a6ce-e39c84ef4fb7.png)

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

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

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

![rob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/dd63902a-7220-f7a8-25a5-4f80942575f9.png)

### 選手コメント

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

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

![rob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/edd61acb-7c69-b5c4-cf98-0e15ebc41e79.png)


# Development

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

<details > <summary> <font color="Brown">**スクリプトコード** (クリックするとコードが表示されます。) </font> </summary><div>

```
@startuml

rectangle "レッスルキングダム１４ ＩＷＧＰ・ＵＳヘビー級王座戦" {
	frame 東京ドーム {

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

		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 : 足４の字固め >
Player2 --> Player1 : 雪崩式ブレーンバスター >
Player2 --> Player1 : ジャックハマー >
Player2 --> Player1 : ジャーマン >
Player2 --> Player1 : ラリアート >

Player1 x-- Player2 : デスライダー（ダブルアーム式ＤＤＴ） >
Player1 --> Player2 : ランニングニー >
Player2 x-- Player1 : パルプフリクション >
Player1 --> Player2 : デスライダー（ダブルアーム式ＤＤＴ） >

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

```

</div></details>

# Figure

![battle1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/288206/c2eecada-ff1a-443e-8240-e1edcbb8db9a.png)

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


# Future

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

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

| 依存関係ラベル名称 | 説明 | 例 | 構文 |
|:--|:--|:--|:--|
| 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プレゼント企画】](https://zine.qiita.com/event/collaboration-cotoha-api/?utm_source=qiita&utm_medium=article_banner)ではできたてのコンテンツかCOTOHA自体の使い方についてのことが多いのですが、サクラダファミリア的に中途半端な状態で書くのもありと思ったので締め切りギリギリに書いてみました:sweat:


# Reference

- PlantUML
    - [PlantUML Cheat Sheet](https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48)
    - [PlantUMLをMac OS Xで使う](https://qiita.com/kohashi/items/1d2c6e859eeac72ed926)
    - [PlantUML を使った UML の描き方](http://pdf.plantuml.net/PlantUML_Language_Reference_Guide_ja.pdf)
- 自然言語処理学会(NLP)
    - [語彙概念構造のオブジェクト指向化について](https://anlp.jp/proceedings/annual_meeting/2014/pdf_dir/B1-1.pdf)
    - [UML Action Language を用いた意味構造䛾記述について](https://www.jstage.jst.go.jp/article/pjsai/JSAI2015/0/JSAI2015_2F4OS01a4/_pdf)