Giter Site home page Giter Site logo

yagays / ja-timex Goto Github PK

View Code? Open in Web Editor NEW
132.0 132.0 9.0 744 KB

自然言語で書かれた時間情報表現を抽出/規格化するルールベースの解析器

License: MIT License

Python 100.00%
datetime nlp python regular-expression temporal time-parsing

ja-timex's Introduction

ja-timex's People

Contributors

otokunaga2 avatar shirayu avatar tpdn avatar yagays avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

ja-timex's Issues

[Docs] CustomTaggerの使い方を説明する

📖 ドキュメントの変更

Custom Taggerの使い方を説明する

該当箇所

理想の状態

Custom Taggerの説明を読んで実行できる状態になっている

追加/補足情報

[Bug]依存ライブラリが対応していないため、Python3.12環境にインストールできない

🐛 Bug

説明

見る感じ依存ライブラリ2つが現状対応していないため、Python3.12環境にインストールできない状態になっています

現状挙動

インストール時にエラーが出る。エラーについては補足情報のIssueを参照

理想の挙動

普通にpip installできる

再現方法やエラー内容

Python3.12環境でpip install

実行環境

  • ja-timexのバージョン : 0.2.7
  • Pythonのバージョン : 3.12.0
  • OSの情報: MacOS Sonoma

追加/補足情報

Pendulum

https://github.com/sdispater/pendulum

Pendulum v2.1系はPython3.12に対応していません。廃止されたsetuptoolsが影響していそうです。
sdispater/pendulum#696

そして2.1系をこれ以上アップデートする意志はないようです。なので3系への切り替えが必要です。

ただ、3系は今のところ安定版のリリースがされていません。
ver3.0.0bが存在しており、実装そのものはおおむね仕上がってそうに見えます。

mojimoji

https://github.com/studio-ousia/mojimoji

mojimojiはPython3.12に対応していません。Unicode周りのAPIが廃止された影響を受けています。
studio-ousia/mojimoji#24

ただ、このライブラリはそれほど複雑なことをやっていなさそうに見えます。
他のライブラリへの切り替えや、同様の挙動をする自前実装への切り替えを検討しても良いのかもしれません。
私が作った修正差分が一応存在しています。studio-ousia/mojimoji#25

[Modify Rules] 夜9時・今夜9時のような表現のサポート

📝 時間情報表現のルール

今夜9時今日の夜9時からのような表現を21時として解釈する

用例

告知などでよく使われる表現。
https://twitter.com/telebee_tnc/status/1420572285157613574

時間表現への変換

>>> timexes = TimexParser().parse("今夜9時スタートです。")
>>> timexes
[<TIMEX3 tid="t0" type="TIME" value="T21-XX-XX" text="夜9時">]

早速使わせていただいています。是非ご検討のほどお願いします。

[Feature Request] 基準日を設定できるようにする

🚀 機能提案

不足情報を補う際に基準日を設定して、その年/月/日を利用できるようにする

モチベーション

  • 日付表現にて不足している情報がある場合、年は実行時の年を、月/日は1を設定しているが、ユーザが設定できるようにしたい

解決策や課題解決の方針

TimexParserのコンストラクタで設定する

timex_parser = TimexParser(ts=datetime(2020,7,18))

追加/補足情報

ctparseの挙動を参考。

https://github.com/comtravo/ctparse

[Bug] "毎年6月"が"年6月"と判定される

🐛 Bug

説明

"毎年6月"が"年6月"と判定される

現状挙動

In []: timex_parser.parse("毎年6月")
Out[]: [<TIMEX3 tid="t0" type="SET" value="P1Y" freq="P6M" text="年6月">]

理想の挙動

毎年6月で読み取られる

再現方法やエラー内容

"毎年6月"を解析する

実行環境

  • ja-timexのバージョン :0.1.3
  • Pythonのバージョン : 3.8.3
  • OSの情報: macOS Big Sur 11.3

追加/補足情報

