自然言語における時間表現の正規化方法の調査

# はじめに
自然言語を用いてスケジュール設定が可能なリマインダーを開発したいです。  
例えば、「明日の朝７時に目覚ましをセットして」という文章から、具体的に何時にアラームを設定すべきかを特定したいです。「明日の７時」は簡単な例ですが、自然言語コミュニケーションにおける表現揺れや省略を考慮すると難易度があがります。例えば「７時にセットして」だけだと午前なのか午後なのかわかりません。
「明日」や「７時」といった自然言語における時間を示す語句は「時間表現」（Time Expression）と呼ばれているようです。既存の技術で、これらの時間表現をどの程度解析できるのかを軽く調査しました。専門的に深く調べたわけではないので、多くの見落としがあるかもしれません。

# 調査範囲
- [awesome-japanese-nlp-resources](https://github.com/taishi-i/awesome-japanese-nlp-resources)で「時間」や「temp（temporal）」をキーワードに検索
- ChatGPTに質問
- Googleで「時間表現 parse 自然言語」などのキーワードで検索し、見つかった資料から得た知識や用語（具体的なデータセット名など）を基に再検索
- [elicit](https://elicit.com/)で「日本語文章の時間表現の解析や抽出」などのクエリで検索
## awesome-japanese-nlp-resources
以下が見つかりました。
- [ja-timex](https://github.com/yagays/ja-timex/)
  - ルールベースで日本語の時間表現をTIMEX3形式に正規化します。
  - 試したところ、日本語の主要な時間表現は正しく正規化され、使いやすいです。
  - datetimeやtimedelta形式で返す機能があり、使いやすいです。
  - 抽出できない表現もありますが、カスタムパーサーを設定できるため、対応可能です。
  - 文脈を考慮した時刻変換には対応していないため、独自の後処理が必要です。
  - 開発背景やポリシーの説明、参考文献がdocsにあり、参考になります。
  - [『現代日本語書き言葉均衡コーパス』に対する時間情報アノテーション](https://www.jstage.jst.go.jp/article/jnlp/20/2/20_201/_pdf/-char/ja)
    - docsに記載されていた参考文献です。
    - 「現代日本語書き言葉均衡コーパス」の時間表現を含む文章をTIMEX3でアノテーションしました。
    - データセットはタグのみgithubで公開と記載がありましたが、具体的なリンクは論文中に見つかりませんでした。
      - Webで探したところ、中納言ダウンロードサーバで公開されているようです（[ソース](https://masayu-a.github.io/anno/#:~:text=BCCWJ%2DTimeBank%20(version%203.0.0)%20(2023/10/29)%20%E4%B8%AD%E7%B4%8D%E8%A8%80%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%82%B5%E3%83%BC%E3%83%90%E3%82%88%E3%82%8A%E5%85%AC%E9%96%8B)）。ただアカウント登録等必要で、すぐに中身を確認できませんでした。
    - 日本語の時間表現のバリエーションの具体例がわかります。
    - TimeBankやTempEvalなど海外の時間表現抽出系のデータセットやコンペについてイントロで触れられており、参考になります。
    - 「[BCCWJ-TimeBank: Temporal and Event Information Annotation on Japanese Text](https://aclanthology.org/Y13-1019.pdf)」は英語版と思われます（データセットの英語版ということではなく、論文の英語版）。
  - [自然言語処理における数量表現の取り扱い](https://www.cl.ecei.tohoku.ac.jp/publications/2015/mthesis2013_narisawa_submitted.pdf)
    - docsに記載されていた参考文献です。おそらくja-timexの開発者の修士論文です。
    - docsの内容がさらに詳しく書かれています。
- [pyNormalizeNumexp](https://github.com/tkscode/pynormalizenumexp)
  - 数量表現と時間表現を正規化します。正規化の形式は独自のようですが、TIMEX3と同程度の情報があるようです。
  - カスタムパーサーがあります。
  - 文脈を考慮した時刻変換には対応していないため、独自の後処理が必要です。datetimeやtimedeltaオブジェクトの変換も独自に必要なため、後処理の行数はja-timexよりも多少増えそうです。
  - 対応する時間表現の幅は、ja-timexでしか抽出できないものも、pyNormalizeNumexpでしか抽出できないものもありました。リマインダレベルであれば、どちらもある程度十分に思えました。
- [Jamp: Controlled Japanese Temporal Inference Dataset for Evaluating Generalization Capacity of Language Models](https://github.com/tomo-vv/temporalNLI_dataset/)
  - 日本語の文章における時間関係の推論データセットです。
  - 論文は「[制御可能な日本語時間推論データセットの構築](https://www.jstage.jst.go.jp/article/pjsai/JSAI2023/0/JSAI2023_1E4GS602/_pdf/-char/ja)」です。
  - データセットとしては時間の前後関係などの推論に重きが置かれており、時間表現そのもののバリエーションはあまり多くありません。リマインダシステムの評価には向いていないと感じました。
  - 同じ研究グループの類似のデータセットとして「[Jamp_sp](https://github.com/ynklab/Jamp_sp)」というものもありました。論文は「[アスペクトを考慮した日本語時間推論データセットの構築](https://www.jstage.jst.go.jp/article/jnlp/31/2/31_637/_pdf/-char/ja)」。こちらも関係性の推論がメインで、時間表現のバリエーションは多くありませんでした。


## ChatGPT
以下のツールが見つかりました。
- [HindelTime](https://github.com/HeidelTime/heideltime)
  - 時間表現をTIMEX3形式に正規化する機能がありますが、日本語には対応していません。
- [SUTime](https://stanfordnlp.github.io/CoreNLP/sutime.html)
  - 時間表現をTIMEX3形式に正規化する機能がありますが、日本語には対応していない可能性があります。また、プログラムはJavaで書かれているようです。

その他にもいくつか情報を提供してくれましたが、ハルシネーションでした。
## Google検索

- [同一文内の表現対を対象とした日本語における時間関係認識](https://www.anlp.jp/proceedings/annual_meeting/2014/pdf_dir/D1-2.pdf)
  - BCCWJ-TimeBankという表層的な時間表現のアノテーションがされたコーパスを用いて、時間関係の認識タスクを実施し評価した研究です。2014年に発表されました。この論文のイントロによれば、時間関係認識のワークショップであるTimeEvalには日本語のタスクがなく、日本語で時間関係認識を試みたのはこの論文が初めてのようです。
  - 「[日本語文書内で表現される事象間の時間的な順序関係の推定](https://cir.nii.ac.jp/crid/1050001337905909760)」という論文も同じグループによる後続研究で、こちらの方が情報が詳しいかもしれません。
- [複数文書から抽出したイベントの時間関係処理に関する研究](https://www.jstage.jst.go.jp/article/pjsai/JSAI2013/0/JSAI2013_1C42/_pdf/-char/ja)
  - 前述の研究の参考文献に載っていたもので、ニュース記事の時間表現からイベントの発生時刻を推定する取り組みです。リマインダで実現したいことに近い内容です。
  - 範囲や相対的な時間を表す日本語の具体例が載っており、参考になります。
  - ニュース記事の具体例が知りたかったのですが、あまり載っていませんでした。
  - リマインダ設定の対話のやり取りはニュースよりも情報不足のことが多いため、この論文の手法がそのまま適用はできなさそうです。
- [時間情報抽出 | Papers with code](https://paperswithcode.com/task/temporal-information-extraction/codeless?page=6&q=)
  - 時間情報抽出に関する論文をまとめていますが、あまり知られていないものや参考になりそうなものは含まれていませんでした。
- [LLMの知識習得と固有表現認識について](https://qiita.com/sergicalsix/items/51f60cef60e314b13b52)
  - 固有表現認識のタスクについて説明しています。
  - 時間表現認識は固有表現認識の一部として位置づけられています。この位置づけは勉強になります。
  - 固有表現の範囲は年々見直されており、[こちら](http://ene-project.info/ene9/)で参照できます。
- [Twitter投稿における定性的時間表現の使用時刻分布調査](https://www.anlp.jp/proceedings/annual_meeting/2022/pdf_dir/B8-2.pdf)
  - 「まだx時」「もうx時」など曖昧さを伴う定性的な時間表現の分析を実施

## Elicit
- [Time Expression Analysis and Recognition Using Syntactic Token Types and General Heuristic Rules](https://aclanthology.org/P17-1039/)
  - この論文では、ルールベースのSynTimeという手法が提案されています。日本語にも対応しており、[Pythonライブラリ](https://pypi.org/project/pysyntime/)も存在します。
  - SynTimeの特徴は、ルールとトークンの間にトークンレイヤーを導入している点です。トークンレイヤーは、時間トークン、修飾語、数字の3つにトークンを分類します。これにより、ルールの適用がより効果的になるとされていますが、詳細は不明です。
  - 実際に試してみたところ、spacyのモデルダウンロード時にnumpyのエラーが発生しました。これはnumpyのバージョンが原因で、v2からv1に変更することで解決しました。
    - 参考リンク: https://qiita.com/k1morikawa@github/items/b53777cbf286b66b2ec4
  - 次に、No module named pipというエラーが発生しました。これはuvに関連する問題で、uv pip install pipコマンドで解決しました。
    - 参考リンク: https://github.com/astral-sh/uv/issues/1551
  - 最後に、正規表現に関連するエラーが発生しました。pypiによると、syntimeはPython 3.7で開発されていますが、3.11で試したためエラーが発生した可能性があります。ソースコードの修正も検討しましたが、解決には至りませんでした。3.7で試すことも考えましたが、3.7は古いため、3.11での使用方法が見つからない限り採用は難しいと判断し、ここで試行を中止しました。

  ```
  File ~/.pyenv/versions/3.11.2/lib/python3.11/re/_parser.py:841, in 
  _parse(source, state, verbose, nested, first)
      839 if flags is None:  # global flags
      840     if not first or subpattern:
  --> 841         raise source.error('global flags not at the start '
      842                            'of the expression',
      843                            source.tell() - start)
      844     verbose = state.flags & SRE_FLAG_VERBOSE
      845     continue

  error: global flags not at the start of the expression at position 1"
  ```

# 所感
- スケジュール設定に関する技術の位置づけは、時間表現の解析という分野の中でも特にイベントの発生時刻の推定、というタスクといえそうです。
- イベントの発生時刻を推測する使いやすいライブラリはなさそうだったので、自分で作る必要がありそうです。ja-timexとpynormalizenumexpを活用できると思いました。awesome-japanese-nlp-resourcesは流石だと思いました。
- 研究においては、ルールベースの時間表現に関する研究は2015年頃までのものが多く、最近の研究は少なめに思えました。また、文脈を踏まえたイベントの発生時刻予測の研究は少なく、表層情報に基づく正規化や時間関係の認識に焦点を当てた研究が多かったです。イベントの発生時刻の推定の最近の研究が少ないのは（調査不足以外に考えられるとすれば）、イベント発生時刻推定は比較的容易だということなんでしょうか。あるいは応用先ごとの調整の問題になってくるので、研究的な興味が弱い可能性もあるかなと思いました。
- LLMを用いたイベント時刻推定の研究はあまり見つかりませんでした。タスクが簡単だからかもしれません。ただ時間関係の認識については、JampがLLMを意識したものであり、GPT4でもまだ課題が残っているようです。

# 今後の方針
- ja-timexとpynormalizenumexpのどちらが目的のアプリケーションに適しているかを検討。
- 表層的な時間表現からリマインダの設定時刻を特定する処理を実装
- 時間表現と設定内容を分離し、解析する処理を実装
- テストデータを作成。
- BCCWJを見てみる。