[![PyPI version](https://badge.fury.io/py/pynormalizenumexp.svg)](https://badge.fury.io/py/pynormalizenumexp)
[![Python Versions](https://img.shields.io/pypi/pyversions/pynormalizenumexp.svg)](https://pypi.org/project/pynormalizenumexp/)
[![pytest](https://github.com/tkscode/pyNormalizeNumExp/actions/workflows/build.yml/badge.svg)](https://github.com/tkscode/pyNormalizeNumExp/actions/workflows/build.yml)
[![codecov](https://codecov.io/gh/tkscode/pyNormalizeNumExp/graph/badge.svg?token=3Z0YIZV5U1)](https://codecov.io/gh/tkscode/pyNormalizeNumExp)
# pyNormalizeNumexp
数量表現や時間表現の抽出・正規化を行う[NormalizeNumexp](https://www.cl.ecei.tohoku.ac.jp/Open_Resources-normalizeNumexp.html)のPython実装です。
本家でもSWIGによるPythonバインディングが提供されていますが、NormalizeNumexp本体のインストールでトラブルに遭うことが多いため、全実装をPythonに移植しました。
## Prerequisites
Python `>=3.9`, `<=3.12`
## Installation
```
pip install pynormalizenumexp
```
## Usage
```python
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`](./pynormalizenumexp/normalize_numexp.py#L19)クラスを参照してください。
+ 返り値が`dict`型の場合のデータ構造は以下の通りです。
```python
{
"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`になります)
### 抽出する数値表現パターンを追加したい場合
[予め用意した辞書](./pynormalizenumexp/resources/dict/ja/)に定義されていないパターンの数値表現を抽出したい場合、カスタム辞書ファイルを別途定義して読み込ませることができます。
任意のディレクトリにJSON形式の辞書ファイル(以下の例では`/path/to/custom_dict.json`)を定義し、`NormalizeNumexp`クラスの第2引数に辞書ファイルのパスを指定することで反映することができます。
辞書の作り方については[こちら](./pynormalizenumexp/resources/dict/README.md)を参照してください。
```python
from pynormalizenumexp.normalize_numexp import NormalizeNumexp
normalizer = NormalizeNumexp("ja", "/path/to/custom_dict.json")
results = normalizer.normalize("メールに2ファイル添付する", as_dict=True)
```
## 免責事項
+ 本ライブラリの作成にあたり、単体テスト等で動作確認はしていますが、ケースによっては期待通りの振る舞いをしない可能性があります
+ 本ライブラリの利用により、万一、利用者に何らかの不都合や損害が発生したとしても、作者は何らの責任を負うものではありません
## Special thanks
+ [東北大学 乾・鈴木研究室](https://www.cl.ecei.tohoku.ac.jp/Open_Resources-normalizeNumexp.html)
+ [nullnull/normalizeNumexp](https://github.com/nullnull/normalizeNumexp)(本家実装)
+ [cotogoto/normalize-numexp](https://github.com/cotogoto/normalize-numexp)(Java移植版)
Raw data
{
"_id": null,
"home_page": "https://github.com/tkscode/pyNormalizeNumExp",
"name": "pynormalizenumexp",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.9",
"maintainer_email": null,
"keywords": "Python, NLP, NormalizeNumExp",
"author": "tkscode",
"author_email": null,
"download_url": "https://files.pythonhosted.org/packages/b8/3b/77db9985858cfdfe63cad88a79ca7cfc124ed4ffd665fee450cf37878378/pynormalizenumexp-0.3.4.tar.gz",
"platform": null,
"description": "[![PyPI version](https://badge.fury.io/py/pynormalizenumexp.svg)](https://badge.fury.io/py/pynormalizenumexp)\n[![Python Versions](https://img.shields.io/pypi/pyversions/pynormalizenumexp.svg)](https://pypi.org/project/pynormalizenumexp/)\n[![pytest](https://github.com/tkscode/pyNormalizeNumExp/actions/workflows/build.yml/badge.svg)](https://github.com/tkscode/pyNormalizeNumExp/actions/workflows/build.yml)\n[![codecov](https://codecov.io/gh/tkscode/pyNormalizeNumExp/graph/badge.svg?token=3Z0YIZV5U1)](https://codecov.io/gh/tkscode/pyNormalizeNumExp)\n\n\n# pyNormalizeNumexp\n\n\u6570\u91cf\u8868\u73fe\u3084\u6642\u9593\u8868\u73fe\u306e\u62bd\u51fa\u30fb\u6b63\u898f\u5316\u3092\u884c\u3046[NormalizeNumexp](https://www.cl.ecei.tohoku.ac.jp/Open_Resources-normalizeNumexp.html)\u306ePython\u5b9f\u88c5\u3067\u3059\u3002 \n\u672c\u5bb6\u3067\u3082SWIG\u306b\u3088\u308bPython\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u307e\u3059\u304c\u3001NormalizeNumexp\u672c\u4f53\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u30c8\u30e9\u30d6\u30eb\u306b\u906d\u3046\u3053\u3068\u304c\u591a\u3044\u305f\u3081\u3001\u5168\u5b9f\u88c5\u3092Python\u306b\u79fb\u690d\u3057\u307e\u3057\u305f\u3002\n\n\n## Prerequisites\n\nPython `>=3.9`, `<=3.12`\n\n\n## Installation\n\n```\npip install pynormalizenumexp\n```\n\n\n## Usage\n\n```python\nfrom pynormalizenumexp.normalize_numexp import NormalizeNumexp\n\nnormalizer = NormalizeNumexp(\"ja\")\n\nresults = normalizer.normalize(\"\u9b54\u5973\u72e9\u308a\u306f15\u4e16\u7d00\uff5e18\u4e16\u7d00\u306b\u304b\u3051\u3066\u307f\u3089\u308c\u3001\u5168\u30e8\u30fc\u30ed\u30c3\u30d1\u30674\u4e07\u4eba\u304c\u51e6\u5211\u3055\u308c\u305f\", as_dict=True)\nfor r in results:\n\tprint(r)\n# {'type': 'abstime', 'original_expr': '15\u4e16\u7d00\uff5e18\u4e16\u7d00', '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': []}\n# {'type': 'numerical', 'original_expr': '4\u4e07\u4eba', 'position_start': 29, 'position_end': 32, 'counter': '\u4eba', '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': []}\n```\n\n+ `NormalizeNumexp`\u30af\u30e9\u30b9\u306e\u5f15\u6570\u306b\u8a00\u8a9e\u8b58\u5225\u5b50\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\uff08\u4f8b\uff1a\u65e5\u672c\u8a9e\u3067\u3042\u308c\u3070`ja`\uff09\n\t+ \u672c\u5bb6\u3067\u306f\u82f1\u8a9e`en`\u3084\u4e2d\u56fd\u8a9e`zh`\u306b\u3082\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u672c\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u306f\u65e5\u672c\u8a9e\u306e\u307f\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u307e\u3059\u3002\uff08\u5c06\u6765\u7684\u306b\u306f\u82f1\u8a9e\u30fb\u4e2d\u56fd\u8a9e\u3082\u5165\u308c\u308b\u4e88\u5b9a\u3067\u3059\uff09\n+ `NormalizeNumexp`\u30af\u30e9\u30b9\u306e`normalize`\u95a2\u6570\u306b\u62bd\u51fa\u30fb\u6b63\u898f\u5316\u5bfe\u8c61\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\n\t+ `as_dict`\u5f15\u6570\u306b`True`\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001\u8fd4\u308a\u5024\u306e\u6570\u91cf\u30fb\u6642\u9593\u8868\u73fe\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c`dict`\u578b\u306b\u306a\u308a\u307e\u3059\u3002\n\t\t+ \u6570\u91cf\u30fb\u6642\u9593\u8868\u73fe\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u5c5e\u6027\u306b\u3064\u3044\u3066\u306f[`Expression`](./pynormalizenumexp/normalize_numexp.py#L19)\u30af\u30e9\u30b9\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n+ \u8fd4\u308a\u5024\u304c`dict`\u578b\u306e\u5834\u5408\u306e\u30c7\u30fc\u30bf\u69cb\u9020\u306f\u4ee5\u4e0b\u306e\u901a\u308a\u3067\u3059\u3002\n\t```python\n\t{\n\t\t\"type\": str, # \u8868\u73fe\u7a2e\u5225\uff08numerical\uff1a\u6570\u91cf\u3001abstime\uff1a\u7d76\u5bfe\u6642\u9593\u3001reltime\uff1a\u76f8\u5bfe\u6642\u9593\u3001duration\uff1a\u671f\u9593\uff09\n\t\t\"original_expr\": str, # \u6570\u5024\u30fb\u6642\u9593\u8868\u73fe\u306e\u6587\u5b57\u5217\n\t\t\"position_start\": int, # \u62bd\u51fa\u5143\u30c6\u30ad\u30b9\u30c8\u306b\u304a\u3051\u308b\u958b\u59cb\u4f4d\u7f6e\n\t\t\"position_end\": int, # \u62bd\u51fa\u5143\u30c6\u30ad\u30b9\u30c8\u306b\u304a\u3051\u308b\u7d42\u4e86\u4f4d\u7f6e\n\t\t\"counter\": str, # \u300c\u4eba\u300d\u3084\u300c\u5339\u300d\u306a\u3069\u306e\u5358\u4f4d\uff08type\u304cnumerical\u4ee5\u5916\u306e\u5834\u5408\u306f \"none\" \u306b\u306a\u308b\uff09\n\t\t\"value_lower_bound\": None | int | float | Dict[str, int | float], # \u203b1\n\t\t\"value_upper_bound\": None | int | float | Dict[str, int | float], # \u203b1\n\t\t\"value_lower_bound_abs\": None | Dict[str, int | float], # \u203b2\n\t\t\"value_upper_bound_abs\": None | Dict[str, int | float], # \u203b2\n\t\t\"value_lower_bound_rel\": None | Dict[str, int | float], # \u203b3\n\t\t\"value_upper_bound_rel\": None | Dict[str, int | float], # \u203b3\n\t\t\"options\": List[str]\n\t}\n\t```\n\t+ \u203b1\uff1a\u6570\u91cf\u30fb\u6642\u9593\u8868\u73fe\u306e\u4e0b\u9650\u5024\uff08lower\uff09\u30fb\u4e0a\u9650\u5024\uff08upper\uff09\u304c\u5165\u308b\u304c\u3001`type`\u306b\u3088\u3063\u3066\u5024\u306e\u7a2e\u985e\u304c\u5909\u5316\u3057\u307e\u3059\u3002\n\t\t+ `numerical`\u306e\u5834\u5408\uff1a`int`\u307e\u305f\u306f`float`\n\t\t\t+ \u4f8b\uff1a`15.3\u30dd\u30a4\u30f3\u30c8`\u306e\u5834\u5408\u306f\u4e0b\u9650\u30fb\u4e0a\u9650\u3068\u3082\u306b`15.3`\n\t\t\t+ \u4f8b\uff1a`1\uff5e2\u4eba`\u306e\u5834\u5408\u306f\u4e0b\u9650\u304c`1`\u3001\u4e0a\u9650\u304c`2`\n\t\t+ `abstime`\u307e\u305f\u306f`duration`\u306e\u5834\u5408\uff1a`Dict[str, int | float]`\n\t\t\t+ \u4f8b\uff1a`2021\u5e741\u67081\u65e5`\u306e\u5834\u5408\u306f\u4e0b\u9650\u30fb\u4e0a\u9650\u3068\u3082\u306b`{\"year\": 2021, \"month\": 1, \"day\": 1}`\uff08`hour`, `minute`, `second`\u306f\u8a72\u5f53\u3059\u308b\u60c5\u5831\u304c\u306a\u3044\u306e\u3067`inf`\u307e\u305f\u306f`-inf`\u306b\u306a\u308a\u307e\u3059\uff09\n\t\t\t+ \u4f8b\uff1a`3/3\uff5e3/5`\u306e\u5834\u5408\u306f\u4e0b\u9650\u304c`{\"month\": 3, \"day\": 3}`\u3001\u4e0a\u9650\u304c`{\"month\": 3, \"day\": 5}`\uff08`year`, `hour`, `minute`, `second`\u306f\u8a72\u5f53\u3059\u308b\u60c5\u5831\u304c\u306a\u3044\u306e\u3067`inf`\u307e\u305f\u306f`-inf`\u306b\u306a\u308a\u307e\u3059\uff09\n\t\t\t+ \u4f8b\uff1a`100\u5e74\u9593`\u306e\u5834\u5408\u306f\u4e0b\u9650\u30fb\u4e0a\u9650\u3068\u3082\u306b`{\"year\": 100}`\uff08`month`, `day`, `hour`, `minute`, `second`\u306f\u8a72\u5f53\u3059\u308b\u60c5\u5831\u304c\u306a\u3044\u306e\u3067`inf`\u307e\u305f\u306f`-inf`\u306b\u306a\u308a\u307e\u3059\uff09\n\t\t+ `reltime`\u306e\u5834\u5408\uff1a`None`\n\t+ \u203b2\uff1a`type`\u304c`reltime`\u306e\u5834\u5408\u306b\u7d76\u5bfe\u6642\u9593\u8868\u73fe\u306e\u4e0b\u9650\u5024\uff08lower\uff09\u30fb\u4e0a\u9650\u5024\uff08upper\uff09\u304c\u5165\u308a\u307e\u3059\u3002\uff08\u305d\u306e\u4ed6\u306e`type`\u306e\u5834\u5408\u306f`None`\u306b\u306a\u308a\u307e\u3059\uff09\n\t\t+ \u4f8b\uff1a`\u6628\u5e743\u6708`\u306e\u5834\u5408\u306f\u4e0b\u9650\u30fb\u4e0a\u9650\u3068\u3082\u306b`{\"month\": 3}`\uff08`year`, `day`, `hour`, `minute`, `second`\u306f\u8a72\u5f53\u3059\u308b\u60c5\u5831\u304c\u306a\u3044\u306e\u3067`inf`\u307e\u305f\u306f`-inf`\u306b\u306a\u308a\u307e\u3059\uff09\n\t+ \u203b3\uff1a`type`\u304c`reltime`\u306e\u5834\u5408\u306b\u76f8\u5bfe\u6642\u9593\u8868\u73fe\u306e\u4e0b\u9650\u5024\uff08lower\uff09\u30fb\u4e0a\u9650\u5024\uff08upper\uff09\u304c\u5165\u308a\u307e\u3059\u3002\uff08\u305d\u306e\u4ed6\u306e`type`\u306e\u5834\u5408\u306f`None`\u306b\u306a\u308a\u307e\u3059\uff09\n\t\t+ \u4f8b\uff1a`\u6628\u5e743\u6708`\u306e\u5834\u5408\u306f\u4e0b\u9650\u30fb\u4e0a\u9650\u3068\u3082\u306b`{\"year\": -1}`\uff08`month`, `day`, `hour`, `minute`, `second`\u306f\u8a72\u5f53\u3059\u308b\u60c5\u5831\u304c\u306a\u3044\u306e\u3067`inf`\u307e\u305f\u306f`-inf`\u306b\u306a\u308a\u307e\u3059\uff09\n\t\t+ \u4f8b\uff1a`15\u5e74\u524d`\u306e\u5834\u5408\u4e0b\u9650\u30fb\u4e0a\u9650\u3068\u3082\u306b`{\"year\": -15}`\uff08`month`, `day`, `hour`, `minute`, `second`\u306f\u8a72\u5f53\u3059\u308b\u60c5\u5831\u304c\u306a\u3044\u306e\u3067`inf`\u307e\u305f\u306f`-inf`\u306b\u306a\u308a\u307e\u3059\uff09\n\n### \u62bd\u51fa\u3059\u308b\u6570\u5024\u8868\u73fe\u30d1\u30bf\u30fc\u30f3\u3092\u8ffd\u52a0\u3057\u305f\u3044\u5834\u5408\n\n[\u4e88\u3081\u7528\u610f\u3057\u305f\u8f9e\u66f8](./pynormalizenumexp/resources/dict/ja/)\u306b\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u306a\u3044\u30d1\u30bf\u30fc\u30f3\u306e\u6570\u5024\u8868\u73fe\u3092\u62bd\u51fa\u3057\u305f\u3044\u5834\u5408\u3001\u30ab\u30b9\u30bf\u30e0\u8f9e\u66f8\u30d5\u30a1\u30a4\u30eb\u3092\u5225\u9014\u5b9a\u7fa9\u3057\u3066\u8aad\u307f\u8fbc\u307e\u305b\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\n\n\u4efb\u610f\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306bJSON\u5f62\u5f0f\u306e\u8f9e\u66f8\u30d5\u30a1\u30a4\u30eb\uff08\u4ee5\u4e0b\u306e\u4f8b\u3067\u306f`/path/to/custom_dict.json`\uff09\u3092\u5b9a\u7fa9\u3057\u3001`NormalizeNumexp`\u30af\u30e9\u30b9\u306e\u7b2c2\u5f15\u6570\u306b\u8f9e\u66f8\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30b9\u3092\u6307\u5b9a\u3059\u308b\u3053\u3068\u3067\u53cd\u6620\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 \n\u8f9e\u66f8\u306e\u4f5c\u308a\u65b9\u306b\u3064\u3044\u3066\u306f[\u3053\u3061\u3089](./pynormalizenumexp/resources/dict/README.md)\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n```python\nfrom pynormalizenumexp.normalize_numexp import NormalizeNumexp\n\nnormalizer = NormalizeNumexp(\"ja\", \"/path/to/custom_dict.json\")\n\nresults = normalizer.normalize(\"\u30e1\u30fc\u30eb\u306b2\u30d5\u30a1\u30a4\u30eb\u6dfb\u4ed8\u3059\u308b\", as_dict=True)\n```\n\n\n## \u514d\u8cac\u4e8b\u9805\n\n+ \u672c\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u4f5c\u6210\u306b\u3042\u305f\u308a\u3001\u5358\u4f53\u30c6\u30b9\u30c8\u7b49\u3067\u52d5\u4f5c\u78ba\u8a8d\u306f\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u30b1\u30fc\u30b9\u306b\u3088\u3063\u3066\u306f\u671f\u5f85\u901a\u308a\u306e\u632f\u308b\u821e\u3044\u3092\u3057\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\n+ \u672c\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u5229\u7528\u306b\u3088\u308a\u3001\u4e07\u4e00\u3001\u5229\u7528\u8005\u306b\u4f55\u3089\u304b\u306e\u4e0d\u90fd\u5408\u3084\u640d\u5bb3\u304c\u767a\u751f\u3057\u305f\u3068\u3057\u3066\u3082\u3001\u4f5c\u8005\u306f\u4f55\u3089\u306e\u8cac\u4efb\u3092\u8ca0\u3046\u3082\u306e\u3067\u306f\u3042\u308a\u307e\u305b\u3093\n\n\n## Special thanks\n\n+ [\u6771\u5317\u5927\u5b66 \u4e7e\u30fb\u9234\u6728\u7814\u7a76\u5ba4](https://www.cl.ecei.tohoku.ac.jp/Open_Resources-normalizeNumexp.html)\n+ [nullnull/normalizeNumexp](https://github.com/nullnull/normalizeNumexp)\uff08\u672c\u5bb6\u5b9f\u88c5\uff09\n+ [cotogoto/normalize-numexp](https://github.com/cotogoto/normalize-numexp)\uff08Java\u79fb\u690d\u7248\uff09\n",
"bugtrack_url": null,
"license": "BSD 3-Clause",
"summary": "NormalizeNumExp for Python",
"version": "0.3.4",
"project_urls": {
"Homepage": "https://github.com/tkscode/pyNormalizeNumExp",
"Repository": "https://github.com/tkscode/pyNormalizeNumExp"
},
"split_keywords": [
"python",
" nlp",
" normalizenumexp"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "70641eca8ff423ec805cf207e726184ae57222d9050144e213ceaaa2cc132cb7",
"md5": "f83b32d774f4d056638aeb2a9559935b",
"sha256": "9dc144d4024329cb58dad333f361574fc175f1ff0f6028923ae666e98ff190a5"
},
"downloads": -1,
"filename": "pynormalizenumexp-0.3.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "f83b32d774f4d056638aeb2a9559935b",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.9",
"size": 123889,
"upload_time": "2024-04-28T10:57:57",
"upload_time_iso_8601": "2024-04-28T10:57:57.976842Z",
"url": "https://files.pythonhosted.org/packages/70/64/1eca8ff423ec805cf207e726184ae57222d9050144e213ceaaa2cc132cb7/pynormalizenumexp-0.3.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "b83b77db9985858cfdfe63cad88a79ca7cfc124ed4ffd665fee450cf37878378",
"md5": "425e0fa4ac294b0dab0386e047ba4ccb",
"sha256": "3d313f9410b2714c6db8b9d0f06e24b85e865589a923d8315e36f98d2834fd29"
},
"downloads": -1,
"filename": "pynormalizenumexp-0.3.4.tar.gz",
"has_sig": false,
"md5_digest": "425e0fa4ac294b0dab0386e047ba4ccb",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.9",
"size": 99332,
"upload_time": "2024-04-28T10:57:59",
"upload_time_iso_8601": "2024-04-28T10:57:59.676192Z",
"url": "https://files.pythonhosted.org/packages/b8/3b/77db9985858cfdfe63cad88a79ca7cfc124ed4ffd665fee450cf37878378/pynormalizenumexp-0.3.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-04-28 10:57:59",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tkscode",
"github_project": "pyNormalizeNumExp",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"tox": true,
"lcname": "pynormalizenumexp"
}