2017-10-14 15:59:52 +03:00
|
|
|
# coding: utf8
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
from ..norm_exceptions import BASE_NORMS
|
|
|
|
from ...attrs import NORM
|
2018-08-08 17:06:11 +03:00
|
|
|
from ...attrs import LIKE_NUM
|
2017-10-14 15:59:52 +03:00
|
|
|
from ...util import add_lookups
|
|
|
|
|
|
|
|
_stem_suffixes = [
|
|
|
|
["реЛ","реЗ","реВ","реБ","реА","рд┐","рд╛"],
|
|
|
|
["рдХрд░","рд╛рдУ","рд┐рдП","рд╛рдИ","рд╛рдП","рдиреЗ","рдиреА","рдирд╛","рддреЗ","реАрдВ","рддреА","рддрд╛","рд╛рдБ","рд╛рдВ","реЛрдВ","реЗрдВ"],
|
|
|
|
["рд╛рдХрд░","рд╛рдЗрдП","рд╛рдИрдВ","рд╛рдпрд╛","реЗрдЧреА","реЗрдЧрд╛","реЛрдЧреА","реЛрдЧреЗ","рд╛рдиреЗ","рд╛рдирд╛","рд╛рддреЗ","рд╛рддреА","рд╛рддрд╛","рддреАрдВ","рд╛рдУрдВ","рд╛рдПрдВ","реБрдУрдВ","реБрдПрдВ","реБрдЖрдВ"],
|
|
|
|
["рд╛рдПрдЧреА","рд╛рдПрдЧрд╛","рд╛рдУрдЧреА","рд╛рдУрдЧреЗ","рдПрдВрдЧреА","реЗрдВрдЧреА","рдПрдВрдЧреЗ","реЗрдВрдЧреЗ","реВрдВрдЧреА","реВрдВрдЧрд╛","рд╛рддреАрдВ","рдирд╛рдУрдВ","рдирд╛рдПрдВ","рддрд╛рдУрдВ","рддрд╛рдПрдВ","рд┐рдпрд╛рдБ","рд┐рдпреЛрдВ","рд┐рдпрд╛рдВ"],
|
|
|
|
["рд╛рдПрдВрдЧреА","рд╛рдПрдВрдЧреЗ","рд╛рдКрдВрдЧреА","рд╛рдКрдВрдЧрд╛","рд╛рдЗрдпрд╛рдБ","рд╛рдЗрдпреЛрдВ","рд╛рдЗрдпрд╛рдВ"]
|
|
|
|
]
|
|
|
|
|
2018-08-08 17:06:11 +03:00
|
|
|
#reference 1:https://en.wikipedia.org/wiki/Indian_numbering_system
|
|
|
|
#reference 2: https://blogs.transparent.com/hindi/hindi-numbers-1-100/
|
|
|
|
|
|
|
|
_num_words = ['рд╢реВрдиреНрдп', 'рдПрдХ', 'рджреЛ', 'рддреАрди', 'рдЪрд╛рд░', 'рдкрд╛рдВрдЪ', 'рдЫрд╣', 'рд╕рд╛рдд', 'рдЖрда', 'рдиреМ', 'рджрд╕',
|
|
|
|
'рдЧреНрдпрд╛рд░рд╣', 'рдмрд╛рд░рд╣', 'рддреЗрд░рд╣', 'рдЪреМрджрд╣', 'рдкрдВрджреНрд░рд╣', 'рд╕реЛрд▓рд╣', 'рд╕рддреНрд░рд╣', 'рдЕрдард╛рд░рд╣', 'рдЙрдиреНрдиреАрд╕',
|
|
|
|
'рдмреАрд╕', 'рддреАрд╕', 'рдЪрд╛рд▓реАрд╕', 'рдкрдЪрд╛рд╕', 'рд╕рд╛рда', 'рд╕рддреНрддрд░', 'рдЕрд╕реНрд╕реА', 'рдирдмреНрдмреЗ', 'рд╕реМ', 'рд╣рдЬрд╝рд╛рд░',
|
|
|
|
'рд▓рд╛рдЦ', 'рдХрд░реЛрдбрд╝', 'рдЕрд░рдм', 'рдЦрд░рдм']
|
2017-10-14 15:59:52 +03:00
|
|
|
|
|
|
|
def norm(string):
|
|
|
|
# normalise base exceptions, e.g. punctuation or currency symbols
|
|
|
|
if string in BASE_NORMS:
|
|
|
|
return BASE_NORMS[string]
|
|
|
|
# set stem word as norm, if available, adapted from:
|
|
|
|
# http://computing.open.ac.uk/Sites/EACLSouthAsia/Papers/p6-Ramanathan.pdf
|
|
|
|
# http://research.variancia.com/hindi_stemmer/
|
|
|
|
# https://github.com/taranjeet/hindi-tokenizer/blob/master/HindiTokenizer.py#L142
|
|
|
|
for suffix_group in reversed(_stem_suffixes):
|
|
|
|
length = len(suffix_group[0])
|
|
|
|
if len(string) <= length:
|
|
|
|
break
|
|
|
|
for suffix in suffix_group:
|
|
|
|
if string.endswith(suffix):
|
|
|
|
return string[:-length]
|
|
|
|
return string
|
|
|
|
|
2018-08-08 17:06:11 +03:00
|
|
|
def like_num(text):
|
|
|
|
text = text.replace(',', '').replace('.', '')
|
|
|
|
if text.isdigit():
|
|
|
|
return True
|
|
|
|
if text.count('/') == 1:
|
|
|
|
num, denom = text.split('/')
|
|
|
|
if num.isdigit() and denom.isdigit():
|
|
|
|
return True
|
|
|
|
if text.lower() in _num_words:
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
2017-10-14 15:59:52 +03:00
|
|
|
|
|
|
|
LEX_ATTRS = {
|
2018-10-28 01:09:16 +03:00
|
|
|
NORM: norm,
|
2018-08-08 17:06:11 +03:00
|
|
|
LIKE_NUM: like_num
|
2017-10-14 15:59:52 +03:00
|
|
|
}
|