日付を表す文字列の解釈と暦の変換 - 暦に関する統合基盤の構築に向けて 関野樹 ( 総合地球環境学研究所 ) 山田太造 ( 東京大学史料編纂所 ) 1 時間情報の解析環境 時間を専門に扱うソフトウェアの登場時間に関する基盤情報を充実させる取り組み GISとの連携による本格的な時空間解析 HuTime 検索 2 1
時間情報のための知識 技術の集積 - 時間情報学 地域研究年代学歴史学書誌学 統計学位相幾何学 3 基盤情報 - 時間情報解析のための 3 種類の知識 時間基盤情報 (1) 基本年表 (2) 時間名辞書 (3) 暦法変換 ベース地図 地名辞書 測地系変換 4 2
暦に関する知識が必要な例 ドナティ彗星 (C/1858 L1) 日本での出現記録勘申彗星出現之事安倍晴雄著 安政戊午仲秋聞書 http://library.nao.ac.jp/kichou/open/009/index.html Kometa Donati nad pařížským ostrovem Ile de Cité s Justičním palácem a Conciergerií 5. října 1858 (z desky v The World of Comets 1877, Amedée Guillemin) http://www.komety.cz/article.php3?sid=259 ハーバードでの観測記録 The page from Bond's observing notebook at the Great Refractor at Harvard. http://www.komety.cz/article.php3?sid=259 5 暦に関して必要な知識 八月十六日 月 日の表現を知っていること漢数字が読めること 年号 : 安政年号を伴っていること 安政 が年号であること 年 : 戊午 戊午 が干支による年であること安政戊午書名 安政戊午仲秋聞書 より 年月日の表現の順序を知っていること Sept が9 番目の月であること 1858 Sept 28 年 :1858 月 :9 日 :28 月 :8 日 :16 和暦 ( 天保暦 ) であること 1858-09-22 1858-09-28 米国がグレゴリオ暦を用いてること 6 3
暦に関して必要な知識 日付の表記に関する知識 年月日の表現順序や区切り文字 使用される文字 月などの名前や略称 特定の日を表す用語 暦そのものに関する知識 どの地域 どの時代にどの暦が使われたか? 暦の運用方法の違い 暦同士の関係に関する知識 それぞれの暦を基準の暦に置き換える方法 ( 暦変換 ) データの入出力に関する知識 データ入出力の仕様 材料からのデータの抽出方法 暦に関する知識を集約する 暦に関する統合基盤 単なる暦変換を超えて 日付の表現や暦そのもの関する知識も含めて再利用できるようにするデータの入出力を共通化する 7 暦に関する統合基盤 8 4
本研究での範囲 統合基盤の基本機能の構築と検証 日付文字列の解釈 ユリウス / グレゴリオ暦 和暦 ユリウス通日 暦の変換機能 漢字の読み取り 年月日の様々な表現 ユリウス / グレゴリオ暦 和暦 ユリウス通日 基本的な解釈の仕組み 年月日によらない日付表現 不規則な例外を含む変換 ( データベースによる変換 ) 基準軸となる暦 計算式による変換 実用レベルのサービス提供 Web ページでのサービス提供検証 技術的要件.NET Frameworkをベース Excel のマクロとしての利用を見込む 9 日付文字列の解釈 - 書式指定の方法 日付文字列の書式指定 書式指定子と任意の文字の組み合わせて指定 4 ケタの年の指定子 2 ケタの月の指定子 2 ケタの日の指定子 ISO8601 形式の場合 yyyy-mm-dd 区切り文字 入力時指定された書式に従っているものとして日付文字列を解釈出力時指定された書式に従って日付文字列を出力 yyyy-mm-dd 2013-12-13 2013/12/13 解釈可能 解釈不可 10 5
日付文字列の解釈 - 書式指定子 書式指定子 基本的な指定子 ( 例 ) yyyy 4 桁の年 MM 2 桁の月 dd 2 桁の日など (.NET Framework の仕様に準拠 ) 暦ごとに拡張された指定子 ユリウス / グレゴリオ暦 ( 西暦 ) ( 例 ) Y 紀元前の表記に対応した年 : 紀元 1 年は1 ; 紀元前 1 年は1 A.D.", "B.C." を伴って使うことを前提 ( 基本の y は 連続した数値としての年 : 紀元 1 年は 1; 紀元前 1 年は 0) 和暦数字 干支 月名などに対応 ( 例 ) yk MJ dk de 一, 元,, 一〇, 十,, 二〇, 二十, 廿,, 三〇, 三十, 卅睦月, 如月, 弥生,, 霜月, 師走一, 朔,, 一〇, 十,, 二〇, 二十, 廿,, 三〇, 三十, 卅,, 晦甲子, 乙丑, 丙寅, 丁卯,, 壬戌, 庚亥 11 日付文字列の解釈 - 書式指定子 書式指定子 ( 続き ) ワイルドカード日付文字列の解釈に柔軟性を持たせる年月日のワイルドカード ( 例 - 和暦の日の書式 ) dk 日の漢数字によるあらゆる表現一, 朔,, 一〇, 十,, 二〇, 二十, 廿,, 三〇, 三十, 卅,, 晦 da 日のすべての表現 d (1, 01,, 30) + de ( 甲子,, 癸亥 ) + dk 任意の文字のワイルドカード * 0 文字以上の任意の文字? 任意の1 文字ワイルドカードの適用例 gg*ya*ma*da* 平成二五年一二月一三日 平成廿五年十二月十三日 平成癸巳師走癸丑 平成 25 年 12 月 13 日 平成 25/12/13 12 6
日付文字列の解釈 - 処理の流れ 入力データ平成弐伍年壹弍月壱参 異体字等処理後平成二五年一二月一三 東京大学史料編纂所のデータより 解釈の結果 年号 : 平成年 : 25 月 : 12 日 : 13 ( 切り分けられた状態 ) 暦変換などの処理へ 可能性のある書式を複数指定最初に解釈に成功したものを採用 13 暦変換 基準軸ユリウス通日 紀元前 4713 年 1 月 1 日正午からの日数 不連続が無い 2つの変換方法計算式による変換 データベースによる変換 ユリウス / グレゴリオ暦 ( 西暦 ) 恣意的な変更や変異が少ない ( ユリウス暦からグレゴリオ暦の改暦のみ ) 仕組み ( 月の日数 置閏法 ) が比較的単純で一定 和暦 恣意的な変更が多い ( 月の大小 ) 変異がある ( 南朝 北朝 ) 仕組みが複雑で変化する ( 天保暦 宣明暦 儀凰暦 ) 暦 A ユリウス通日 暦 B 各暦はユリウス通日との相互変換を実現できるようにする 和暦で使われているデータベース 月テーブル各月の朔日のユリウス通日と年の年番号 ( 皇紀に相当 ) を記録年号テーブル各年号が使われた期間をユリウス通日で記録 14 7
暦変換 - 実装 基本機能暦変換にかかる全体の調整 API 外部からの利用を共通化する 今回は見送り 暦カタログ暦そのものに関する情報 使用地域や期間 実装されているモジュール名 今回は見送り ( 対応する暦が増えたら構築 ) 暦モジュール 暦に応じた日付文字列の解析機能 ユリウス通日との相互変換機能を実装 今後 他の暦へも対応してゆく予定 15 結果の出力 結果は日付文字列として出力書式指定 文字列解析 ( 入力時 ) を基本的に同じ 使用できない書式指定子 ( ワイルドカードなど ) がある 出力だけで使える書式指定子 ( 漢数字の表現など ) がある 出力例 ( 例 ) dk1 dk1b dk2 dk3 一,, 一〇 一一,, 二〇, 二一,, 三〇, 三一朔,, 一〇, 一一,, 二〇, 二一,, 晦一,, 十, 十一,, 二十, 二十一,, 三〇, 三一一,, 十, 十一,, 廿, 廿一,, 卅, 卅一 ユリウス / グレゴリオ暦 ( 西暦 ) 1703 年 1 月 30 日 年号和暦に対応した年年の干支 ggyk2 年 (yw/ye)mk2 月 dk2 日 出力書式 和暦 漢数字の年漢数字の月元禄十五年 (1702/ 壬午 ) 十二月十四日 ( 赤穂浪士討ち入り ) 漢数字の日 16 8
サービスの提供 暦変換フォーム HuTime 検索 既定の書式和暦 ( 入力 ) gg*ya*ma*da* gg*ya*ma* 朔 da* ( 出力 ) ggy 年 MMM 月 d 日 ユリウス / グレゴリオ暦 ( 西暦 ) ( 入力 ) gg*y-m-d ya*ma*da* ( 出力 ) gg YYYY-MM-dd http:///basicdata/calendar/form.html 入力方法 改行で区切って複数のデータを入力可能 17 検証 (1) どれだけの史料に対応できるか - 和暦 東京大学史料編纂所のデータベースに含まれる日付の表現がどの程度変換できるか? 寶亀宝亀寳亀寳龜宝龜寶龜天應天応延暦大同 平成 25 年 12 月 13 日 元年壱年々年一年 1 年貮年 2 年弐年貳年 2 年 孟冬初冬拾月 10 月十月小春応鐘閏 10 月後小春閏拾月 廿壱日貳拾壱日二拾壱日貮拾壱日念壱日念一日廿一日貮拾一日弐拾弐日弐十弐日 結果年号正解率 317/333 年正解率 1165/1167 月正解率 214/395 日正解率 363/372 大半の史料に対応できると考えれる 年号 年 月 日をそれぞれ置き換えて変換する 必要に応じて ほかの要素も調整 ( 閏月など ) 和暦から和暦への変換を実施し 同じ日付を返すかを確認 18 9
検証 (2) 処理速度同じデータ 平成二五年八月二八日 を複数件入力し変換 平成二五年八月二八日平成二五年八月二八日平成二五年八月二八日平成二五年八月二八日平成二五年八月二八日平成二五年八月二八日平成二五年八月二八日平成二五年八月二八日 サーバと同一 LAN で実施 ( ネットワーク遅延の影響を抑える ) 和暦から西暦への変換 書式は既定のまま 結果 3,000 件までであれば1 秒以内に結果を出力 実用的な処理速度を実現 実用上はネットワーク環境や書式指定 入力データの複雑さの影響を受けると考えられる 19 統合基盤の応用と今後の課題 応用 Webページや他のアプリケーション (HuTimeなど) への組み込み (APIの実装) 史料からの日付文字列の抽出構造化されたテキストでの応用 セマンティックWeb - 異なる暦法による同じ日付の関係 課題 対応する暦を増やす 暦や日付の表現に関する知識の蓄積 時間名辞書との連携 20 10