NormalizeNumExp for Python
Project description
pyNormalizeNumexp
数量表現や時間表現の抽出・正規化を行うNormalizeNumexpのPython実装です。
本家でもSWIGによるPythonバインディングが提供されていますが、NormalizeNumexp本体のインストールでトラブルに遭うことが多いため、全実装をPythonに移植しました。
Prerequisites
Python >=3.9
, <=3.12
Installation
pip install pynormalizenumexp
Usage
from pynormalizenumexp.normalize_numexp import NormalizeNumexp
normalizer = NormalizeNumexp("ja")
results = normalizer.normalize("魔女狩りは15世紀~18世紀にかけてみられ、全ヨーロッパで4万人が処刑された", as_dict=True)
for r in results:
print(r)
# {'type': 'abstime', 'original_expr': '15世紀~18世紀', 'position_start': 5, 'position_end': 14, 'counter': 'none', 'value_lower_bound': {'year': 1401, 'month': inf, 'day': inf, 'hour': inf, 'minute': inf, 'second': inf}, 'value_upper_bound': {'year': 1800, 'month': -inf, 'day': -inf, 'hour': -inf, 'minute': -inf, 'second': -inf}, 'value_lower_bound_abs': None, 'value_upper_bound_abs': None, 'value_lower_bound_rel': None, 'value_upper_bound_rel': None, 'options': []}
# {'type': 'numerical', 'original_expr': '4万人', 'position_start': 29, 'position_end': 32, 'counter': '人', 'value_lower_bound': 40000, 'value_upper_bound': 40000, 'value_lower_bound_abs': None, 'value_upper_bound_abs': None, 'value_lower_bound_rel': None, 'value_upper_bound_rel': None, 'options': []}
NormalizeNumexp
クラスの引数に言語識別子を指定します。(例:日本語であればja
)- 本家では英語
en
や中国語zh
にも対応していますが、本ライブラリでは日本語のみに対応しています。(将来的には英語・中国語も入れる予定です)
- 本家では英語
NormalizeNumexp
クラスのnormalize
関数に抽出・正規化対象のテキストを指定します。as_dict
引数にTrue
を指定することで、返り値の数量・時間表現のオブジェクトがdict
型になります。- 数量・時間表現のオブジェクトの属性については
Expression
クラスを参照してください。
- 数量・時間表現のオブジェクトの属性については
- 返り値が
dict
型の場合のデータ構造は以下の通りです。{ "type": str, # 表現種別(numerical:数量、abstime:絶対時間、reltime:相対時間、duration:期間) "original_expr": str, # 数値・時間表現の文字列 "position_start": int, # 抽出元テキストにおける開始位置 "position_end": int, # 抽出元テキストにおける終了位置 "counter": str, # 「人」や「匹」などの単位(typeがnumerical以外の場合は "none" になる) "value_lower_bound": None | int | float | Dict[str, int | float], # ※1 "value_upper_bound": None | int | float | Dict[str, int | float], # ※1 "value_lower_bound_abs": None | Dict[str, int | float], # ※2 "value_upper_bound_abs": None | Dict[str, int | float], # ※2 "value_lower_bound_rel": None | Dict[str, int | float], # ※3 "value_upper_bound_rel": None | Dict[str, int | float], # ※3 "options": List[str] }
- ※1:数量・時間表現の下限値(lower)・上限値(upper)が入るが、
type
によって値の種類が変化します。numerical
の場合:int
またはfloat
- 例:
15.3ポイント
の場合は下限・上限ともに15.3
- 例:
1~2人
の場合は下限が1
、上限が2
- 例:
abstime
またはduration
の場合:Dict[str, int | float]
- 例:
2021年1月1日
の場合は下限・上限ともに{"year": 2021, "month": 1, "day": 1}
(hour
,minute
,second
は該当する情報がないのでinf
または-inf
になります) - 例:
3/3~3/5
の場合は下限が{"month": 3, "day": 3}
、上限が{"month": 3, "day": 5}
(year
,hour
,minute
,second
は該当する情報がないのでinf
または-inf
になります) - 例:
100年間
の場合は下限・上限ともに{"year": 100}
(month
,day
,hour
,minute
,second
は該当する情報がないのでinf
または-inf
になります)
- 例:
reltime
の場合:None
- ※2:
type
がreltime
の場合に絶対時間表現の下限値(lower)・上限値(upper)が入ります。(その他のtype
の場合はNone
になります)- 例:
昨年3月
の場合は下限・上限ともに{"month": 3}
(year
,day
,hour
,minute
,second
は該当する情報がないのでinf
または-inf
になります)
- 例:
- ※3:
type
がreltime
の場合に相対時間表現の下限値(lower)・上限値(upper)が入ります。(その他のtype
の場合はNone
になります)- 例:
昨年3月
の場合は下限・上限ともに{"year": -1}
(month
,day
,hour
,minute
,second
は該当する情報がないのでinf
または-inf
になります) - 例:
15年前
の場合下限・上限ともに{"year": -15}
(month
,day
,hour
,minute
,second
は該当する情報がないのでinf
または-inf
になります)
- 例:
- ※1:数量・時間表現の下限値(lower)・上限値(upper)が入るが、
抽出する数値表現パターンを追加したい場合
予め用意した辞書に定義されていないパターンの数値表現を抽出したい場合、カスタム辞書ファイルを別途定義して読み込ませることができます。
任意のディレクトリにJSON形式の辞書ファイル(以下の例では/path/to/custom_dict.json
)を定義し、NormalizeNumexp
クラスの第2引数に辞書ファイルのパスを指定することで反映することができます。
辞書の作り方についてはこちらを参照してください。
from pynormalizenumexp.normalize_numexp import NormalizeNumexp
normalizer = NormalizeNumexp("ja", "/path/to/custom_dict.json")
results = normalizer.normalize("メールに2ファイル添付する", as_dict=True)
免責事項
- 本ライブラリの作成にあたり、単体テスト等で動作確認はしていますが、ケースによっては期待通りの振る舞いをしない可能性があります
- 本ライブラリの利用により、万一、利用者に何らかの不都合や損害が発生したとしても、作者は何らの責任を負うものではありません
Special thanks
- 東北大学 乾・鈴木研究室
- nullnull/normalizeNumexp(本家実装)
- cotogoto/normalize-numexp(Java移植版)
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
pynormalizenumexp-0.3.4.tar.gz
(99.3 kB
view details)
Built Distribution
File details
Details for the file pynormalizenumexp-0.3.4.tar.gz
.
File metadata
- Download URL: pynormalizenumexp-0.3.4.tar.gz
- Upload date:
- Size: 99.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.11.9 Linux/6.5.0-1018-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3d313f9410b2714c6db8b9d0f06e24b85e865589a923d8315e36f98d2834fd29 |
|
MD5 | 425e0fa4ac294b0dab0386e047ba4ccb |
|
BLAKE2b-256 | b83b77db9985858cfdfe63cad88a79ca7cfc124ed4ffd665fee450cf37878378 |
File details
Details for the file pynormalizenumexp-0.3.4-py3-none-any.whl
.
File metadata
- Download URL: pynormalizenumexp-0.3.4-py3-none-any.whl
- Upload date:
- Size: 123.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.2 CPython/3.11.9 Linux/6.5.0-1018-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9dc144d4024329cb58dad333f361574fc175f1ff0f6028923ae666e98ff190a5 |
|
MD5 | f83b32d774f4d056638aeb2a9559935b |
|
BLAKE2b-256 | 70641eca8ff423ec805cf207e726184ae57222d9050144e213ceaaa2cc132cb7 |