Skip to content

Commit effa164

Browse files
authored
[Python] Italian Number, Currency, DateTimeV2 to parity with .NET (microsoft#2913)
* Add Italian Number models * Adding the MergedNumberExtractor * Small fixes * Updating parser to merge joint numbers * Add Currency model * Support updated in numbers_with_unit_recognizer * Remove word boundary in regex for Italian numbers * Fix half past times and others based on ItalianTimeParserConfiguration.cs * Unskip working tests for Italian * Additional Italian fixes * Update Start and End values correctly for Italian Number and NumberWithUnit specs
1 parent 7ae1838 commit effa164

File tree

82 files changed

+9193
-1903
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+9193
-1903
lines changed

Patterns/Italian/Italian-DateTime.yaml

-3
Original file line numberDiff line numberDiff line change
@@ -393,9 +393,6 @@ TimeRegexWithDotConnector: !nestedRegex
393393
FirstTimeRegexInTimeRange: !nestedRegex
394394
def: \b{TimeRegexWithDotConnector}(\s*{DescRegex})?
395395
references: [ TimeRegexWithDotConnector, DescRegex ]
396-
HourRegex: !nestedRegex
397-
def: \b{BaseDateTime.HourRegex}
398-
references: [ BaseDateTime.HourRegex ]
399396
PeriodDescRegex: !simpleRegex
400397
def: (?<desc>pm|am|p\.m\.|a\.m\.)
401398
PeriodPmRegex: !simpleRegex

Python/libraries/recognizers-date-time/recognizers_date_time/date_time/date_time_recognizer.py

+9
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
from .portuguese.common_configs import PortugueseCommonDateTimeParserConfiguration
2323
from .portuguese.merged_extractor_config import PortugueseMergedExtractorConfiguration
2424
from .portuguese.merged_parser_config import PortugueseMergedParserConfiguration
25+
from .italian.common_configs import ItalianCommonDateTimeParserConfiguration
26+
from .italian.merged_extractor_config import ItalianMergedExtractorConfiguration
27+
from .italian.merged_parser_config import ItalianMergedParserConfiguration
2528

2629

2730
class DateTimeRecognizer(Recognizer[DateTimeOptions]):
@@ -68,6 +71,12 @@ def initialize_configuration(self):
6871
BaseMergedExtractor(PortugueseMergedExtractorConfiguration(), options)
6972
))
7073