[Feature Request] 漢数字からアラビア数字への変換を無効にするオプションの追加

🚀 機能提案

漢数字からアラビア数字への変換を無効にするオプションの追加

モチベーション

  • 漢数字からアラビア数字に変換する際に「一時はどうなることかと」「十分なインターバル」といった表現を誤検出してしまう問題がある
  • 日付が漢数字で書かれないドキュメントであることが分かっている場合には、こうした変換を無効にすることで抽出精度を上げることができる

解決策や課題解決の方針

以下のように引数を渡す。

timex_parser = TimexParser(ignroe_kansuji=True)

追加/補足情報

[Feature Request] 期間を含む表現が数字を含まない場合にも range_start (range_end) が取得できる

🚀 機能提案

現在 TimexParser.parse は期間を表す表現(例えば「15日から16日」)のときには、range_startrange_end) がTrueとなります。一方数字を含まない表現「昨日から今日」の場合には range_start は機能していません。

スクリーンショット 2022-01-31 10 44 51

そこで数字を含まない期間表現が入力に含まれている場合にも range_start (end) が True となる挙動になってほしいと考えています 🙏

モチベーション

  • 本パッケージのユーザが期間表現が数字を含まない場合に特殊なフローを追加しなくても良くなる。

解決策や課題解決の方針

追加/補足情報

[Bug] 日付表現で半を含む際のto_datetime()の動作

🐛 Bug

説明

日付表現に半や午後(PM)を含むとき、to_datetime()を実行すると、TIMEX3タグのvalueには反映されているようですが、日付型/時間型に半や午後の時刻が反映されません。
仕様でしょうか??
初issueなので何か間違えていたら申し訳ありません。よろしくお願いします。

現状挙動

timex_parser = TimexParser(reference=pendulum.now()) # 2022/8/27 18:00:00 
print(timex_parser.parse("20時半"))
print(timex_parser.parse("20時半")[0].to_datetime())
print()
print(timex_parser.parse("午後11時"))
print(timex_parser.parse("午後11時")[0].to_datetime())

出力

[<TIMEX3 tid="t0" type="TIME" value="T20-30-XX" text="20時半">]
2022-08-27T20:00:00+09:00

[<TIMEX3 tid="t0" type="TIME" value="T23-XX-XX" text="午後11時">]
2022-08-27T11:00:00+09:00

理想の挙動

出力

[<TIMEX3 tid="t0" type="TIME" value="T20-30-XX" text="20時半">]
2022-08-27T20:30:00+09:00

[<TIMEX3 tid="t0" type="TIME" value="T23-XX-XX" text="午後11時">]
2022-08-27T23:00:00+09:00

実行環境

  • ja-timexのバージョン : 0.2.6
  • Pythonのバージョン : 3.10.5
  • OSの情報: Windows10

[Modify Rules] "半"という表現をサポート

📝 時間情報表現のルール

「1時間半」といった半分を表す量を取得できるようにする

用例

田園都市線は最大で1時間半の遅れが発生した

東急田園都市線、大幅にダイヤ乱れる - ウィキニュース

この台風の寿命は1日半で

台風23号、1日半で消滅―フィリピンの東で熱帯低気圧に - ウィキニュース

時間表現への変換

In []: timex_parser.parse("1時間半の遅れ")
Out[]: [<TIMEX3 tid="t0" type="DURATION" value="PT1.5H" text="1時間半">]
In []: timex_parser.parse("1日半")
Out[]: [<TIMEX3 tid="t0" type="DURATION" value="P1.5D" text="1日半">]

2つ目は現在DATEとして取得されている。

追加/補足情報

[Bug] to_datetime

🐛 Bug

説明

image

現状挙動

理想の挙動

再現方法やエラー内容

実行環境

  • ja-timexのバージョン :
  • Pythonのバージョン :
  • OSの情報:

追加/補足情報

[Bug] 生誕100年がDATEとして抽出される

🐛 Bug

説明

