小さな歴史データ作成、調査現場で必要な技術 ～あいまい年号検索『春海』～

## 歴史研究に用いる技術

歴史研究に用いるIT技術とは、どんなものがあるのでしょうか。
ヒストリーテックの技術が多く集約された、[人文学オープンデータ共同利用センター](http://codh.rois.ac.jp/)（Center for Open Data in the Humanities / CODH）のページを見ると、[日本古典籍くずし字データセット](http://codh.rois.ac.jp/char-shape/)のような膨大なデータベース、[みを](http://codh.rois.ac.jp/miwo/)のようなML/AIを活かしたツール、[IIIF Curation Viewer](http://codh.rois.ac.jp/software/iiif-curation-viewer/)のようなアーカイブとディスプレイなど、データ蓄積、データ生成、ビジュアライズ、さまざまな用途で高度な技術が提供されています。
CODH以外でも、[ひかり拓本プロジェクト](https://www.nabunken.go.jp/research/hikataku.html)や[文化財総覧 WebGIS](https://heritagemap.nabunken.go.jp/)、[れきちず](https://rekichizu.jp/)のような大きな技術のプロジェクトも存在します。

そのような大規模な技術の一方で、市井の歴史素人や初学者が、研究や調査を行う際にぶつかる小さなハードルを越えるための技術も、大切なのではないかと思います。
その視点で見ると、使われている技術は最先端ですが、くずし字解読や拓本ができない人を対象にしたくずし字OCRやひかり拓本、3Dスキャン/3DGSを素人でも可能にした[Scaniverse](https://apps.apple.com/jp/app/scaniverse-3d-scanner/id1541433223)なども、そういった技術のうちに入るでしょうし、使う技術が高度か否かに関係なく、こういった小さな障壁をくずす技術は大切だと筆者は感じています。

## 風化した石造物の年号特定技術: 春海

そういった小さな障壁解消の技術として、開発したのが年号あいまい検索「春海」です。

* [春海](https://code4history.dev/Harumi/) - 年号推定フォーム
* [harumi](https://www.npmjs.com/package/harumi) - 上記を実現するnpmライブラリ
* [harumi ソースコード](https://github.com/code4history/Harumi)

風化した石造物だと、年号を記録しようにも、年号の一部が風化したり、苔むしたりして読めない場合もあります。
元号、漢数字、干支の一部しか読めない場合、読み取れた漢字だけから可能性のある年号を推定しなければなりません。
年号や干支が頭に入っている熟練研究者ならば、すぐ候補がわかるかもしれませんが、そうでない人にはこれは困難です。
和暦の年表を手元においたとしても、1000年以上の年号の組み合わせの中から、読み取れた漢字が含まれる候補をリストアップするのも大変です。

そこで、読み取れた漢字だけからありうる候補を検索する、あいまい検索フォームと、そのライブラリを作成しました。

フォームは以下のような形で使います。

![應廿寅の検索](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/f771721f-ebdc-8e27-e7ce-bcf5cc6cf6d6.png)

たとえば、應、廿、寅を含む年号は、応永29年（壬寅、1422年）しかありません。

![寿永の検索](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10108/f2a02e85-eb58-1b7f-a461-7fc901471bcd.png)

中央の年号だけではなく、源平政権や南北朝、古河府などの地方の年号にも対応しています。

オプションとしては、西暦で期間を指定しての検索や、2年固定ですが延長マッチ（改元が地方に伝わるのが遅れる場合なども想定）、風化していると見分けにくい戊と戌、己と巳を見分けない検索などもできるようになっています。

npm ライブラリとしても使えます。
READMEを以下に引用します。

#### インストール

```bash
npm install harumi
```

#### 基本的な使用方法

```javascript
import { ambiguousSearch } from 'harumi';

// 基本的な検索
const results = ambiguousSearch('寛永');
console.log(results);
// [
//   { year: 1624, nengo: '寛永1', eto: '甲子' },
//   { year: 1625, nengo: '寛永2', eto: '乙丑' },
//   ...
// ]

// オプション付きの検索
const options = {
  range: '1600-1700',              // 西暦年の範囲指定
  enable_over_match: true,         // 延長マッチを有効化
  tsuchinoe_inu_flag: true,       // 「戊」と「戌」を同一視
  tsuchinoto_mi_flag: true        // 「己」と「巳」を同一視
};

const results2 = ambiguousSearch('寛永', options);
```

#### オプション

- `range`: 検索対象とする西暦年の範囲を指定（例: '1600-1700'）
- `enable_over_match`: 元号の延長期間も検索対象に含める（デフォルト: false）
- `tsuchinoe_inu_flag`: 「戊」と「戌」を同一の文字として扱う（デフォルト: false）
- `tsuchinoto_mi_flag`: 「己」と「巳」を同一の文字として扱う（デフォルト: false）

#### 戻り値の型

```typescript
interface SearchResult {
  year: number;          // 西暦年
  nengo: string;         // 年号
  eto?: string;          // 干支
  condition?: string;    // 条件（例: "南朝"）
  over_match?: boolean;  // 延長マッチかどうか
}
```

#### ユースケース例

石碑の年号が部分的にしか判読できない場合の年代推定：

```javascript
// 「慶」の文字だけが判読できる場合
const results = ambiguousSearch('慶');

// 「応」の文字と1860年代という情報がある場合
const results = ambiguousSearch('応', { range: '1860-1869' });

// 「戊」か「戌」かはっきりしない場合
const results = ambiguousSearch('戊', { tsuchinoe_inu_flag: true });
```

JavaScriptライブラリなので、各種調査のWebインタフェースにも、フロントサイドで組み込むことができます。
ぜひ、使ってみていただければ幸いです。