74+
self.register_model('DateTimeModel', Culture.Italian, lambda options: DateTimeModel(
75+
BaseMergedParser(ItalianMergedParserConfiguration(
76+
ItalianCommonDateTimeParserConfiguration()), options),
77+
BaseMergedExtractor(ItalianMergedExtractorConfiguration(), options)
78+
))
79+
7180
def get_datetime_model(self, culture: str = None, fallback_to_default_culture: bool = True) -> Model:
7281
return self.get_model('DateTimeModel', culture, fallback_to_default_culture)
7382

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
from .base_configs import *
5+
from .common_configs import *
6+
from .duration_extractor_config import *
7+
from .date_extractor_config import *
8+
from .time_extractor_config import *
9+
from .datetime_extractor_config import *
10+
from .dateperiod_extractor_config import *
11+
from .timeperiod_extractor_config import *
12+
from .datetimeperiod_extractor_config import *
13+
from .set_extractor_config import *
14+
from .holiday_extractor_config import *
15+
from .merged_extractor_config import *
16+
from .duration_parser_config import *
17+
from .date_parser_config import *
18+
from .time_parser_config import *
19+
from .datetime_parser_config import *
20+
from .dateperiod_parser_config import *
21+
from .timeperiod_parser_config import *
22+
from .datetimeperiod_parser_config import *
23+
from .set_parser_config import *
24+
from .holiday_parser_config import *
25+
from .merged_parser_config import *
26+
from .parsers import *
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
from typing import Pattern
5+
from recognizers_text.utilities import RegExpUtility
6+
from ...resources.italian_date_time import ItalianDateTime
7+
from ..base_date import DateTimeUtilityConfiguration
8+
9+
10+
class ItalianDateTimeUtilityConfiguration(DateTimeUtilityConfiguration):
11+
@property
12+
def date_unit_regex(self) -> Pattern:
13+
return self._date_unit_regex
14+
15+
@property
16+
def check_both_before_after(self) -> Pattern:
17+
return self._check_both_before_after
18+
19+
@property
20+
def range_prefix_regex(self) -> Pattern:
21+
return self._range_prefix_regex
22+
23+
@property
24+
def ago_regex(self) -> Pattern:
25+
return self._ago_regex
26+
27+
@property
28+
def later_regex(self) -> Pattern:
29+
return self._later_regex
30+
31+
@property
32+
def in_connector_regex(self) -> Pattern:
33+
return self._in_connector_regex
34+
35+
@property
36+
def range_unit_regex(self) -> Pattern:
37+
return self._range_unit_regex
38+
39+
@property
40+
def am_desc_regex(self) -> Pattern:
41+
return self._am_desc_regex
42+
43+
@property
44+
def pm_desc__regex(self) -> Pattern:
45+
return self._pm_desc__regex
46+
47+
@property
48+
def am_pm_desc_regex(self) -> Pattern:
49+
return self._am_pm_desc_regex
50+
51+
@property
52+
def time_unit_regex(self) -> Pattern:
53+
return self._time_unit_regex
54+
55+
@property
56+
def within_next_prefix_regex(self) -> Pattern:
57+
return self._within_next_prefix_regex
58+
59+
@property
60+
def common_date_prefix_regex(self) -> Pattern:
61+
return self._common_date_prefix_regex
62+
63+
def __init__(self):
64+
self._later_regex = RegExpUtility.get_safe_reg_exp(
65+
ItalianDateTime.LaterRegex)
66+
self._ago_regex = RegExpUtility.get_safe_reg_exp(
67+
ItalianDateTime.AgoPrefixRegex)
68+
self._in_connector_regex = RegExpUtility.get_safe_reg_exp(
69+
ItalianDateTime.InConnectorRegex)
70+
self._range_unit_regex = RegExpUtility.get_safe_reg_exp(
71+
ItalianDateTime.RangeUnitRegex)
72+
self._am_desc_regex = RegExpUtility.get_safe_reg_exp(
73+
ItalianDateTime.AmDescRegex)
74+
self._pm_desc__regex = RegExpUtility.get_safe_reg_exp(
75+
ItalianDateTime.PmDescRegex)
76+
self._am_pm_desc_regex = RegExpUtility.get_safe_reg_exp(
77+
ItalianDateTime.AmPmDescRegex)
78+
self._time_unit_regex = RegExpUtility.get_safe_reg_exp(
79+
ItalianDateTime.TimeUnitRegex)
80+
self._within_next_prefix_regex = RegExpUtility.get_safe_reg_exp(
81+
ItalianDateTime.WithinNextPrefixRegex)
82+
self._common_date_prefix_regex = RegExpUtility.get_safe_reg_exp(
83+
ItalianDateTime.CommonDatePrefixRegex)
84+
self._check_both_before_after = ItalianDateTime.CheckBothBeforeAfter
85+
self._range_prefix_regex = RegExpUtility.get_safe_reg_exp(
86+
ItalianDateTime.RangePrefixRegex
87+
)
88+
self._date_unit_regex = RegExpUtility.get_safe_reg_exp(
89+
ItalianDateTime.DateUnitRegex
90+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
# Copyright (c) Microsoft Corporation. All rights reserved.
2+
# Licensed under the MIT License.
3+
4+
from typing import Dict, Pattern
5+
6+
from recognizers_number import BaseNumberExtractor, ItalianCardinalExtractor, ItalianIntegerExtractor, ItalianOrdinalExtractor, BaseNumberParser, ItalianNumberParserConfiguration
7+
8+
from ...resources import ItalianDateTime, BaseDateTime
9+
from ..extractors import DateTimeExtractor
10+
from ..parsers import DateTimeParser
11+
from ..base_configs import BaseDateParserConfiguration, DateTimeUtilityConfiguration
12+
from ..base_date import BaseDateExtractor, BaseDateParser
13+
from ..base_time import BaseTimeExtractor
14+
from ..base_duration import BaseDurationExtractor, BaseDurationParser
15+
from ..base_dateperiod import BaseDatePeriodExtractor, BaseDatePeriodParser
16+
from ..base_timeperiod import BaseTimePeriodExtractor, BaseTimePeriodParser
17+
from ..base_datetime import BaseDateTimeExtractor, BaseDateTimeParser
18+
from ..base_datetimeperiod import BaseDateTimePeriodExtractor, BaseDateTimePeriodParser
19+
from ..base_timezone import BaseTimeZoneParser
20+
from .base_configs import ItalianDateTimeUtilityConfiguration
21+
from .duration_extractor_config import ItalianDurationExtractorConfiguration
22+
from .date_extractor_config import ItalianDateExtractorConfiguration
23+
from .time_extractor_config import ItalianTimeExtractorConfiguration
24+
from .datetime_extractor_config import ItalianDateTimeExtractorConfiguration
25+
from .dateperiod_extractor_config import ItalianDatePeriodExtractorConfiguration
26+
from .timeperiod_extractor_config import ItalianTimePeriodExtractorConfiguration
27+
from .datetimeperiod_extractor_config import ItalianDateTimePeriodExtractorConfiguration
28+
from .duration_parser_config import ItalianDurationParserConfiguration
29+
from .date_parser_config import ItalianDateParserConfiguration
30+
from .time_parser_config import ItalianTimeParserConfiguration
31+
from .datetime_parser_config import ItalianDateTimeParserConfiguration
32+
from .dateperiod_parser_config import ItalianDatePeriodParserConfiguration
33+
from .timeperiod_parser_config import ItalianTimePeriodParserConfiguration
34+
from .datetimeperiod_parser_config import ItalianDateTimePeriodParserConfiguration
35+
from .parsers import ItalianTimeParser
36+
37+
38+
class ItalianCommonDateTimeParserConfiguration(BaseDateParserConfiguration):
39+
@property
40+
def time_zone_parser(self) -> DateTimeParser:
41+
self._time_zone_parser
42+
43+
@property
44+
def check_both_before_after(self) -> Pattern:
45+
return self._check_both_before_after
46+
47+
@property
48+
def cardinal_extractor(self) -> BaseNumberExtractor:
49+
return self._cardinal_extractor
50+
51+
@property
52+
def integer_extractor(self) -> BaseNumberExtractor:
53+
return self._integer_extractor
54+
55+
@property
56+
def ordinal_extractor(self) -> BaseNumberExtractor:
57+
return self._ordinal_extractor
58+
59+
@property
60+
def number_parser(self) -> BaseNumberParser:
61+
return self._number_parser
62+
63+
@property
64+
def date_extractor(self) -> DateTimeExtractor:
65+
return self._date_extractor
66+
67+
@property
68+
def time_extractor(self) -> DateTimeExtractor:
69+
return self._time_extractor
70+
71+
@property
72+
def date_time_extractor(self) -> DateTimeExtractor:
73+
return self._date_time_extractor
74+
75+
@property
76+
def duration_extractor(self) -> DateTimeExtractor:
77+
return self._duration_extractor
78+
79+
@property
80+
def date_period_extractor(self) -> DateTimeExtractor:
81+
return self._date_period_extractor
82+
83+
@property
84+
def time_period_extractor(self) -> DateTimeExtractor:
85+
return self._time_period_extractor
86+
87+
@property
88+
def date_time_period_extractor(self) -> DateTimeExtractor:
89+
return self._date_time_period_extractor
90+
91+
@property
92+
def date_parser(self) -> DateTimeParser:
93+
return self._date_parser
94+
95+
@property
96+
def time_parser(self) -> DateTimeParser:
97+
return self._time_parser
98+
99+
@property
100+
def date_time_parser(self) -> DateTimeParser:
101+
return self._date_time_parser
102+
103+
@property
104+
def duration_parser(self) -> DateTimeParser:
105+
return self._duration_parser
106+
107+
@property
108+
def date_period_parser(self) -> DateTimeParser:
109+
return self._date_period_parser
110+
111+
@property
112+
def time_period_parser(self) -> DateTimeParser:
113+
return self._time_period_parser
114+
115+
@property
116+
def date_time_period_parser(self) -> DateTimeParser:
117+
return self._date_time_period_parser
118+
119+
@property
120+
def month_of_year(self) -> Dict[str, int]:
121+
return self._month_of_year
122+
123+
@property
124+
def numbers(self) -> Dict[str, int]:
125+
return self._numbers
126+
127+
@property
128+
def unit_value_map(self) -> Dict[str, int]:
129+
return self._unit_value_map
130+
131+
@property
132+
def season_map(self) -> Dict[str, str]:
133+
return self._season_map
134+
135+
@property
136+
def unit_map(self) -> Dict[str, str]:
137+
return self._unit_map
138+
139+
@property
140+
def cardinal_map(self) -> Dict[str, int]:
141+
return self._cardinal_map
142+
143+
@property
144+
def day_of_week(self) -> Dict[str, int]:
145+
return self._day_of_week
146+
147+
@property
148+
def double_numbers(self) -> Dict[str, int]:
149+
return self._double_numbers
150+
151+
@property
152+
def utility_configuration(self) -> DateTimeUtilityConfiguration:
153+
return self._utility_configuration
154+
155+
def __init__(self):
156+
super().__init__()
157+
self._time_zone_parser = BaseTimeZoneParser()
158+
self._utility_configuration = ItalianDateTimeUtilityConfiguration()
159+
self._unit_map = ItalianDateTime.UnitMap
160+
self._unit_value_map = ItalianDateTime.UnitValueMap
161+
self._season_map = ItalianDateTime.SeasonMap
162+
self._cardinal_map = ItalianDateTime.CardinalMap
163+
self._day_of_week = ItalianDateTime.DayOfWeek
164+
self._month_of_year = ItalianDateTime.MonthOfYear
165+
self._numbers = ItalianDateTime.Numbers
166+
self._double_numbers = ItalianDateTime.DoubleNumbers
167+
self._check_both_before_after = ItalianDateTime.CheckBothBeforeAfter
168+
169+
self._cardinal_extractor = ItalianCardinalExtractor()
170+
self._integer_extractor = ItalianIntegerExtractor()
171+
self._ordinal_extractor = ItalianOrdinalExtractor()
172+
173+
self._day_of_month = {
174+
**BaseDateTime.DayOfMonthDictionary, **ItalianDateTime.DayOfMonth}
175+
self._number_parser = BaseNumberParser(
176+
ItalianNumberParserConfiguration())
177+
self._date_extractor = BaseDateExtractor(
178+
ItalianDateExtractorConfiguration())
179+
self._time_extractor = BaseTimeExtractor(
180+
ItalianTimeExtractorConfiguration())
181+
self._duration_extractor = BaseDurationExtractor(
182+
ItalianDurationExtractorConfiguration())
183+
self._date_period_extractor = BaseDatePeriodExtractor(
184+
ItalianDatePeriodExtractorConfiguration())
185+
self._time_period_extractor = BaseTimePeriodExtractor(
186+
ItalianTimePeriodExtractorConfiguration())
187+
self._date_time_extractor = BaseDateTimeExtractor(
188+
ItalianDateTimeExtractorConfiguration())
189+
self._date_time_period_extractor = BaseDateTimePeriodExtractor(
190+
ItalianDateTimePeriodExtractorConfiguration())
191+
self._duration_parser = BaseDurationParser(
192+
ItalianDurationParserConfiguration(self))
193+
self._date_parser = BaseDateParser(ItalianDateParserConfiguration(self))
194+
self._time_parser = ItalianTimeParser(
195+
ItalianTimeParserConfiguration(self))
196+
self._date_period_parser = BaseDatePeriodParser(
197+
ItalianDatePeriodParserConfiguration(self))
198+
self._time_period_parser = BaseTimePeriodParser(
199+
ItalianTimePeriodParserConfiguration(self))
200+
self._date_time_parser = BaseDateTimeParser(
201+
ItalianDateTimeParserConfiguration(self))
202+
self._date_time_period_parser = BaseDateTimePeriodParser(
203+
ItalianDateTimePeriodParserConfiguration(self))

0 commit comments

Comments
 (0)