「生誕100年」や「そろそろ1年が経過しようとしている」に対してDATEとして抽出

現状挙動

DURATIONとして抽出される

理想の挙動

Out[]: [<TIMEX3 tid="t0" type="DURATION" value="P100Y" text="100年">]

Out[]: [<TIMEX3 tid="t0" type="DURATION" value="P1Y" text="1年">]

再現方法やエラー内容

実行環境

  • ja-timexのバージョン : v0.2.0
  • Pythonのバージョン : 3.8
  • OSの情報: 11.5.2(20G95)

追加/補足情報

[Modify Rules] Xから翌Yという表現を範囲表現とする

📝 時間情報表現のルール

範囲表現に「翌」や「同」が入っていても範囲表現とする

用例

「2005年11月から翌2006年7月」「午後1時半から同3時半」

時間表現への変換

[<TIMEX3 tid="t0" type="DATE" value="2005-11-XX" range_start="True" text="2005年11月">,
 <TIMEX3 tid="t1" type="DATE" value="2006-07-XX" range_end="True" text="2006年7月">]

追加/補足情報

「午後1時半から同3時半」はドキュメントの具体例に入っているもの。

[Bug] 千歳市に挟まれた日付表現で正しい`raw_text`と`raw_span`が得られない

🐛 Bug

説明

"千歳市...4月...千歳市" のような文字列をパースをして得られるtimexが持つraw_textが空文字列となり、raw_spanの開始インデックスが終了インデックスより大きくなる。

現状挙動

下記コードを実行すると

timexes = TimexParser().parse('千歳市では4月、千歳市の')
print(f'raw_span={timexes[0].raw_span}, raw_text={timexes[0].raw_text}, raw_span={timexes[0].text}, raw_text={timexes[0].span}')

次の出力が得られるが、

raw_span=(5, 4), raw_text=, raw_span=4月, raw_text=(8, 10)

raw_textが空文字, raw_span[0] > raw_span[1]となる。

理想の挙動

同入力の出力が以下の通りであり、

raw_span=(5, 7), raw_text=4月, raw_span=4月, raw_text=(8, 10)

raw_textが日付表現、 raw_span[0] < raw_span[1]となるべき。

再現方法やエラー内容

timexes = TimexParser().parse('千歳市では4月、千歳市の')
print(timexes[0].raw_span, timexes[0].raw_text)

実行環境

  • ja-timexのバージョン : 0.2.8
  • Pythonのバージョン : 3.8.10
  • OSの情報: Ubuntu 18.04

追加/補足情報

「千歳市が日付表現の前にのみ登場する」or「日付表現の後にのみ出現する」場合は上記挙動は見られない。

千歳市に挟まれる必要があるようです。

timexes = TimexParser().parse('千歳市では4月')
print(f'raw_span={timexes[0].raw_span}, raw_text={timexes[0].raw_text}, raw_span={timexes[0].text}, raw_text={timexes[0].span}')
# raw_span=(5, 7), raw_text=4月, raw_span=4月, raw_text=(8, 10)
timexes = TimexParser().parse('4月、千歳市の')
print(f'raw_span={timexes[0].raw_span}, raw_text={timexes[0].raw_text}, raw_span={timexes[0].text}, raw_text={timexes[0].span}')
# raw_span=(0, 2), raw_text=4月, raw_span=4月, raw_text=(0, 2)

[Bug] 漢数字の時刻表現のspanがずれる

🐛 Bug

説明

入力した文章から抽出したtimexがもっているspanの長さが想定していた長さとちがう。

現状挙動

text = "平成三十一年に起きた出来事はなんですか?"
timex = TimexParser().parse(text)
print(timex[0].span)
# (0,5)

理想の挙動

text = "平成三十一年に起きた出来事はなんですか?"
timex = TimexParser().parse(text)
print(timex[0].span)
# (0,6)

再現方法やエラー内容

実行環境

  • ja-timexのバージョン : 0.2.0
  • Pythonのバージョン : 3.8.10
  • OSの情報: MacOS Bigsur

