ELANの注釈層に階層構造を持たせる（言語タイプとステレオタイプの設定）

# はじめに
この記事の対象読者は、音声ファイルに対してELANを用いてアノテーションを行いたい言語学者である。ELANでは、テキストに対して以下のような階層構造を設定することができる。
```
例文番号
    ├ 文の音韻表記
    │  └ 形態素
    │   　　　└ グロス
    └ 訳
```
この記事では、注釈層に言語タイプと呼ばれる特性を設定することで注釈層同士の階層構造を明確にし、複雑なアノテーションを行う方法を解説する。

以下では、
1. 注釈層の雛形（=言語タイプ）を作成する
1. 雛形に沿って注釈層を作り、階層関係を設定する
1. 注釈層のセットをコピーすることで話者を追加する
1. 階層構造をテンプレートとして保存する
 
という四段階の解説を行う。


ファイルの作成方法や基本的な操作については fmfm_mdk氏による[アノテーションツールELANの使い方](https://qiita.com/fmfm_mdk/items/26ac2faee84b308d5d6a)、弊YouTubeチャンネルで木本幸憲氏をお招きして作成した [ELAN講習会](https://www.youtube.com/live/a4SqxhLGn5Q?si=aW_e0HpTKLW02XEC)、ELAN公式による[ELAN documents](https://www.mpi.nl/tools/elan/docs/manual/Ch_ELAN_documents.html)などをご覧いただきたい（尤も、公式ドキュメントを読めるならこの記事を読む必要はない）。


# 注釈層/tierとは

ELANの入力画面で横方向に伸びた帯のことを「`注釈層/tier`」という。注釈層に入力されるテキストのことを「`注釈/annotation`」という。基本的に、一つの注釈層には1種類の情報だけを入力する。例えば、`translation@Yamada`という注釈層には、Yamadaさんの発話に対する訳のみを入力するべきで、それ以外の情報（例えば、備考や他の話者の発話）を入力するべきではない。もし発話に対する備考を書きたい場合、`note@Yamada`などという注釈層を新たに作成して記入する。

![スクリーンショット 2023-10-20 22.09.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573180/acf0c24f-da81-0fd9-d559-48d43119d3a0.png)


# 言語タイプの設定と新規注釈層の追加
:::note info
3つの言語タイプと3つの注釈層を作成する
:::

「`言語タイプ/linguistic type`」とは、注釈層を新規作成する際に選択できる、注釈層の雛形である。言語タイプを適切に設定することによって、新規作成する注釈層がどのような性質を持つのかを指定できる[^1]。ここでは、新規言語タイプの追加・設定方法を解説する。

[^1]: 「言語タイプ」というとあたかも孤立語、膠着語、屈折語…のような言語の類型を想起してしまうが、原語のlinguistic type から考えるに、「当該の注釈層の言語学的な性質（glossの層には必ず対応する形態素の層が必要、など）」というような意味だろう。

### 言語タイプの追加

ツールバーの「`言語タイプ`」→「`新規言語タイプの追加`」を選択する。デフォルトでは`default-lt`というタイプのみが存在するが、下図のようになるように以下の3つの言語タイプを追加しよう。それ以外の設定項目（「管理語を使う」など）は設定しなくてよい。ステレオタイプがどういう役割を果たすかは後述する。
- 言語タイプ名: `transcription`, ステレオタイプ: `None`
- 言語タイプ名: `morpheme`, ステレオタイプ: `Symbolic Subdivision`
- 言語タイプ名: `gloss`, ステレオタイプ: `Symbolic Associtation`

<img width=12.5%><img width=75% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573180/4c2d1e68-097f-806d-f235-def1e03f926e.png">


### 注釈層の追加
さて、ここまでで設定したのはあくまで雛形であって、実際の注釈層はまだ作成されていない。今設定した注釈層を試すために、新規注釈層を追加してみよう。ツールバーの「`注釈層`」→「`新規追加`」を選択する。出てきたウィンドウで、以下のように注釈層を追加してみる。

- 注釈層名: `transcription@Yamada`, 話者: `Yamada`, 言語タイプ: `transcription`

言語タイプを設定する時に、`default-lt`と`transcription`しか選択肢が出てこないはずだ。
なぜ先程設定した`morpheme`と`gloss`が出てこないのかはひとまず置いておき、続けて以下のように設定する

- 注釈層名: `morpheme@Yamada`, 話者: `Yamada`, 上位注釈層: `transcription@Yamada`, 言語タイプ: `morpheme`
- 注釈層名: `gloss@Yamada`, 話者: `Yamada`, 上位注釈層: `morpheme@Yamada`, 言語タイプ: `gloss`

今度は逆に、言語タイプとして`morpheme`か`gloss`しか選択できなかったはずだ。

#### なぜ言語タイプの選択制限があるのか
なぜこのように注釈層によって言語タイプの選択制限が生じるかというと、先ほど言語タイプの新規追加を行った際に設定した「ステレオタイプ」の違いが関係する。「ステレオタイプ/stereotype」とは、上位注釈層と当該注釈層の関係を示したものである。例えば`transcription`に設定した`None`というステレオタイプは、「この言語タイプを持つ注釈層は、上位注釈層を持ちません」という指定だ。`morpheme`に設定した`Symbolic Subdivision` というステレオタイプは、「この言語タイプを持つ注釈層は、上位注釈層を必ず持ち、上位注釈層の時間を等分した構成になります」という指定だ。`gloss`に設定した `Symbolic Association` は、「この言語タイプを持つ注釈層は、上位注釈層を必ずもち、上位注釈層と同じだけの長さを持ちます」という指定だ。このように、言語タイプ（＝注釈層の雛形）を設定した時点でステレオタイプによって上位注釈層との関係が指定されるため、注釈層の新規作成時点で上位注釈層を設定した段階で、おのずと指定可能な言語タイプが限られる。そのため、上位注釈層に `transcription@Yamada` を指定した段階では言語タイプに `morpheme` か `gloss` しか選択できなかったのだ。

ステレオタイプを指定すると注釈層の階層構造に制限が出てしまうため、一見すると不自由で不便に思える。しかし、予め階層構造の可能性を制限しておくことによって、むしろ、ありえない構造を排除し、言語学的に適切な構造のみを自動的に作成できるという利点がある。

### 表示形式の変更
これで3層構造で注釈層が作成できた。階層構造を分かりやすくするため、表示形式を変更しよう。画面左下の注釈層名が表示されている部分を右クリックし、「注釈層の並び替え」→「階層ごとに並び替え」を選択する。すると、図のような順番に並び替えることができているはずだ。これは、`default` と `transcription` が最上位に位置し、`transcription`の下に`morpheme`、その下に `gloss` があることを表現している。

# 言語タイプを指定する利点
先程、言語タイプ（に内包されているステレオタイプ）を指定することによって予め構造を制限できるという利点を述べたが、実は他にも利点がある。

詳しくは自動グロス付けを解説した記事 ([ELANのInterlinearization Modeを使ってグロス付けを半自動化する](https://qiita.com/hamident0/items/348bb2204abe1c9cd68c)) に譲るが、辞書の特定のエントリーを特定の言語タイプに紐付けることによって、辞書の記載内容を自動で注釈に記載することができる。例えば、`morpheme`の言語タイプに辞書の見出し語を、`gloss`の言語タイプに辞書の解説をリンクさせておけば、自動でグロス付けができる。

加えて、XMLを用いたファイル操作の際にも効果を発揮する。詳しくは後日発表予定の別記事で解説するが、先程設定した注釈層の情報は`.eaf`ファイル上で以下のように記述されている。
```xml
<TIER LINGUISTIC_TYPE_REF="morpheme" PARENT_REF="transcription"
PARTICIPANT="Yamada" TIER_ID="morpheme@Yamada">
```
これは、「ここからの記載は、ある注釈層に関するものです。その注釈層の言語タイプはmorphemeで、上位注釈層はtranscriptionで、話者はYamadaで、注釈層名はmorpheme@Yamadaです。」という風に読める。このうち、言語タイプや話者などの情報は「属性/attribute」と呼ばれる部分に記述されている。属性を指定した検索を行うことで、例えば「山田さんと佐藤さんの発話の注釈層のうち、言語タイプがmorphemeであるもの」などという絞り込みができる。

# 実際にアノテーションを行ってみる
まず、一つの発話に対して一つの注釈を作成してみる。
1. 【注釈層をアクティブにする】 画面左下の`transcription@Yamada`の注釈層名をダブルクリックすることで、`transcription@Yamada`が赤くハイライトされている状態にする。この状態で注釈を新規作成すると、`transcription@Yamada`およびその下位注釈層に注釈が作成される。
2. 【注釈を作成する区間を指定する】音声を再生したり波形を確認したりすることによって、どこからどこまでが一つの発話なのかを確認する。そして、波形上をドラッグすることで発話の区間を選択する。選択すると薄青色にハイライトされる。
3. 【注釈を作成する】この状態で、注釈層で薄青色になっている部分をダブルクリックする。もしくは、ツールバーの「注釈」→「ここに新規注釈を作成」を選択する。すると、`transcription@Yamada`上にテキストボックスが開く。
4. 【内容の書き込み】テキストボックスに、発話の内容を書き込む。この際、可能であれば「①音韻表記で②形態素間に空白を入れて」書き込むのが望ましい。例えば、「raamen =o tabe -ru」のような感じだ。
5. 【morpheme@Yamadaに注釈を作る】ツールバーの「注釈層」→「注釈層内の文字列分割」を選択し、出てきたウィンドウ中で「元の注釈層(上位注釈層)」: `transcription@Yamada`, 分割先の注釈層: `morpheme@Yamada`を選択する。ウィンドウ下部の「開始」ボタンを押す。すると図のように`morpheme@Yamada`上に形態素ごとに分割された注釈が生成される。この手順は、`morpheme@Yamada`の上位注釈層として`transcription@Yamada`を設定していたこと、morphemeのステレオタイプをSymbolic subdivisionに設定していたことで可能になっている。したがって、階層関係やステレオタイプの設定がうまくされていないと、文字列の分割もできないはずだ。
6. 【gloss@Yamadaに注釈を作る】ツールバーの「`注釈層`」→「`Create Annotations on Dependent Tiers...`」を選択する。出てきたウィンドウで`morpheme@Yamada`にチェックを入れる。「次」を押して出てきた画面で`gloss@Yamada`にチェックが入っていることを確認し、「終了」ボタンを押す。そうすると、morpheme@Yamadaの各注釈に対応した空の注釈が`gloss@Yamada`に作成される。
7. 【グロスの書き込み】`gloss@Yamada`の注釈を書き込む場合は、各注釈をダブルクリックして編集する。自動でグロス付与を行いたい場合は、前の記事 ()を参照のこと。

【手順1-4】
![gif1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573180/703b451a-c5dd-5610-99c1-c5e441c6c731.gif)
【手順5-6】
![gif2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573180/6d930d6d-7034-d2d2-5cbb-6b88015daaea.gif)


# 話者を追加する
さて、今までの手順で発話、形態素、グロスの注釈層が1セット作成できた。これらは、話者が増えるごとに1セット増やしていかなればならない。これを手作業で行うと時間がかかるので、以下の手順では注釈のセットをコピーして話者を追加できるようにする。ここでは、仮にTakahashiという話者を追加してみる。

1. ツールバーの「`注釈層`」→「`Add Participant`」を選択する。
2. 出てきたウィンドウで`transcription@Yamada`にチェックを入れ、3つのテキストボックスに以下のように入力する。
Specify the new participant: `Takahashi`
Enter the calue to be replaced: `@Yamada`
Enter the new value for replacement: `@Takahashi`
3. 「OK」ボタンを押すと、図のように3層構造の注釈層のセットが増えているはずだ。ここで増えた注釈層は、階層構造や言語タイプの設定を保ったまま、話者および注釈層名の@以降の部分のみがTakahashiに変更されている。

![addParticipant.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573180/55f62371-37c2-4a2c-ea1c-b621e4c310ff.png)


# テンプレートとして保存する
ここまで時間をかけて注釈層の構造を設定してきた。ELANファイルを新たに作成するたびに時間をかけていてはもったいないし、その都度設定しているとどこかで設定ミスが起こる可能性が高まる。よって、今回作った設定をテンプレートとして保存し、次回以降新たにELANファイルを作成する際に使い回せるようにしておきたい。
1. ツールバーの「`ファイル`」→「`テンプレートとして保存`」を選択する。
2. 自分がわかりやすい場所に、拡張子を`.etf`として保存する。
3. 次回以降テンプレートを用いてファイルを新規作成する際は、新規作成ウィンドウの「`Add Template File...`」から手順2で保存した`.etf`ファイルを選択する。
テンプレートを用いる際の注意点は、今作った構造が、話者名も含めてそのまま保存されることだ。「trascription, morpheme」などの名称は一般的なので問題ないが、「Yamada, Takahashi」のような個人名はファイルごとに異なる可能性がある。テンプレート作成時と異なる話者が参加するファイルの場合は、さきほど解説した「話者を追加する」の手順を用いて注釈層のセットを新たに作成する必要がある。

# まとめ
1. ステレオタイプを持った言語タイプを設定した。
1. 言語タイプを指定して注釈層を作成することで、注釈層同士の階層を指定した。
1. 階層のある注釈層のセットをコピーすることで、話者2人分の注釈層を作成した。
1. テンプレートを保存することで、注釈層を次回以降も使い回せるようにした。