はじめに#
Hypothes.isは、Webページ上にハイライトやコメントを付けられるオープンソースのアノテーションツールです。ブラウザ拡張やJavaScriptの埋め込みで手軽に使えますが、蓄積したアノテーションをバックアップしたい、あるいはTEI/XMLなど別の形式で活用したいケースもあります。
本記事では、Hypothes.is APIを使ってアノテーションをエクスポートし、TEI/XMLに変換する方法を紹介します。
APIキーの取得#
- Hypothes.isにログイン
- Developer settings にアクセス
- 「Generate your API token」でAPIキーを生成
取得したキーを.envファイルに保存します。
アノテーションのエクスポート#
APIの基本#
Hypothes.is APIのベースURLは https://api.hypothes.is/api です。認証はAuthorization: Bearer <API_KEY>ヘッダーで行います。
主要なエンドポイント:
| エンドポイント | 用途 |
|---|
GET /api/profile | 認証ユーザーのプロフィール取得 |
GET /api/search | アノテーション検索 |
GET /api/annotations/{id} | 個別アノテーション取得 |
スクリプト#
エクスポートからTEI/XML変換までを1つのスクリプト hypothes_export.py にまとめています。
https://github.com/nakamura196/hypothes-export/blob/main/hypothes_export.py
以下、主要な処理を抜粋して説明します。
.envの読み込みとAPI呼び出し#
全アノテーションの取得(ページネーション対応)#
Search APIは1リクエストあたり最大200件なので、offsetをずらして全件取得します。
アノテーションのデータ構造#
エクスポートされたJSONの各アノテーションは、W3C Web Annotation Data Modelに基づいた構造を持っています。
3種類のセレクタ#
Hypothes.isは、アノテーション対象のテキスト位置を3種類のセレクタで記録しています。
| セレクタ | 仕組み | 頑健性 |
|---|
| RangeSelector | DOM上のXPathで位置を指定 | △ HTML構造の変更に弱い |
| TextPositionSelector | 文字のオフセット位置で指定 | △ テキストの増減でズレる |
| TextQuoteSelector | 対象テキスト+前後の文脈で指定 | ◎ fuzzy matchで再アンカリング可能 |
元文書が変更された場合、Hypothes.isはこれらのセレクタをフォールバックとして順に試みます。TextQuoteSelectorはprefix/suffixを含むfuzzy matchを行うため最も頑健ですが、対象テキスト自体が削除・大幅変更された場合はアノテーションが「orphaned(孤立)」状態になります。
TEI/XMLへの変換#
エクスポートしたJSONをTEI/XML形式に変換します。
マッピング方針#
| Hypothes.is | TEI/XML |
|---|
| 対象文書(URI・タイトル) | <sourceDesc><bibl> |
| 文書ごとのグループ | <div> |
| 各アノテーション | <ab> |
ハイライトテキスト(TextQuoteSelector.exact) | <quote> |
| コメント本文 | <note type="annotation"> |
| タグ | <note type="tag"> |
変換ロジック#
TextQuoteSelectorから引用テキストを抽出し、TEI要素にマッピングします。
アノテーションをURIごとにグループ化し、<div> → <ab> → <quote> / <note> の構造で出力します。詳細はソースコードを参照してください。
出力例#
元文書の変更とアノテーションの整合性#
Hypothes.isのアノテーションは「スタンドオフ注釈」方式で、元文書とは別に保存されます。そのため、元文書が変更されるとアノテーションの位置がズレる可能性があります。
- 軽微な変更 :
TextQuoteSelectorのfuzzy matchにより再アンカリングされることが多い - 大幅な変更 : アノテーションが「orphaned」状態になり、対象箇所に紐づかなくなる
TEI/XMLにエクスポートしておけば、<quote>要素にハイライト対象テキストが記録されるため、元文書との対応関係は少なくとも記録として残ります。
まとめ#
- Hypothes.is APIを使えば、自分のアノテーションをプログラムから取得できる
TextQuoteSelectorのexact/prefix/suffixが、アノテーション対象テキストの特定に最も重要- TEI/XMLへの変換により、人文学研究で広く使われるフォーマットで保存・活用できる
- ただし元文書の変更によるアンカリングのズレには注意が必要
ソースコードはGitHubで公開しています。