追加/補足情報

もしかしてbugではなく、一度漢数字をアラビア数字にしたあと、spanをとっているのでしょうか?そういう仕様なのでしょうか?
もしそうでしたら、変更前の文字列のspan情報が欲しいというfeatureを投げたいです。

[Bug] Windows環境でテストが通らない

🐛 Bug

説明

GitHub ActionsのWindows環境にてtoxを実行したときに、pytestが通らなかった

現状挙動

Windows環境にてpytest実行時に下記エラーが発生する

____________________ ERROR collecting tests/test_timex.py _____________________
tests\test_timex.py:3: in <module>
    from ja_timex.tag import TIMEX
ja_timex\__init__.py:1: in <module>
    from ja_timex.timex import TimexParser  # noqa
ja_timex\timex.py:6: in <module>
    from ja_timex.tag import TIMEX
ja_timex\tag.py:7: in <module>
    from ja_timex.pattern.place import Pattern
ja_timex\pattern\place.py:9: in <module>
    wareki2year = json.load(f)
C:\hostedtoolcache\windows\Python\3.8.10\x64\lib\json\__init__.py:293: in load
    return loads(fp.read(),
C:\hostedtoolcache\windows\Python\3.8.10\x64\lib\encodings\cp1252.py:23: in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
E   UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 73: character maps to <undefined>

理想の挙動

Windows環境でテストが通る

再現方法やエラー内容

Close #6 by yagays · Pull Request #7 · yagays/ja-timex

実行環境

  • ja-timexのバージョン : 0.1.3
  • Pythonのバージョン : 3.8
  • OSの情報: Microsoft Windows Server 2019 10.0.17763

追加/補足情報

[Bug] 12:00〜17:30の抽出が失敗する

🐛 Bug

説明

「12:00〜17:30」「2/1〜2/14発売」が正しく抽出できない

現状挙動

In [3]: timexes
Out[3]:
[<TIMEX3 tid="t0" type="TIME" value="T12-00-XX" range_start="True" text="12:00">,
 <TIMEX3 tid="t1" type="TIME" value="T00-30-XX" text="00">,
 <TIMEX3 tid="t2" type="TIME" value="T17-30-XX" range_end="True" text="17:30">]

理想の挙動

[<TIMEX3 tid="t0" type="TIME" value="T12-30-XX" range_start="True" text="12:00">,
 <TIMEX3 tid="t1" type="TIME" value="T17-30-XX" range_end="True" text="17:30">]

再現方法やエラー内容

実行環境

  • ja-timexのバージョン : v0.2.0
  • Pythonのバージョン : 3.8
  • OSの情報: macOS 11.5.2(20G95)

追加/補足情報

[Modify Rules] ハイフンやドットを使った数字表現を除外する

📝 時間情報表現のルール

数値表現や電話番号、住所といったハイフンやドットを使った数値表現を読み取らないようにする

用例

千代田区1-1-1
12.3%
『3-4-3』というフォーメーション

時間表現への変換

読み取られない

追加/補足情報

[Modify Rules] 複数の日付間の範囲指定のrangeStartとrangeEndが対応しない

📝 時間情報表現のルール

「2012年5月30日(水)〜6月10日(日)」といった表現の際に、中間の2つに対してrangeStartとrangeEndが付与され、外側の2つには付与されない。

[<TIMEX3 tid="t0" type="DATE" value="2012-05-30" text="2012年5月30日">,
 <TIMEX3 tid="t1" type="DATE" value="XXXX-WXX-3" range_start="True" text="(水)">,
 <TIMEX3 tid="t2" type="DATE" value="XXXX-06-10" range_end="True" text="6月10日">,
 <TIMEX3 tid="t3" type="DATE" value="XXXX-WXX-7" text="(日)">]

用例

「2012年5月30日(水)〜6月10日(日)」

時間表現への変換

仕様を検討

追加/補足情報

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.