diff --git a/Jenkinsfile b/Jenkinsfile index 039504611..ad1066a76 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -28,7 +28,7 @@ pipeline { MR_TN_CACHE='/home/jenkins/TestData/text_norm/ci/grammars/03-12-24-1' JA_TN_CACHE='/home/jenkins/TestData/text_norm/ci/grammars/10-17-24-1' KO_TN_CACHE='/home/jenkins/TestData/text_norm/ci/grammars/04-23-26-0' - HI_TN_CACHE='/home/jenkins/TestData/text_norm/ci/grammars/06-25-26-0' + HI_TN_CACHE='/home/jenkins/TestData/text_norm/ci/grammars/07-08-26-0' DEFAULT_TN_CACHE='/home/jenkins/TestData/text_norm/ci/grammars/06-08-23-0' } stages { diff --git a/nemo_text_processing/text_normalization/hi/data/address/cities.tsv b/nemo_text_processing/text_normalization/hi/data/address/cities.tsv index 0199bf0cb..120b129c8 100644 --- a/nemo_text_processing/text_normalization/hi/data/address/cities.tsv +++ b/nemo_text_processing/text_normalization/hi/data/address/cities.tsv @@ -34,3 +34,4 @@ कारगिल कवरत्ती पुडुचेरी +बैंगलोर diff --git a/nemo_text_processing/text_normalization/hi/data/address/context.tsv b/nemo_text_processing/text_normalization/hi/data/address/context.tsv index 9faadaa3b..89b801365 100644 --- a/nemo_text_processing/text_normalization/hi/data/address/context.tsv +++ b/nemo_text_processing/text_normalization/hi/data/address/context.tsv @@ -45,4 +45,7 @@ सामने पीछे वीया -आर डी \ No newline at end of file +हिल +पिनकोड +पार्कहर्स्ट +स्टे \ No newline at end of file diff --git a/nemo_text_processing/text_normalization/hi/taggers/measure.py b/nemo_text_processing/text_normalization/hi/taggers/measure.py index e18111696..d9623cfdf 100644 --- a/nemo_text_processing/text_normalization/hi/taggers/measure.py +++ b/nemo_text_processing/text_normalization/hi/taggers/measure.py @@ -30,6 +30,7 @@ HYPHEN, INPUT_LOWER_CASED, LOWERCASE_X, + NEMO_ALL_DIGIT, NEMO_CHAR, NEMO_DIGIT, NEMO_HI_DIGIT, @@ -50,7 +51,6 @@ from nemo_text_processing.text_normalization.hi.utils import get_abs_path digit = pynini.string_file(get_abs_path("data/numbers/digit.tsv")) -# Load both Hindi (Devanagari) and English (Arabic) number mappings teens_ties_hi = pynini.string_file(get_abs_path("data/numbers/teens_and_ties.tsv")) teens_ties_en = pynini.string_file(get_abs_path("data/numbers/teens_and_ties_en.tsv")) teens_ties = pynini.union(teens_ties_hi, teens_ties_en) @@ -67,49 +67,40 @@ class MeasureFst(GraphFst): Args: cardinal: CardinalFst decimal: DecimalFst - deterministic: if True will provide a single transduction option, - for False multiple transduction are generated (used for audio-based normalization) + ordinal: OrdinalFst + input_case: str """ def get_structured_address_graph(self, ordinal: GraphFst, input_case: str): """ Minimal address tagger for state/city + pincode patterns only. - Highly optimized for performance. Examples: "मुंबई ८८४४०४" -> "मुंबई आठ आठ चार चार शून्य चार" "गोवा १२३४५६" -> "गोवा एक दो तीन चार पाँच छह" """ - # State/city keywords states = pynini.string_file(get_abs_path("data/address/states.tsv")) cities = pynini.string_file(get_abs_path("data/address/cities.tsv")) state_city_names = pynini.union(states, cities).optimize() - # Digit mappings num_token = ( digit | pynini.string_file(get_abs_path("data/numbers/zero.tsv")) | pynini.string_file(get_abs_path("data/telephone/number.tsv")) ).optimize() - # Pincode (6 digits) pincode = (num_token + pynini.closure(insert_space + num_token, 5, 5)).optimize() - - # Street number (1-4 digits) street_num = (num_token + pynini.closure(insert_space + num_token, 0, 3)).optimize() - # Text: words with trailing separator (comma? + space) any_digit = pynini.union(NEMO_HI_DIGIT, NEMO_DIGIT).optimize() punctuation = pynini.union(COMMA, PERIOD, HI_PERIOD).optimize() word_char = pynini.difference(NEMO_NOT_SPACE, pynini.union(any_digit, punctuation)).optimize() word = pynini.closure(word_char, 1) - # Separator: optional comma followed by mandatory space sep = pynini.closure(pynini.accep(COMMA), 0, 1) + pynini.accep(NEMO_SPACE) word_with_sep = word + sep text = pynini.closure(word_with_sep, 0, 5).optimize() - # Pattern: [street_num + sep]? text state/city [space pincode] pattern = ( pynini.closure(street_num + sep, 0, 1) + text @@ -124,78 +115,135 @@ def get_structured_address_graph(self, ordinal: GraphFst, input_case: str): ) return pynutil.add_weight(graph, 1.0).optimize() - def get_address_graph(self, ordinal: GraphFst, input_case: str): + def get_address_graph(self, cardinal: GraphFst, ordinal: GraphFst, input_case: str): """ - Address tagger that converts digits/hyphens/slashes character-by-character - when address context keywords are present. - English words and ordinals are converted to Hindi transliterations. + Address tagger with natural Hindi verbalization for street numbers. + 1-3 digit numbers are verbalized as cardinals, 4+ digit numbers and + PIN codes as digit-by-digit. Examples: - "७०० ओक स्ट्रीट" -> "सात शून्य शून्य ओक स्ट्रीट" - "६६-४ पार्क रोड" -> "छह छह हाइफ़न चार पार्क रोड" + "७०० ओक स्ट्रीट" -> "सात सौ ओक स्ट्रीट" + "६६-४ पार्क रोड" -> "छियासठ हाइफ़न चार पार्क रोड" + "14/3 मथुरा रोड" -> "चौदह बटा तीन मथुरा रोड" """ - ordinal_graph = ordinal.graph - # Alphanumeric to word mappings (digits, special characters, telephone digits) - char_to_word = ( - digit - | pynini.string_file(get_abs_path("data/numbers/zero.tsv")) - | pynini.string_file(get_abs_path("data/address/special_characters.tsv")) - | pynini.string_file(get_abs_path("data/telephone/number.tsv")) + single_digit_word = (cardinal.digit | cardinal.zero).optimize() + single_digit_input = NEMO_ALL_DIGIT + + digit_run = (single_digit_word + pynini.closure(insert_space + single_digit_word)).optimize() + + num_1digit = pynini.compose(single_digit_input**1, (cardinal.digit | cardinal.zero)).optimize() + + num_2digit = pynini.compose(single_digit_input**2, cardinal.teens_and_ties).optimize() + + num_3digit = pynini.compose(single_digit_input**3, cardinal.graph_hundreds).optimize() + + num_as_cardinal = ( + pynutil.add_weight(num_3digit, -2.0) + | pynutil.add_weight(num_2digit, -1.0) + | pynutil.add_weight(num_1digit, 0.0) ).optimize() - letter_to_word = pynini.string_file(get_abs_path("data/address/letters.tsv")) - letter_to_word = capitalized_input_graph(letter_to_word) - address_keywords_hi = pynini.string_file(get_abs_path("data/address/context.tsv")) - # English address keywords with Hindi translation (case-insensitive) + digit_run_4_plus = pynini.compose( + single_digit_input**4 + pynini.closure(single_digit_input), digit_run + ).optimize() + + any_street_num = (num_as_cardinal | pynutil.add_weight(digit_run_4_plus, -5.0)).optimize() + + hyphen_word = pynini.cross(HYPHEN, "हाइफ़न") + hyphenated_num = (any_street_num + insert_space + hyphen_word + insert_space + any_street_num).optimize() + + slash_word = pynini.cross(SLASH, "बटा") + slashed_num = (any_street_num + insert_space + slash_word + insert_space + any_street_num).optimize() + + pincode = pynini.compose( + single_digit_input**6, single_digit_word + pynini.closure(insert_space + single_digit_word, 5, 5) + ).optimize() + + street_num_1_to_3 = num_as_cardinal + + street_num_4_digit = pynini.compose(single_digit_input**4, digit_run).optimize() + + street_num_5_digit = pynini.compose(single_digit_input**5, digit_run).optimize() + + ordinal_processor = pynutil.add_weight(insert_space + ordinal.graph, -5.0) + en_to_hi_map = pynini.string_file(get_abs_path("data/address/en_to_hi_mapping.tsv")) if input_case != INPUT_LOWER_CASED: en_to_hi_map = capitalized_input_graph(en_to_hi_map) - address_keywords_en = pynini.project(en_to_hi_map, "input") - address_keywords = pynini.union(address_keywords_hi, address_keywords_en) + english_word_processor = pynutil.add_weight(insert_space + en_to_hi_map, -3.0) - # Alphanumeric processing: treat digits, letters, and -/ as convertible tokens - single_digit = pynini.union(NEMO_DIGIT, NEMO_HI_DIGIT).optimize() - special_chars = pynini.union(HYPHEN, SLASH).optimize() + letter_to_word = pynini.string_file(get_abs_path("data/address/letters.tsv")) + letter_to_word = capitalized_input_graph(letter_to_word) single_letter = pynini.project(letter_to_word, "input").optimize() - convertible_char = pynini.union(single_digit, special_chars, single_letter) + letter_processor = pynutil.add_weight(insert_space + pynini.compose(single_letter, letter_to_word), 0.5) + + special_chars = pynini.union(HYPHEN, SLASH).optimize() + convertible_char = pynini.union(single_digit_input, special_chars, single_letter) non_space_char = pynini.difference( NEMO_CHAR, pynini.union(NEMO_WHITE_SPACE, convertible_char, pynini.accep(COMMA)) ).optimize() - # Token processors with weights: prefer ordinals and known English→Hindi words - # Delete space before comma to avoid Sparrowhawk "sil" issue + right_side_letter = ( + pynini.compose(single_letter, letter_to_word) | pynini.closure(non_space_char, 1) + ).optimize() + + slashed_num_letter = (any_street_num + insert_space + slash_word + insert_space + right_side_letter).optimize() + + slashed_num = (slashed_num | slashed_num_letter).optimize() + comma_processor = pynutil.add_weight(delete_space + pynini.accep(COMMA), 0.0) - ordinal_processor = pynutil.add_weight(insert_space + ordinal_graph, -5.0) - english_word_processor = pynutil.add_weight(insert_space + en_to_hi_map, -3.0) - letter_processor = pynutil.add_weight(insert_space + pynini.compose(single_letter, letter_to_word), 0.5) - digit_char_processor = pynutil.add_weight(insert_space + pynini.compose(convertible_char, char_to_word), 0.0) + + standalone_hyphen = pynutil.add_weight(pynini.cross(HYPHEN, "हाइफ़न"), 0.2) + other_word_processor = pynutil.add_weight(insert_space + pynini.closure(non_space_char, 1), 0.1) token_processor = ( ordinal_processor | english_word_processor + | pynutil.add_weight(insert_space + hyphenated_num, -4.0) + | pynutil.add_weight(insert_space + slashed_num, -4.0) + | pynutil.add_weight(insert_space + pincode, -5.0) + | pynutil.add_weight(insert_space + street_num_5_digit, -3.5) + | pynutil.add_weight(insert_space + street_num_4_digit, -3.5) + | pynutil.add_weight(insert_space + street_num_1_to_3, 0.0) | letter_processor - | digit_char_processor | pynini.accep(NEMO_SPACE) | comma_processor + | pynutil.add_weight(insert_space + standalone_hyphen, 0.2) | other_word_processor ).optimize() + full_string_processor = pynini.closure(token_processor, 1).optimize() - # Window-based context matching around address keywords for robust detection + address_keywords_hi = pynini.string_file(get_abs_path("data/address/context.tsv")) + address_keywords_en = pynini.project(en_to_hi_map, "input") + states_graph = pynini.string_file(get_abs_path("data/address/states.tsv")) + cities_graph = pynini.string_file(get_abs_path("data/address/cities.tsv")) + state_city_keywords = pynini.union( + pynini.project(states_graph, "input"), + pynini.project(cities_graph, "input"), + ).optimize() + address_keywords = pynini.union(address_keywords_hi, address_keywords_en, state_city_keywords) + word_boundary = pynini.union( - NEMO_WHITE_SPACE, pynini.accep(COMMA), pynini.accep(HI_PERIOD), pynini.accep(PERIOD) + NEMO_WHITE_SPACE, + pynini.accep(COMMA), + pynini.accep(HI_PERIOD), + pynini.accep(PERIOD), ).optimize() non_boundary_char = pynini.difference(NEMO_CHAR, word_boundary) word = pynini.closure(non_boundary_char, 1).optimize() word_with_boundary = word + pynini.closure(word_boundary) window = pynini.closure(word_with_boundary, 0, 5).optimize() boundary = pynini.closure(word_boundary, 1).optimize() + input_pattern = pynini.union( address_keywords + boundary + window, window + boundary + address_keywords + pynini.closure(boundary + window, 0, 1), ).optimize() + address_graph = pynini.compose(input_pattern, full_string_processor).optimize() + graph = ( pynutil.insert('units: "address" cardinal { integer: "') + address_graph @@ -221,15 +269,12 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp decimal_graph = decimal_integers + point + insert_space + decimal.graph_fractional unit_graph = pynini.string_file(get_abs_path("data/measure/unit.tsv")) - # Year unit variants for formal/informal handling year_informal = pynini.string_map([("yr", "साल")]) year_formal = pynini.string_file(get_abs_path("data/measure/unit_year_formal.tsv")) - # All units EXCEPT year unit_inputs_except_yr = pynini.difference(pynini.project(unit_graph, "input"), pynini.accep("yr")) unit_graph_no_year = pynini.compose(unit_inputs_except_yr, unit_graph) - # Load quarterly units from separate files: map (FST) and list (FSA) quarterly_units_map = pynini.string_file(get_abs_path("data/measure/quarterly_units_map.tsv")) quarterly_units_list = pynini.string_file(get_abs_path("data/measure/quarterly_units_list.tsv")) quarterly_units_graph = pynini.union(quarterly_units_map, quarterly_units_list) @@ -240,15 +285,6 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp 1, ) - # Define the quarterly measurements - support both Devanagari and Arabic digits - quarter = pynini.union( - pynini.cross(POINT_FIVE, HI_SADHE), - pynini.cross(ONE_POINT_FIVE, HI_DEDH), - pynini.cross(TWO_POINT_FIVE, HI_DHAI), - ) - quarter_graph = pynutil.insert("integer_part: \"") + quarter + pynutil.insert("\"") - - # Define the unit handling unit = ( pynutil.insert(NEMO_SPACE) + pynutil.insert("units: \"") @@ -264,7 +300,6 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp + pynutil.insert(NEMO_SPACE) ) - # Year-specific unit wrappers unit_year_informal = ( pynutil.insert(NEMO_SPACE) + pynutil.insert("units: \"") @@ -280,11 +315,7 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp + pynutil.insert(NEMO_SPACE) ) - # Cardinal >= 1000 -> formal year (वर्ष) - # Use graph_without_leading_zeros which covers all number ranges (thousands to shankhs) cardinal_large = cardinal.graph_without_leading_zeros - - # Cardinal < 1000 -> informal year (साल) cardinal_small = cardinal.zero | cardinal.digit | cardinal.teens_and_ties | cardinal.graph_hundreds symbol_graph = pynini.string_map( @@ -304,14 +335,12 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp + unit ) - # Support both Devanagari and Arabic digits for dedh/dhai patterns dedh_dhai = pynini.union( pynini.cross(ONE_POINT_FIVE, HI_DEDH), pynini.cross(TWO_POINT_FIVE, HI_DHAI), ) dedh_dhai_graph = pynutil.insert("integer: \"") + dedh_dhai + pynutil.insert("\"") - # Support both Devanagari and Arabic digits for savva pattern savva_numbers = cardinal_graph + pynini.cross(DECIMAL_25, "") savva_graph = ( pynutil.insert("integer: \"") @@ -321,7 +350,6 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp + pynutil.insert("\"") ) - # Support both Devanagari and Arabic digits for sadhe pattern sadhe_numbers = cardinal_graph + pynini.cross(POINT_FIVE, "") sadhe_graph = ( pynutil.insert("integer: \"") @@ -332,7 +360,6 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp ) paune = pynini.string_file(get_abs_path("data/whitelist/paune_mappings.tsv")) - # Support both Devanagari and Arabic digits for paune pattern paune_numbers = paune + pynini.cross(DECIMAL_75, "") paune_graph = ( pynutil.insert("integer: \"") @@ -393,7 +420,6 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp + unit ) - # Large numbers (>=1000) + yr -> formal (वर्ष) graph_cardinal_year_formal = ( pynutil.insert("cardinal { ") + optional_graph_negative @@ -406,7 +432,6 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp + unit_year_formal ) - # Small numbers (<1000) + yr -> informal (साल) graph_cardinal_year_informal = ( pynutil.insert("cardinal { ") + optional_graph_negative @@ -419,7 +444,6 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp + unit_year_informal ) - # Regular decimals (e.g., 16.07) + yr -> formal (वर्ष) graph_decimal_year_formal = ( pynutil.insert("decimal { ") + optional_graph_negative @@ -429,7 +453,6 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp + unit_year_formal ) - # Handling cardinal clubbed with symbol as single token graph_exceptions = ( pynutil.insert("cardinal { ") + optional_graph_negative @@ -451,7 +474,7 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp + pynutil.insert("\"") ) - address_graph = self.get_address_graph(ordinal, input_case) + address_graph = self.get_address_graph(cardinal, ordinal, input_case) structured_address_graph = self.get_structured_address_graph(ordinal, input_case) graph = ( @@ -459,7 +482,7 @@ def __init__(self, cardinal: GraphFst, decimal: GraphFst, ordinal: GraphFst, inp | pynutil.add_weight(graph_decimal_year_formal, 0.1) | pynutil.add_weight(graph_cardinal, 0.1) | pynutil.add_weight(graph_cardinal_year_formal, 0.1) - | pynutil.add_weight(graph_cardinal_year_informal, -0.1) # Higher priority for small numbers + | pynutil.add_weight(graph_cardinal_year_informal, -0.1) | pynutil.add_weight(graph_exceptions, 0.1) | pynutil.add_weight(graph_dedh_dhai, -0.2) | pynutil.add_weight(graph_savva, -0.1) diff --git a/tests/nemo_text_processing/hi/data_text_normalization/test_cases_address.txt b/tests/nemo_text_processing/hi/data_text_normalization/test_cases_address.txt index 9989fa75c..95112cdb5 100644 --- a/tests/nemo_text_processing/hi/data_text_normalization/test_cases_address.txt +++ b/tests/nemo_text_processing/hi/data_text_normalization/test_cases_address.txt @@ -1,44 +1,44 @@ -700 ओक स्ट्रीट~सात शून्य शून्य ओक स्ट्रीट -११ जंगल रोड~एक एक जंगल रोड -301 पार्क एवेन्यू~तीन शून्य एक पार्क एवेन्यू -गली नंबर १७ जीएकगढ़~गली नंबर एक सात जीएकगढ़ -अदनान अपार्टमेंट फ्लैट नंबर 55~अदनान अपार्टमेंट फ्लैट नंबर पाँच पाँच +700 ओक स्ट्रीट~सात सौ ओक स्ट्रीट +११ जंगल रोड~ग्यारह जंगल रोड +301 पार्क एवेन्यू~तीन सौ एक पार्क एवेन्यू +गली नंबर १७ जीएकगढ़~गली नंबर सत्रह जीएकगढ़ +अदनान अपार्टमेंट फ्लैट नंबर 55~अदनान अपार्टमेंट फ्लैट नंबर पचपन प्लॉट नंबर ८ बालाजी मार्केट~प्लॉट नंबर आठ बालाजी मार्केट -शॉप नंबर 109 9 और 10 डिवाइडिंग रोड सेक्टर 10 फरीदाबाद~शॉप नंबर एक शून्य नौ नौ और एक शून्य डिवाइडिंग रोड सेक्टर एक शून्य फरीदाबाद -बूथ ७०, सेक्टर ८, चंडीगढ़~बूथ सात शून्य, सेक्टर आठ, चंडीगढ़ +शॉप नंबर 109 9 और 10 डिवाइडिंग रोड सेक्टर 10 फरीदाबाद~शॉप नंबर एक सौ नौ नौ और दस डिवाइडिंग रोड सेक्टर दस फरीदाबाद +बूथ ७०, सेक्टर ८, चंडीगढ़~बूथ सत्तर, सेक्टर आठ, चंडीगढ़ 2221 Southern Street~दो दो दो एक सदर्न स्ट्रीट -७०० ओक स्ट्रीट~सात शून्य शून्य ओक स्ट्रीट -625 स्कूल स्ट्रीट~छह दो पाँच स्कूल स्ट्रीट +७०० ओक स्ट्रीट~सात सौ ओक स्ट्रीट +625 स्कूल स्ट्रीट~छह सौ पच्चीस स्कूल स्ट्रीट १४७० एस वाशिंगटन स्ट्रीट~एक चार सात शून्य एस वाशिंगटन स्ट्रीट -506 स्टेट रोड~पाँच शून्य छह स्टेट रोड -६६-४ पार्कहर्स्ट आर डी~छह छह हाइफ़न चार पार्कहर्स्ट आर डी -579 ट्रॉय-शेंक्टाडी रोड~पाँच सात नौ ट्रॉय हाइफ़न शेंक्टाडी रोड +506 स्टेट रोड~पाँच सौ छह स्टेट रोड +६६-४ पार्कहर्स्ट आर डी~छियासठ हाइफ़न चार पार्कहर्स्ट आर डी +579 ट्रॉय-शेंक्टाडी रोड~पाँच सौ उनासी ट्रॉय हाइफ़न शेंक्टाडी रोड ७८३० - ई वेटरन्स पार्कवे, कोलंबस, जी ए ३१९०९~सात आठ तीन शून्य हाइफ़न ई वेटरन्स पार्कवे, कोलंबस, जी ए तीन एक नौ शून्य नौ -66-4, पार्कहर्स्ट रोड~छह छह हाइफ़न चार, पार्कहर्स्ट रोड -८४०/१, १०० फीट रोड, मेट्रो पिलर ५६-५७, इंदिरानगर, बैंगलोर~आठ चार शून्य बटा एक, एक शून्य शून्य फीट रोड, मेट्रो पिलर पाँच छह हाइफ़न पाँच सात, इंदिरानगर, बैंगलोर -17-18, राजलक्ष्मी नगर, 7th क्रॉस स्ट्रीट, 100 फीट बाईपास रोड, वेलाचेरी, चेन्नई~एक सात हाइफ़न एक आठ, राजलक्ष्मी नगर, सेवंथ क्रॉस स्ट्रीट, एक शून्य शून्य फीट बाईपास रोड, वेलाचेरी, चेन्नई +66-4, पार्कहर्स्ट रोड~छियासठ हाइफ़न चार, पार्कहर्स्ट रोड +८४०/१, १०० फीट रोड, मेट्रो पिलर ५६-५७, इंदिरानगर, बैंगलोर~आठ सौ चालीस बटा एक, एक सौ फीट रोड, मेट्रो पिलर छप्पन हाइफ़न सत्तावन, इंदिरानगर, बैंगलोर +17-18, राजलक्ष्मी नगर, 7th क्रॉस स्ट्रीट, 100 फीट बाईपास रोड, वेलाचेरी, चेन्नई~सत्रह हाइफ़न अठारह, राजलक्ष्मी नगर, सेवंथ क्रॉस स्ट्रीट, एक सौ फीट बाईपास रोड, वेलाचेरी, चेन्नई ४/५ न्यू म्युनिसिपल मार्केट रोड नंबर ५ और ६ सेन्टाक्रूज़ वेस्ट~चार बटा पाँच न्यू म्युनिसिपल मार्केट रोड नंबर पाँच और छह सेन्टाक्रूज़ वेस्ट -16/17 4th फ्लोर जवाहर नगर मटरू मंदिर रोड नंबर 2~एक छह बटा एक सात फ़ोर्थ फ्लोर जवाहर नगर मटरू मंदिर रोड नंबर दो -५/३०४ सिक्का कॉम्प्लेक्स विकास मार्ग एक्सटेंशन~पाँच बटा तीन शून्य चार सिक्का कॉम्प्लेक्स विकास मार्ग एक्सटेंशन -21/2 2nd फ्लोर 1st मेन रोड गांधी नगर~दो एक बटा दो सेकंड फ्लोर फ़र्स्ट मेन रोड गांधी नगर -नंबर २२/१८ ३rd फ्लोर सराय बोउ अली शू मार्केट~नंबर दो दो बटा एक आठ थर्ड फ्लोर सराय बोउ अली शू मार्केट -14/3, मथुरा रोड~एक चार बटा तीन, मथुरा रोड -यूनिट ३ १st फ्लोर नंबर ३७ सोलेमान खतर स्ट्रीट~यूनिट तीन फ़र्स्ट फ्लोर नंबर तीन सात सोलेमान खतर स्ट्रीट -1st फ्लोर नंबर 52 नॉर्थ अबूज़र स्ट्रीट खान ए अंसारी स्ट्रीट शरीयती स्ट्रीट 16617~फ़र्स्ट फ्लोर नंबर पाँच दो नॉर्थ अबूज़र स्ट्रीट खान ए अंसारी स्ट्रीट शरीयती स्ट्रीट एक छह छह एक सात -२०६ जय कॉम कॉम्प्लेक्स १st पोखरन रोड~दो शून्य छह जय कॉम कॉम्प्लेक्स फ़र्स्ट पोखरन रोड -नंबर 36 2nd फ्लोर सुपर 8 फेज 1 एकबतन टाउन तेहरान 13947~नंबर तीन छह सेकंड फ्लोर सुपर आठ फेज एक एकबतन टाउन तेहरान एक तीन नौ चार सात -२nd फ्लोर नंबर ८०८ आजादी स्ट्रीट~सेकंड फ्लोर नंबर आठ शून्य आठ आजादी स्ट्रीट -2nd फ्लोर नंबर 15 बिफ़ोर कांदि स्ट्रीट नॉर्थ सोहरावर्दी स्ट्रीट 15669~सेकंड फ्लोर नंबर एक पाँच बिफ़ोर कांदि स्ट्रीट नॉर्थ सोहरावर्दी स्ट्रीट एक पाँच छह छह नौ -यूनिट ४ नंबर २५ २nd गोलहा स्ट्रीट काशनी स्ट्रीट नूर स्क्वेर~यूनिट चार नंबर दो पाँच सेकंड गोलहा स्ट्रीट काशनी स्ट्रीट नूर स्क्वेर -ईस्ट 3rd फ्लोर नंबर 70 नेक्स्ट दो तोहीद इंस्टीट्यूट परचम स्ट्रीट~ईस्ट थर्ड फ्लोर नंबर सात शून्य नेक्स्ट दो तोहीद इंस्टीट्यूट परचम स्ट्रीट +16/17 4th फ्लोर जवाहर नगर मटरू मंदिर रोड नंबर 2~सोलह बटा सत्रह फ़ोर्थ फ्लोर जवाहर नगर मटरू मंदिर रोड नंबर दो +५/३०४ सिक्का कॉम्प्लेक्स विकास मार्ग एक्सटेंशन~पाँच बटा तीन सौ चार सिक्का कॉम्प्लेक्स विकास मार्ग एक्सटेंशन +21/2 2nd फ्लोर 1st मेन रोड गांधी नगर~इक्कीस बटा दो सेकंड फ्लोर फ़र्स्ट मेन रोड गांधी नगर +नंबर २२/१८ ३rd फ्लोर सराय बोउ अली शू मार्केट~नंबर बाईस बटा अठारह थर्ड फ्लोर सराय बोउ अली शू मार्केट +14/3, मथुरा रोड~चौदह बटा तीन, मथुरा रोड +यूनिट ३ १st फ्लोर नंबर ३७ सोलेमान खतर स्ट्रीट~यूनिट तीन फ़र्स्ट फ्लोर नंबर सैंतीस सोलेमान खतर स्ट्रीट +1st फ्लोर नंबर 52 नॉर्थ अबूज़र स्ट्रीट खान ए अंसारी स्ट्रीट शरीयती स्ट्रीट 16617~फ़र्स्ट फ्लोर नंबर बावन नॉर्थ अबूज़र स्ट्रीट खान ए अंसारी स्ट्रीट शरीयती स्ट्रीट एक छह छह एक सात +२०६ जय कॉम कॉम्प्लेक्स १st पोखरन रोड~दो सौ छह जय कॉम कॉम्प्लेक्स फ़र्स्ट पोखरन रोड +नंबर 36 2nd फ्लोर सुपर 8 फेज 1 एकबतन टाउन तेहरान 13947~नंबर छत्तीस सेकंड फ्लोर सुपर आठ फेज एक एकबतन टाउन तेहरान एक तीन नौ चार सात +२nd फ्लोर नंबर ८०८ आजादी स्ट्रीट~सेकंड फ्लोर नंबर आठ सौ आठ आजादी स्ट्रीट +2nd फ्लोर नंबर 15 बिफ़ोर कांदि स्ट्रीट नॉर्थ सोहरावर्दी स्ट्रीट 15669~सेकंड फ्लोर नंबर पंद्रह बिफ़ोर कांदि स्ट्रीट नॉर्थ सोहरावर्दी स्ट्रीट एक पाँच छह छह नौ +यूनिट ४ नंबर २५ २nd गोलहा स्ट्रीट काशनी स्ट्रीट नूर स्क्वेर~यूनिट चार नंबर पच्चीस सेकंड गोलहा स्ट्रीट काशनी स्ट्रीट नूर स्क्वेर +ईस्ट 3rd फ्लोर नंबर 70 नेक्स्ट दो तोहीद इंस्टीट्यूट परचम स्ट्रीट~ईस्ट थर्ड फ्लोर नंबर सत्तर नेक्स्ट दो तोहीद इंस्टीट्यूट परचम स्ट्रीट ३rd फ्लोर नंबर ५ हमेदन एली अपोज़िट लाले पार्क नॉर्थ कारगर स्ट्रीट~थर्ड फ्लोर नंबर पाँच हमेदन एली अपोज़िट लाले पार्क नॉर्थ कारगर स्ट्रीट 4th फ्लोर नंबर 1124 जमहोरी स्ट्रीट~फ़ोर्थ फ्लोर नंबर एक एक दो चार जमहोरी स्ट्रीट ५th फ्लोर नंबर ७/१ १३th एली शाहिद अराबली स्ट्रीट~फ़िफ्थ फ्लोर नंबर सात बटा एक थर्टींथ एली शाहिद अराबली स्ट्रीट -11, 80 फीट रोड, इंडियन ऑयल पेट्रोल पंप, कोरमंगला 6th ब्लॉक, बैंगलोर के सामने~एक एक, आठ शून्य फीट रोड, इंडियन ऑयल पेट्रोल पंप, कोरमंगला सिक्स्थ ब्लॉक, बैंगलोर के सामने -२१/११, जे ब्लॉक, ६th एवेन्यू मेन रोड, अन्ना नगर पूर्व, चेन्नई~दो एक बटा एक एक, जे ब्लॉक, सिक्स्थ एवेन्यू मेन रोड, अन्ना नगर पूर्व, चेन्नई -32A नाज़ प्लाज़ा मेरिस रोड~तीन दो ए नाज़ प्लाज़ा मेरिस रोड -२१४ बी गोविंद पूरी स्ट्रीट नंबर २~दो एक चार बी गोविंद पूरी स्ट्रीट नंबर दो -4362 16वीं एवेन्यू एसडब्ल्यू, देवदार रैपिड्स, आई ए 52404~चार तीन छह दो सोलहवीं एवेन्यू एसडब्ल्यू, देवदार रैपिड्स, आई ए बावन हज़ार चार सौ चार +11, 80 फीट रोड, इंडियन ऑयल पेट्रोल पंप, कोरमंगला 6th ब्लॉक, बैंगलोर के सामने~ग्यारह, अस्सी फीट रोड, इंडियन ऑयल पेट्रोल पंप, कोरमंगला सिक्स्थ ब्लॉक, बैंगलोर के सामने +२१/११, जे ब्लॉक, ६th एवेन्यू मेन रोड, अन्ना नगर पूर्व, चेन्नई~इक्कीस बटा ग्यारह, जे ब्लॉक, सिक्स्थ एवेन्यू मेन रोड, अन्ना नगर पूर्व, चेन्नई +32A नाज़ प्लाज़ा मेरिस रोड~बत्तीस ए नाज़ प्लाज़ा मेरिस रोड +२१४ बी गोविंद पूरी स्ट्रीट नंबर २~दो सौ चौदह बी गोविंद पूरी स्ट्रीट नंबर दो +4362 16वीं एवेन्यू एसडब्ल्यू, देवदार रैपिड्स, आई ए 52404~चार तीन छह दो सोलहवीं एवेन्यू एसडब्ल्यू, देवदार रैपिड्स, आई ए पाँच दो चार शून्य चार अमरावती ६५५९३०~अमरावती छह पाँच पाँच नौ तीन शून्य शिमला, हिमाचल प्रदेश 593988~शिमला, हिमाचल प्रदेश पाँच नौ तीन नौ आठ आठ २७०४४० डॉसन आर डी, अल्बानी, जीए ३१७०७~दो सात शून्य चार चार शून्य डॉसन आर डी, अल्बानी, जीए तीन एक सात शून्य सात @@ -52,4 +52,4 @@ रायपुर, छत्तीसगढ़ ११०६३५~रायपुर, छत्तीसगढ़ एक एक शून्य छह तीन पाँच भोपाल, मध्य प्रदेश 751225~भोपाल, मध्य प्रदेश सात पाँच एक दो दो पाँच अगरतला, त्रिपुरा ९१५३०५~अगरतला, त्रिपुरा नौ एक पाँच तीन शून्य पाँच -लखनऊ, उत्तर प्रदेश 802481~लखनऊ, उत्तर प्रदेश आठ शून्य दो चार आठ एक +लखनऊ, उत्तर प्रदेश 802481~लखनऊ, उत्तर प्रदेश आठ शून्य दो चार आठ एक \ No newline at end of file