- Machine Learning Enginner at Uibe, inc.
- (JP)ユビーAI受診相談, (US)Ubie AI Symptom Checker
yagays / ja-timex Goto Github PK
View Code? Open in Web Editor NEW自然言語で書かれた時間情報表現を抽出/規格化するルールベースの解析器
License: MIT License
自然言語で書かれた時間情報表現を抽出/規格化するルールベースの解析器
License: MIT License
Custom Taggerの使い方を説明する
Custom Taggerの説明を読んで実行できる状態になっている
見る感じ依存ライブラリ2つが現状対応していないため、Python3.12環境にインストールできない状態になっています
インストール時にエラーが出る。エラーについては補足情報のIssueを参照
普通にpip installできる
Python3.12環境でpip install
https://github.com/sdispater/pendulum
Pendulum v2.1系はPython3.12に対応していません。廃止されたsetuptoolsが影響していそうです。
sdispater/pendulum#696
そして2.1系をこれ以上アップデートする意志はないようです。なので3系への切り替えが必要です。
ただ、3系は今のところ安定版のリリースがされていません。
ver3.0.0bが存在しており、実装そのものはおおむね仕上がってそうに見えます。
https://github.com/studio-ousia/mojimoji
mojimojiはPython3.12に対応していません。Unicode周りのAPIが廃止された影響を受けています。
studio-ousia/mojimoji#24
ただ、このライブラリはそれほど複雑なことをやっていなさそうに見えます。
他のライブラリへの切り替えや、同様の挙動をする自前実装への切り替えを検討しても良いのかもしれません。
私が作った修正差分が一応存在しています。studio-ousia/mojimoji#25
今夜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時">]
早速使わせていただいています。是非ご検討のほどお願いします。
不足情報を補う際に基準日を設定して、その年/月/日を利用できるようにする
TimexParser
のコンストラクタで設定する
timex_parser = TimexParser(ts=datetime(2020,7,18))
ctparse
の挙動を参考。
"毎年6月"が"年6月"と判定される
In []: timex_parser.parse("毎年6月")
Out[]: [<TIMEX3 tid="t0" type="SET" value="P1Y" freq="P6M" text="年6月">]
毎年
と6月
で読み取られる
"毎年6月"を解析する
漢数字からアラビア数字への変換を無効にするオプションの追加
以下のように引数を渡す。
timex_parser = TimexParser(ignroe_kansuji=True)
日付表現に半や午後(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
「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
として取得されている。
「生誕100年」や「そろそろ1年が経過しようとしている」に対してDATEとして抽出
DURATIONとして抽出される
Out[]: [<TIMEX3 tid="t0" type="DURATION" value="P100Y" text="100年">]
Out[]: [<TIMEX3 tid="t0" type="DURATION" value="P1Y" text="1年">]
範囲表現に「翌」や「同」が入っていても範囲表現とする
「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時半」はドキュメントの具体例に入っているもの。
"千歳市...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)
「千歳市が日付表現の前にのみ登場する」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)
入力した文章から抽出したtimexがもっているspanの長さが想定していた長さとちがう。
text = "平成三十一年に起きた出来事はなんですか?"
timex = TimexParser().parse(text)
print(timex[0].span)
# (0,5)
text = "平成三十一年に起きた出来事はなんですか?"
timex = TimexParser().parse(text)
print(timex[0].span)
# (0,6)
もしかしてbugではなく、一度漢数字をアラビア数字にしたあと、spanをとっているのでしょうか?そういう仕様なのでしょうか?
もしそうでしたら、変更前の文字列のspan情報が欲しいというfeatureを投げたいです。
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
「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">]
数値表現や電話番号、住所といったハイフンやドットを使った数値表現を読み取らないようにする
千代田区1-1-1
12.3%
『3-4-3』というフォーメーション
読み取られない
「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日(日)」
仕様を検討
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.