def __calcNewlineBetweenCoef(fr1: 'FragToken', fr2: 'FragToken') -> int: if (fr1.newlines_after_count > 1): return 1 tt = fr1.begin_token while tt is not None and tt.end_char <= fr1.end_char: if (BracketHelper.canBeStartOfSequence(tt, False, False)): br = BracketHelper.tryParse(tt, BracketParseAttr.CANBEMANYLINES, 100) if (br is not None and br.end_char >= fr2.begin_char): return -1 tt = tt.next0_ t = fr1.end_token if (t.isCharOf(":;.")): return 1 if ((isinstance(t, TextToken)) and ((t.morph.class0_.is_preposition or t.morph.class0_.is_conjunction))): return -1 t1 = fr2.begin_token if (isinstance(t1, TextToken)): if (t1.chars.is_all_lower): return -1 if (BracketHelper.canBeStartOfSequence(t1, False, False)): if (t.chars.is_all_lower): return -1 elif (isinstance(t1, NumberToken)): if (t.chars.is_all_lower): return -1 if (t.chars.is_all_lower): if (fr2.end_token.isChar(';')): return -1 return 0
def tryAttachCity(li: typing.List['CityItemToken'], ad: 'AnalyzerDataWithOntology', always: bool = False) -> 'ReferentToken': if (li is None): return None if (len(li) > 2 and li[0].typ == CityItemToken.ItemType.MISC and li[1].typ == CityItemToken.ItemType.NOUN): li[1].doubtful = False del li[0] wrapoi1099 = RefOutArgWrapper(None) res = CityAttachHelper.__try1(li, wrapoi1099, ad) oi = wrapoi1099.value if (res is None): wrapoi1095 = RefOutArgWrapper(None) res = CityAttachHelper.__tryNounName(li, wrapoi1095, False) oi = wrapoi1095.value if (res is None): wrapoi1096 = RefOutArgWrapper(None) res = CityAttachHelper.__tryNameExist(li, wrapoi1096, False) oi = wrapoi1096.value if (res is None): res = CityAttachHelper.__try4(li) if (res is None and always): wrapoi1097 = RefOutArgWrapper(None) res = CityAttachHelper.__tryNounName(li, wrapoi1097, True) oi = wrapoi1097.value if (res is None and always): if (AddressItemToken.tryAttachOrg(li[0].begin_token) is not None): pass else: wrapoi1098 = RefOutArgWrapper(None) res = CityAttachHelper.__tryNameExist(li, wrapoi1098, True) oi = wrapoi1098.value if (res is None): return None if (res is not None and res.morph is not None): pass if (res.begin_token.previous is not None): if (res.begin_token.previous.isValue("ТЕРРИТОРИЯ", None)): res.begin_token = res.begin_token.previous if ((BracketHelper.canBeStartOfSequence(res.begin_token.previous, False, False) and BracketHelper.canBeEndOfSequence(res.end_token.next0_, False, None, False) and res.begin_token.previous.previous is not None) and res.begin_token.previous.previous.isValue( "ТЕРРИТОРИЯ", None)): res.begin_token = res.begin_token.previous.previous res.end_token = res.end_token.next0_ return res
def _addName(self, begin: 'Token', end: 'Token') -> 'Termin': if (BracketHelper.canBeStartOfSequence(begin, True, False)): br = BracketHelper.tryParse(begin, BracketParseAttr.NO, 100) if (br is not None and br.end_token == end): begin = begin.next0_ end = end.previous val = MiscHelper.getTextValue( begin, end, Utils.valToEnum( (GetTextAttr.KEEPREGISTER) | (GetTextAttr.KEEPQUOTES), GetTextAttr)) if (val is None): return None if (val.endswith(".") and not val.endswith("..")): val = val[0:0 + len(val) - 1].strip() self.addSlot(TitlePageReferent.ATTR_NAME, val, False, 0) return Termin(val.upper())
def __tryAttachPureTerr(li: typing.List['TerrItemToken'], ad: 'AnalyzerData') -> 'ReferentToken': aid = None t = li[0].end_token.next0_ if (t is None): return None tt = t if (BracketHelper.canBeStartOfSequence(tt, True, False)): tt = tt.next0_ if (len(li) > 1): tmp = list(li) del tmp[0] rt0 = TerrAttachHelper.tryAttachTerritory(tmp, ad, False, None, None) if (rt0 is None and len(tmp) == 2): if (((tmp[0].termin_item is None and tmp[1].termin_item is not None)) or ((tmp[0].termin_item is not None and tmp[1].termin_item is None))): if (aid is None): rt0 = TerrAttachHelper.tryAttachTerritory( tmp, ad, True, None, None) if (rt0 is not None): if ((rt0.referent).is_state): return None rt0.begin_token = li[0].begin_token return rt0 if (aid is None): aid = AddressItemToken.tryAttachOrg(tt) if (aid is not None): rt = aid.createGeoOrgTerr() if (rt is None): return None rt.begin_token = li[0].begin_token t1 = rt.end_token if (tt != t and BracketHelper.canBeEndOfSequence( t1.next0_, False, None, False)): t1 = t1.next0_ rt.end_token = t1 return rt return None
def __tryParse(t: 'Token', is_in_lit: bool, max_char: int = 0) -> typing.List['ReferentToken']: if (t is None): return None is_bracket_regime = False if (t.previous is not None and t.previous.isChar('(')): is_bracket_regime = True blt = BookLinkToken.tryParse(t, 0) if (blt is None): blt = BookLinkToken.tryParseAuthor(t, FioTemplateType.UNDEFINED) if (blt is None and not is_bracket_regime): return None t0 = t coef = 0 is_electr_res = False decree = None regtyp = BookLinkAnalyzer.RegionTyp.UNDEFINED num = None spec_see = None book_prev = None if (is_bracket_regime): regtyp = BookLinkAnalyzer.RegionTyp.AUTHORS elif (blt.typ == BookLinkTyp.PERSON): if (not is_in_lit): return None regtyp = BookLinkAnalyzer.RegionTyp.AUTHORS elif (blt.typ == BookLinkTyp.NUMBER): num = blt.value t = blt.end_token.next0_ if (t is None or t.is_newline_before): return None if (not t.is_whitespace_before): if (isinstance(t, NumberToken)): n = (t).value if ((((n == "3" or n == "0")) and not t.is_whitespace_after and (isinstance(t.next0_, TextToken))) and t.next0_.chars.is_all_lower): pass else: return None elif (not ((isinstance(t, TextToken))) or t.chars.is_all_lower): r = t.getReferent() if (isinstance(r, PersonReferent)): pass elif (is_in_lit and r is not None and r.type_name == "DECREE"): pass else: return None first_pass2757 = True while True: if first_pass2757: first_pass2757 = False else: t = t.next0_ if (not (t is not None)): break if (isinstance(t, NumberToken)): break if (not ((isinstance(t, TextToken)))): break if (BracketHelper.canBeStartOfSequence(t, True, False)): break if (not t.chars.is_letter): continue bbb = BookLinkToken.tryParse(t, 0) if (bbb is not None): if (bbb.typ == BookLinkTyp.TAMZE): spec_see = bbb t = bbb.end_token.next0_ break if (bbb.typ == BookLinkTyp.SEE): t = bbb.end_token continue break if (spec_see is not None and spec_see.typ == BookLinkTyp.TAMZE): coef += 1 max0_ = 1000 tt = t0 while tt is not None and max0_ > 0: if (isinstance(tt.getReferent(), BookLinkRefReferent)): book_prev = (tt.getReferent()).book break tt = tt.previous max0_ -= 1 blt1 = BookLinkToken.tryParseAuthor(t, FioTemplateType.UNDEFINED) if (blt1 is not None and blt1.typ == BookLinkTyp.PERSON): regtyp = BookLinkAnalyzer.RegionTyp.AUTHORS else: ok = False tt = t first_pass2758 = True while True: if first_pass2758: first_pass2758 = False else: tt = (None if tt is None else tt.next0_) if (not (tt is not None)): break if (tt.is_newline_before): break if (is_in_lit and tt.getReferent() is not None and tt.getReferent().type_name == "DECREE"): ok = True decree = tt break bbb = BookLinkToken.tryParse(tt, 0) if (bbb is None): continue if (bbb.typ == BookLinkTyp.ELECTRONRES): is_electr_res = True ok = True break if (bbb.typ == BookLinkTyp.DELIMETER): tt = bbb.end_token.next0_ if (BookLinkToken.tryParseAuthor( tt, FioTemplateType.UNDEFINED) is not None): ok = True break bbb = BookLinkToken.tryParse(tt, 0) if (bbb is not None): if (bbb.typ == BookLinkTyp.EDITORS or bbb.typ == BookLinkTyp.TRANSLATE or bbb.typ == BookLinkTyp.SOSTAVITEL): ok = True break if (not ok and not is_in_lit): if (BookLinkToken.checkLinkBefore(t0, num)): pass else: return None regtyp = BookLinkAnalyzer.RegionTyp.NAME else: return None res = BookLinkReferent() corr_authors = list() t00 = t blt00 = None start_of_name = None prev_pers_templ = FioTemplateType.UNDEFINED if (regtyp == BookLinkAnalyzer.RegionTyp.AUTHORS): first_pass2759 = True while True: if first_pass2759: first_pass2759 = False else: t = t.next0_ if (not (t is not None)): break if (max_char > 0 and t.begin_char >= max_char): break if (t.isCharOf(".;") or t.is_comma_and): continue if (t.isChar('/')): break if ((t.isChar('(') and t.next0_ is not None and t.next0_.isValue("EDS", None)) and t.next0_.next0_ is not None and t.next0_.next0_.isChar(')')): t = t.next0_.next0_.next0_ break blt = BookLinkToken.tryParseAuthor(t, prev_pers_templ) if (blt is None and t.previous is not None and t.previous.is_and): blt = BookLinkToken.tryParseAuthor( t.previous, FioTemplateType.UNDEFINED) if (blt is None): if ((isinstance(t.getReferent(), OrganizationReferent)) and blt00 is not None): bbb2 = BookLinkToken.tryParse(t.next0_, 0) if (bbb2 is not None): if (bbb2.typ == BookLinkTyp.YEAR): res.addSlot(BookLinkReferent.ATTR_AUTHOR, t.getReferent(), False, 0) res.year = int(bbb2.value) coef += .5 t = bbb2.end_token.next0_ break if (blt.typ == BookLinkTyp.PERSON): tt2 = blt.end_token.next0_ bbb2 = BookLinkToken.tryParse(tt2, 0) if (bbb2 is not None): if (bbb2.typ == BookLinkTyp.YEAR): res.year = int(bbb2.value) coef += .5 blt.end_token = bbb2.end_token blt00 = (None) if (blt00 is not None and ((blt00.end_token.next0_ == blt.begin_token or blt.begin_token.previous.isChar('.')))): tt11 = blt.end_token.next0_ nex = BookLinkToken.tryParse(tt11, 0) if (nex is not None and nex.typ == BookLinkTyp.ANDOTHERS): pass else: if (tt11 is None): break if (tt11.isChar('/') and tt11.next0_ is not None and tt11.next0_.isChar('/')): break if (tt11.isChar(':')): break if ((str(blt).find('.') < 0) and str(blt00).find('.') > 0): break if ((isinstance(tt11, TextToken)) and tt11.chars.is_all_lower): break if (tt11.isCharOf(",.;") and tt11.next0_ is not None): tt11 = tt11.next0_ nex = BookLinkToken.tryParse(tt11, 0) if (nex is not None and nex.typ != BookLinkTyp.PERSON and nex.typ != BookLinkTyp.ANDOTHERS): break elif ( (blt00 is not None and blt00.person_template != FioTemplateType.UNDEFINED and blt.person_template != blt00.person_template) and blt.person_template == FioTemplateType.NAMESURNAME): if (blt.end_token.next0_ is None or not blt.end_token.next0_.is_comma_and): break if (BookLinkToken.tryParseAuthor( blt.end_token.next0_.next0_, FioTemplateType.UNDEFINED) is not None): pass else: break if (blt00 is None and blt.person_template == FioTemplateType.NAMESURNAME): tt = blt.end_token.next0_ if (tt is not None and tt.is_hiphen): tt = tt.next0_ if (isinstance(tt, NumberToken)): break BookLinkAnalyzer.__addAuthor(res, blt) coef += 1 t = blt.end_token if (isinstance(t.getReferent(), PersonReferent)): corr_authors.append( Utils.asObjectOrNull(t, ReferentToken)) blt00 = blt prev_pers_templ = blt.person_template start_of_name = blt.start_of_name if ((start_of_name) is not None): t = t.next0_ break continue if (blt.typ == BookLinkTyp.ANDOTHERS): coef += .5 t = blt.end_token.next0_ res.authors_and_other = True break break if (t is None): return None if ((t.is_newline_before and t != t0 and num is None) and res.findSlot( BookLinkReferent.ATTR_AUTHOR, None, True) is None): return None if (start_of_name is None): if (t.chars.is_all_lower): coef -= (1) if (t.chars.is_latin_letter and not is_electr_res and num is None): if (res.getSlotValue(BookLinkReferent.ATTR_AUTHOR) is None): return None tn0 = t tn1 = None uri = None next_num = None wrapnn393 = RefOutArgWrapper(0) inoutres394 = Utils.tryParseInt(Utils.ifNotNull(num, ""), wrapnn393) nn = wrapnn393.value if (inoutres394): next_num = str((nn + 1)) br = (BracketHelper.tryParse( t, Utils.valToEnum( (BracketParseAttr.CANCONTAINSVERBS) | (BracketParseAttr.CANBEMANYLINES), BracketParseAttr), 100) if BracketHelper.canBeStartOfSequence(t, True, False) else None) if (br is not None): t = t.next0_ pages = None first_pass2760 = True while True: if first_pass2760: first_pass2760 = False else: t = t.next0_ if (not (t is not None)): break if (max_char > 0 and t.begin_char >= max_char): break if (br is not None and br.end_token == t): tn1 = t break tit = TitleItemToken.tryAttach(t) if (tit is not None): if ((tit.typ == TitleItemToken.Types.TYP and tn0 == t and br is None) and BracketHelper.canBeStartOfSequence( tit.end_token.next0_, True, False)): br = BracketHelper.tryParse(tit.end_token.next0_, BracketParseAttr.NO, 100) if (br is not None): coef += (1) if (num is not None): coef += 1 tn0 = br.begin_token tn1 = br.end_token res.typ = tit.value.lower() t = br.end_token.next0_ break if (t.is_newline_before and t != tn0): if (br is not None and (t.end_char < br.end_char)): pass elif (not MiscHelper.canBeStartOfSentence(t)): pass else: if (t.newlines_before_count > 1): break if ((isinstance(t, NumberToken)) and num is not None and (t).int_value is not None): if (num == str(((t).int_value - 1))): break elif (num is not None): pass else: nnn = NounPhraseHelper.tryParse( t.previous, Utils.valToEnum( ((NounPhraseParseAttr.PARSEPREPOSITION) | (NounPhraseParseAttr.PARSEADVERBS) | (NounPhraseParseAttr.PARSENUMERICASADJECTIVE)) | (NounPhraseParseAttr.MULTILINES), NounPhraseParseAttr), 0) if (nnn is not None and nnn.end_char >= t.end_char): pass else: break if (t.isCharOf(".;") and t.whitespaces_after_count > 0): tit = TitleItemToken.tryAttach(t.next0_) if ((tit) is not None): if (tit.typ == TitleItemToken.Types.TYP): break stop = True words = 0 notwords = 0 tt = t.next0_ first_pass2761 = True while True: if first_pass2761: first_pass2761 = False else: tt = tt.next0_ if (not (tt is not None)): break blt0 = BookLinkToken.tryParse(tt, 0) if (blt0 is None): if (tt.is_newline_before): break if ((isinstance(tt, TextToken)) and not tt.getMorphClassInDictionary().is_undefined ): words += 1 else: notwords += 1 if (words > 6 and words > (notwords * 4)): stop = False break continue if ((blt0.typ == BookLinkTyp.DELIMETER or blt0.typ == BookLinkTyp.TRANSLATE or blt0.typ == BookLinkTyp.TYPE) or blt0.typ == BookLinkTyp.GEO or blt0.typ == BookLinkTyp.PRESS): stop = False break if (br is not None and br.end_token.previous.end_char > t.end_char): stop = False if (stop): break if (t == decree): t = t.next0_ break blt = BookLinkToken.tryParse(t, 0) if (blt is None): tn1 = t continue if (blt.typ == BookLinkTyp.DELIMETER): break if (((blt.typ == BookLinkTyp.MISC or blt.typ == BookLinkTyp.TRANSLATE or blt.typ == BookLinkTyp.NAMETAIL) or blt.typ == BookLinkTyp.TYPE or blt.typ == BookLinkTyp.VOLUME) or blt.typ == BookLinkTyp.PAGERANGE or blt.typ == BookLinkTyp.PAGES): coef += 1 break if (blt.typ == BookLinkTyp.GEO or blt.typ == BookLinkTyp.PRESS): if (t.previous.is_hiphen or t.previous.isCharOf(".;") or blt.add_coef > 0): break if (blt.typ == BookLinkTyp.YEAR): if (t.previous is not None and t.previous.is_comma): break if (blt.typ == BookLinkTyp.ELECTRONRES): is_electr_res = True break if (blt.typ == BookLinkTyp.URL): if (t == tn0 or t.previous.isCharOf(":.")): is_electr_res = True break tn1 = t if (tn1 is None and start_of_name is None): if (is_electr_res): uri_re = BookLinkReferent() rt0 = ReferentToken(uri_re, t00, t) rts0 = list() bref0 = BookLinkRefReferent._new389(uri_re) if (num is not None): bref0.number = num rt01 = ReferentToken(bref0, t0, rt0.end_token) ok = False while t is not None: if (t.is_newline_before): break blt0 = BookLinkToken.tryParse(t, 0) if (blt0 is not None): if (isinstance(blt0.ref, UriReferent)): uri_re.addSlot( BookLinkReferent.ATTR_URL, Utils.asObjectOrNull(blt0.ref, UriReferent), False, 0) ok = True t = blt0.end_token rt0.end_token = rt01.end_token = t t = t.next0_ if (ok): rts0.append(rt01) rts0.append(rt0) return rts0 if (decree is not None and num is not None): rts0 = list() bref0 = BookLinkRefReferent._new389(decree.getReferent()) if (num is not None): bref0.number = num rt01 = ReferentToken(bref0, t0, decree) t = decree.next0_ while t is not None: if (t.is_newline_before): break if (isinstance(t, TextToken)): if ((t).is_pure_verb): return None rt01.end_token = t t = t.next0_ rts0.append(rt01) return rts0 if (book_prev is not None): tt = t while tt is not None and ((tt.isCharOf(",.") or tt.is_hiphen)): tt = tt.next0_ blt0 = BookLinkToken.tryParse(tt, 0) if (blt0 is not None and blt0.typ == BookLinkTyp.PAGERANGE): rts0 = list() bref0 = BookLinkRefReferent._new389(book_prev) if (num is not None): bref0.number = num bref0.pages = blt0.value rt00 = ReferentToken(bref0, t0, blt0.end_token) rts0.append(rt00) return rts0 return None if (br is not None and ((tn1 == br.end_token or tn1 == br.end_token.previous))): tn0 = tn0.next0_ tn1 = tn1.previous if (start_of_name is None): while tn0 is not None: if (tn0.isCharOf(":,~")): tn0 = tn0.next0_ else: break while tn1 is not None and tn1.begin_char > tn0.begin_char: if (tn1.isCharOf(".;,:(~") or tn1.is_hiphen or tn1.isValue("РЕД", None)): pass else: break tn1 = tn1.previous nam = MiscHelper.getTextValue( tn0, tn1, Utils.valToEnum( (GetTextAttr.KEEPQUOTES) | (GetTextAttr.KEEPREGISTER), GetTextAttr)) if (start_of_name is not None): if (nam is None or (len(nam) < 3)): nam = start_of_name else: nam = "{0}{1}{2}".format( start_of_name, (" " if tn0.is_whitespace_before else ""), nam) if (nam is None): return None res.name = nam if (num is None and not is_in_lit): if (len(nam) < 20): return None coef -= (2) if (len(nam) > 500): coef -= (math.floor(len(nam) / 500)) if (is_bracket_regime): coef -= 1 if (len(nam) > 200): if (num is None): return None if (res.findSlot(BookLinkReferent.ATTR_AUTHOR, None, True) is None and not BookLinkToken.checkLinkBefore(t0, num)): return None en = 0 ru = 0 ua = 0 cha = 0 nocha = 0 chalen = 0 lt0 = tn0 lt1 = tn1 if (tn1 is None): if (t is None): return None lt0 = t0 lt1 = t tn1 = t.previous tt = lt0 while tt is not None and tt.end_char <= lt1.end_char: if ((isinstance(tt, TextToken)) and tt.chars.is_letter): if (tt.chars.is_latin_letter): en += 1 elif (tt.morph.language.is_ua): ua += 1 elif (tt.morph.language.is_ru): ru += 1 if (tt.length_char > 2): cha += 1 chalen += tt.length_char elif (not ((isinstance(tt, ReferentToken)))): nocha += 1 tt = tt.next0_ if (ru > (ua + en)): res.lang = "RU" elif (ua > (ru + en)): res.lang = "UA" elif (en > (ru + ua)): res.lang = "EN" if (nocha > 3 and nocha > cha and start_of_name is None): if (nocha > (math.floor(chalen / 3))): coef -= (2) if (res.lang == "EN"): tt = tn0.next0_ first_pass2762 = True while True: if first_pass2762: first_pass2762 = False else: tt = tt.next0_ if (not (tt is not None and (tt.end_char < tn1.end_char))): break if (tt.is_comma and tt.next0_ is not None and ((not tt.next0_.chars.is_all_lower or (isinstance(tt.next0_, ReferentToken))))): if (tt.next0_.next0_ is not None and tt.next0_.next0_.is_comma_and): if (isinstance(tt.next0_, ReferentToken)): pass else: continue nam = MiscHelper.getTextValue( tn0, tt.previous, Utils.valToEnum((GetTextAttr.KEEPQUOTES) | (GetTextAttr.KEEPREGISTER), GetTextAttr)) if (nam is not None and len(nam) > 15): res.name = nam break rt = ReferentToken(res, t00, tn1) authors = True edits = False br = (None) first_pass2763 = True while True: if first_pass2763: first_pass2763 = False else: t = t.next0_ if (not (t is not None)): break if (max_char > 0 and t.begin_char >= max_char): break if (BracketHelper.canBeStartOfSequence(t, False, False)): br = BracketHelper.tryParse(t, BracketParseAttr.CANBEMANYLINES, 100) if (br is not None and br.length_char > 300): br = (None) blt = BookLinkToken.tryParse(t, 0) if (t.is_newline_before and not t.isChar('/') and not t.previous.isChar('/')): if (blt is not None and blt.typ == BookLinkTyp.NUMBER): break if (t.previous.isCharOf(":")): pass elif (blt is not None and (( ((blt.typ == BookLinkTyp.DELIMETER or blt.typ == BookLinkTyp.PAGERANGE or blt.typ == BookLinkTyp.PAGES) or blt.typ == BookLinkTyp.GEO or blt.typ == BookLinkTyp.PRESS) or blt.typ == BookLinkTyp.N))): pass elif (num is not None and BookLinkToken.tryParseAuthor( t, FioTemplateType.UNDEFINED) is not None): pass elif (num is not None and blt is not None and blt.typ != BookLinkTyp.NUMBER): pass elif (br is not None and (t.end_char < br.end_char) and t.begin_char > br.begin_char): pass else: ok = False mmm = 50 tt = t.next0_ while tt is not None and mmm > 0: if (tt.is_newline_before): blt2 = BookLinkToken.tryParse(tt, 0) if (blt2 is not None and blt2.typ == BookLinkTyp.NUMBER and blt2.value == next_num): ok = True break if (blt2 is not None): if (blt2.typ == BookLinkTyp.PAGES or blt2.typ == BookLinkTyp.GEO or blt2.typ == BookLinkTyp.PRESS): ok = True break tt = tt.next0_ mmm -= 1 if (not ok): npt = NounPhraseHelper.tryParse( t.previous, Utils.valToEnum( ((NounPhraseParseAttr.MULTILINES) | (NounPhraseParseAttr.PARSEADVERBS) | (NounPhraseParseAttr.PARSEPREPOSITION)) | (NounPhraseParseAttr.PARSEVERBS) | (NounPhraseParseAttr.PARSEPRONOUNS), NounPhraseParseAttr), 0) if (npt is not None and npt.end_char >= t.end_char): ok = True if (not ok): break rt.end_token = t if (blt is not None): rt.end_token = blt.end_token if (t.isCharOf(".,") or t.is_hiphen): continue if (t.isValue("С", None)): pass if (regtyp == BookLinkAnalyzer.RegionTyp.FIRST and blt is not None and blt.typ == BookLinkTyp.EDITORS): edits = True t = blt.end_token coef += 1 continue if (regtyp == BookLinkAnalyzer.RegionTyp.FIRST and blt is not None and blt.typ == BookLinkTyp.SOSTAVITEL): edits = False t = blt.end_token coef += 1 continue if (regtyp == BookLinkAnalyzer.RegionTyp.FIRST and authors): blt2 = BookLinkToken.tryParseAuthor(t, prev_pers_templ) if (blt2 is not None and blt2.typ == BookLinkTyp.PERSON): prev_pers_templ = blt2.person_template if (not edits): BookLinkAnalyzer.__addAuthor(res, blt2) coef += 1 t = blt2.end_token continue if (blt2 is not None and blt2.typ == BookLinkTyp.ANDOTHERS): if (not edits): res.authors_and_other = True coef += 1 t = blt2.end_token continue authors = False if (blt is None): continue if (blt.typ == BookLinkTyp.ELECTRONRES or blt.typ == BookLinkTyp.URL): is_electr_res = True if (blt.typ == BookLinkTyp.ELECTRONRES): coef += 1.5 else: coef += .5 if (isinstance(blt.ref, UriReferent)): res.addSlot(BookLinkReferent.ATTR_URL, Utils.asObjectOrNull(blt.ref, UriReferent), False, 0) elif (blt.typ == BookLinkTyp.YEAR): if (res.year == 0): res.year = int(blt.value) coef += .5 elif (blt.typ == BookLinkTyp.DELIMETER): coef += 1 if (blt.length_char == 2): regtyp = BookLinkAnalyzer.RegionTyp.SECOND else: regtyp = BookLinkAnalyzer.RegionTyp.FIRST elif ( (((blt.typ == BookLinkTyp.MISC or blt.typ == BookLinkTyp.TYPE or blt.typ == BookLinkTyp.PAGES) or blt.typ == BookLinkTyp.NAMETAIL or blt.typ == BookLinkTyp.TRANSLATE) or blt.typ == BookLinkTyp.PRESS or blt.typ == BookLinkTyp.VOLUME) or blt.typ == BookLinkTyp.N): coef += 1 elif (blt.typ == BookLinkTyp.PAGERANGE): pages = blt coef += 1 if (is_bracket_regime and blt.end_token.next0_ is not None and blt.end_token.next0_.isChar(')')): coef += (2) if (res.name is not None and res.findSlot(BookLinkReferent.ATTR_AUTHOR, None, True) is not None): coef = (10) elif (blt.typ == BookLinkTyp.GEO and ((regtyp == BookLinkAnalyzer.RegionTyp.SECOND or regtyp == BookLinkAnalyzer.RegionTyp.FIRST))): coef += 1 elif (blt.typ == BookLinkTyp.GEO and t.previous is not None and t.previous.isChar('.')): coef += 1 elif (blt.typ == BookLinkTyp.ANDOTHERS): coef += 1 if (authors): res.authors_and_other = True coef += blt.add_coef t = blt.end_token if ((coef < 2.5) and num is not None): if (BookLinkToken.checkLinkBefore(t0, num)): coef += (2) elif (BookLinkToken.checkLinkAfter(rt.end_token, num)): coef += (1) if (rt.length_char > 500): return None if (is_in_lit): coef += 1 if (coef < 2.5): if (is_electr_res and uri is not None): pass elif (coef >= 2 and is_in_lit): pass else: return None for rr in corr_authors: pits0 = PersonItemToken.tryAttachList( rr.begin_token, None, PersonItemToken.ParseAttr.CANINITIALBEDIGIT, 10) if (pits0 is None or (len(pits0) < 2)): continue if (pits0[0].typ == PersonItemToken.ItemType.VALUE): exi = False for i in range(len(rr.referent.slots) - 1, -1, -1): s = rr.referent.slots[i] if (s.type_name == PersonReferent.ATTR_LASTNAME): ln = Utils.asObjectOrNull(s.value, str) if (ln is None): continue if (ln == pits0[0].value): exi = True continue if (ln.find('-') > 0): ln = ln[0:0 + ln.find('-')] if (pits0[0].begin_token.isValue(ln, None)): del rr.referent.slots[i] if (not exi): rr.referent.addSlot(PersonReferent.ATTR_LASTNAME, pits0[0].value, False, 0) rts = list() bref = BookLinkRefReferent._new389(res) if (num is not None): bref.number = num rt1 = ReferentToken(bref, t0, rt.end_token) if (pages is not None): if (pages.value is not None): bref.pages = pages.value rt.end_token = pages.begin_token.previous rts.append(rt1) rts.append(rt) return rts
def process(self, kit: 'AnalysisKit') -> None: """ Основная функция выделения объектов Args: container: lastStage: """ ad = Utils.asObjectOrNull(kit.getAnalyzerData(self), AnalyzerDataWithOntology) for k in range(2): detect_new_denoms = False dt = datetime.datetime.now() t = kit.first_token first_pass2887 = True while True: if first_pass2887: first_pass2887 = False else: t = t.next0_ if (not (t is not None)): break if (t.is_whitespace_before): pass elif (t.previous is not None and ((t.previous.isCharOf(",") or BracketHelper.canBeStartOfSequence( t.previous, False, False)))): pass else: continue rt0 = self.__tryAttachSpec(t) if (rt0 is not None): rt0.referent = ad.registerReferent(rt0.referent) kit.embedToken(rt0) t = (rt0) continue if (not t.chars.is_letter): continue if (not self.__canBeStartOfDenom(t)): continue ot = None ot = ad.local_ontology.tryAttach(t, None, False) if (ot is not None and (isinstance(ot[0].item.referent, DenominationReferent))): if (self.__checkAttach(ot[0].begin_token, ot[0].end_token)): rt = ReferentToken( Utils.asObjectOrNull(ot[0].item.referent, DenominationReferent), ot[0].begin_token, ot[0].end_token) kit.embedToken(rt) t = (rt) continue if (k > 0): continue if (t is not None and t.kit.ontology is not None): ot = t.kit.ontology.attachToken( DenominationReferent.OBJ_TYPENAME, t) if ((ot) is not None): if (self.__checkAttach(ot[0].begin_token, ot[0].end_token)): dr = DenominationReferent() dr.mergeSlots(ot[0].item.referent, True) rt = ReferentToken(ad.registerReferent(dr), ot[0].begin_token, ot[0].end_token) kit.embedToken(rt) t = (rt) continue rt0 = self.tryAttach(t, False) if (rt0 is not None): rt0.referent = ad.registerReferent(rt0.referent) kit.embedToken(rt0) detect_new_denoms = True t = (rt0) if (len(ad.local_ontology.items) > 1000): break if (not detect_new_denoms): break
def tryParse(t: 'Token', add_units: 'TerminCollection', can_be_set: bool = True, can_units_absent: bool = False) -> 'MeasureToken': """ Выделение вместе с наименованием Args: t(Token): """ if (not ((isinstance(t, TextToken)))): return None if (t.is_table_control_char): return None t0 = t whd = None minmax = 0 wrapminmax1516 = RefOutArgWrapper(minmax) tt = NumbersWithUnitToken._isMinOrMax(t0, wrapminmax1516) minmax = wrapminmax1516.value if (tt is not None): t = tt.next0_ npt = NounPhraseHelper.tryParse( t, Utils.valToEnum((NounPhraseParseAttr.PARSEPREPOSITION) | (NounPhraseParseAttr.IGNOREBRACKETS), NounPhraseParseAttr), 0) if (npt is None): whd = NumbersWithUnitToken._tryParseWHL(t) if (whd is not None): npt = NounPhraseToken(t0, whd.end_token) elif (t0.isValue("КПД", None)): npt = NounPhraseToken(t0, t0) elif ((isinstance(t0, TextToken)) and t0.length_char > 3 and t0.getMorphClassInDictionary().is_undefined): npt = NounPhraseToken(t0, t0) else: return None elif (NumberHelper.tryParseRealNumber(t, True) is not None): return None else: dtok = DateItemToken.tryAttach(t, None) if (dtok is not None): return None t1 = npt.end_token t = npt.end_token name_ = MetaToken._new561(npt.begin_token, npt.end_token, npt.morph) units = None units2 = None internals_ = list() not0_ = False tt = t1.next0_ first_pass3037 = True while True: if first_pass3037: first_pass3037 = False else: tt = tt.next0_ if (not (tt is not None)): break if (tt.is_newline_before): break if (tt.is_table_control_char): break wrapminmax1510 = RefOutArgWrapper(minmax) tt2 = NumbersWithUnitToken._isMinOrMax(tt, wrapminmax1510) minmax = wrapminmax1510.value if (tt2 is not None): tt = tt2 t = tt t1 = t continue if ((tt.isValue("БЫТЬ", None) or tt.isValue("ДОЛЖЕН", None) or tt.isValue("ДОЛЖНЫЙ", None)) or tt.isValue("МОЖЕТ", None) or ((tt.isValue("СОСТАВЛЯТЬ", None) and not tt.getMorphClassInDictionary().is_adjective))): t = tt t1 = t if (tt.previous.isValue("НЕ", None)): not0_ = True continue www = NumbersWithUnitToken._tryParseWHL(tt) if (www is not None): whd = www tt = www.end_token t = tt t1 = t continue if (len(internals_) > 0 and tt.is_comma_and): continue if (tt.isValue("ПРИ", None) or len(internals_) > 0): mt1 = MeasureToken.tryParse(tt.next0_, add_units, False, False) if (mt1 is not None and mt1.reliable): internals_.append(mt1) tt = mt1.end_token t = tt t1 = t continue if ((isinstance(tt, NumberToken)) and (tt).typ == NumberSpellingType.WORDS): npt3 = NounPhraseHelper.tryParse( tt, NounPhraseParseAttr.PARSENUMERICASADJECTIVE, 0) if (npt3 is not None): tt = npt3.end_token t1 = tt if (len(internals_) == 0): name_.end_token = t1 continue mt0 = NumbersWithUnitToken.tryParse(tt, add_units, False, False) if (mt0 is not None): break if (((tt.is_comma or tt.isChar('('))) and tt.next0_ is not None): www = NumbersWithUnitToken._tryParseWHL(tt.next0_) if (www is not None): whd = www tt = www.end_token t = tt t1 = t if (tt.next0_ is not None and tt.next0_.is_comma): tt = tt.next0_ t1 = tt if (tt.next0_ is not None and tt.next0_.isChar(')')): tt = tt.next0_ t1 = tt continue uu = UnitToken.tryParseList(tt.next0_, add_units, False) if (uu is not None): t = uu[len(uu) - 1].end_token t1 = t units = uu if (tt.isChar('(') and t1.next0_ is not None and t1.next0_.isChar(')')): tt = t1.next0_ t = tt t1 = t continue elif (t1.next0_ is not None and t1.next0_.isChar('(')): uu = UnitToken.tryParseList(t1.next0_.next0_, add_units, False) if (uu is not None and uu[len(uu) - 1].end_token.next0_ is not None and uu[len(uu) - 1].end_token.next0_.isChar(')')): units2 = uu tt = uu[len(uu) - 1].end_token.next0_ t = tt t1 = t continue if (uu is not None and len(uu) > 0 and not uu[0].is_doubt): break if (BracketHelper.canBeStartOfSequence(tt, False, False)): br = BracketHelper.tryParse(tt, BracketParseAttr.NO, 100) if (br is not None): tt = br.end_token t = tt t1 = t continue if (tt.isValue("НЕ", None) and tt.next0_ is not None): mc = tt.next0_.getMorphClassInDictionary() if (mc.is_adverb or mc.is_misc): break continue if (tt.isValue("ЯМЗ", None)): pass npt2 = NounPhraseHelper.tryParse( tt, Utils.valToEnum((NounPhraseParseAttr.PARSEPREPOSITION) | (NounPhraseParseAttr.IGNOREBRACKETS), NounPhraseParseAttr), 0) if (npt2 is None): if (tt.morph.class0_.is_preposition or tt.morph.class0_.is_conjunction): to = NumbersWithUnitToken.M_TERMINS.tryParse( tt, TerminParseAttr.NO) if (to is not None): if ((isinstance(to.end_token.next0_, TextToken)) and to.end_token.next0_.is_letters): pass else: break t1 = tt continue mc = tt.getMorphClassInDictionary() if (((isinstance(tt, TextToken)) and tt.chars.is_letter and tt.length_char > 1) and (((tt.chars.is_all_upper or mc.is_adverb or mc.is_undefined) or mc.is_adjective))): uu = UnitToken.tryParseList(tt, add_units, False) if (uu is not None): if (uu[0].length_char > 2 or len(uu) > 1): units = uu t = uu[len(uu) - 1].end_token t1 = t break t = tt t1 = t if (len(internals_) == 0): name_.end_token = tt continue if (tt.is_comma): continue if (tt.isChar('.')): if (not MiscHelper.canBeStartOfSentence(tt.next0_)): continue uu = UnitToken.tryParseList(tt.next0_, add_units, False) if (uu is not None): if (uu[0].length_char > 2 or len(uu) > 1): units = uu t = uu[len(uu) - 1].end_token t1 = t break break tt = npt2.end_token t = tt t1 = t if (len(internals_) > 0): pass elif (t.isValue("ПРЕДЕЛ", None) or t.isValue("ГРАНИЦА", None) or t.isValue("ДИАПАЗОН", None)): pass elif (t.chars.is_letter): name_.end_token = t1 t1 = t1.next0_ first_pass3038 = True while True: if first_pass3038: first_pass3038 = False else: t1 = t1.next0_ if (not (t1 is not None)): break if (t1.is_table_control_char): pass elif (t1.isCharOf(":,_")): www = NumbersWithUnitToken._tryParseWHL(t1.next0_) if (www is not None): whd = www t = www.end_token t1 = t continue elif (t1.is_hiphen and t1.is_whitespace_after and t1.is_whitespace_before): pass else: break if (t1 is None): return None mts = NumbersWithUnitToken.tryParseMulti(t1, add_units, False, not0_) if (mts is None): return None mt = mts[0] if (name_.begin_token.morph.class0_.is_preposition): name_.begin_token = name_.begin_token.next0_ if (len(mts) > 1 and len(internals_) == 0): if (len(mt.units) == 0): if (units is not None): for m in mts: m.units = units res1 = MeasureToken._new1511(t0, mts[len(mts) - 1].end_token, name_.morph, True) res1.name = MiscHelper.getTextValueOfMetaToken( name_, GetTextAttr.FIRSTNOUNGROUPTONOMINATIVE) k = 0 while k < len(mts): ttt = MeasureToken._new1506(mts[k].begin_token, mts[k].end_token, mts[k]) if (whd is not None): nams = Utils.asObjectOrNull(whd.tag, list) if (k < len(nams)): ttt.name = nams[k] res1.internals.append(ttt) k += 1 tt1 = res1.end_token.next0_ if (tt1 is not None and tt1.isChar('±')): nn = NumbersWithUnitToken._tryParse(tt1, add_units, True, False) if (nn is not None and nn.plus_minus_percent): res1.end_token = nn.end_token res1.nums = nn return res1 if (not mt.is_whitespace_before): if (mt.begin_token.previous is None): return None if (mt.begin_token.previous.isCharOf(":),") or mt.begin_token.previous.is_table_control_char): pass else: return None if (len(mt.units) == 0 and units is not None): mt.units = units if (mt.div_num is not None and len(units) > 1 and len(mt.div_num.units) == 0): i = 1 while i < len(units): if (units[i].pow0_ == -1): j = i while j < len(units): mt.div_num.units.append(units[j]) units[j].pow0_ = (-units[j].pow0_) j += 1 del mt.units[i:i + len(units) - i] break i += 1 if ((minmax < 0) and mt.single_val is not None): mt.from_val = mt.single_val mt.from_include = True mt.single_val = (None) if (minmax > 0 and mt.single_val is not None): mt.to_val = mt.single_val mt.to_include = True mt.single_val = (None) if (len(mt.units) == 0): units = UnitToken.tryParseList(mt.end_token.next0_, add_units, True) if (units is None): if (can_units_absent): pass else: return None else: mt.units = units res = MeasureToken._new1513(t0, mt.end_token, name_.morph, internals_) if (((not t0.is_whitespace_before and t0.previous is not None and t0 == name_.begin_token) and t0.previous.is_hiphen and not t0.previous.is_whitespace_before) and (isinstance(t0.previous.previous, TextToken))): name_.begin_token = res.begin_token = name_.begin_token.previous.previous res.name = MiscHelper.getTextValueOfMetaToken( name_, GetTextAttr.FIRSTNOUNGROUPTONOMINATIVE) res.nums = mt for u in res.nums.units: if (u.keyword is not None): if (u.keyword.begin_char >= res.begin_char): res.reliable = True res.__parseInternals(add_units) if (len(res.internals) > 0 or not can_be_set): return res t1 = res.end_token.next0_ if (t1 is not None and t1.is_comma_and): t1 = t1.next0_ mts1 = NumbersWithUnitToken.tryParseMulti(t1, add_units, False, False) if ((mts1 is not None and len(mts1) == 1 and (t1.whitespaces_before_count < 3)) and len(mts1[0].units) > 0 and not UnitToken.canBeEquals(mts[0].units, mts1[0].units)): res.is_set = True res.nums = (None) res.internals.append( MeasureToken._new1506(mt.begin_token, mt.end_token, mt)) res.internals.append( MeasureToken._new1506(mts1[0].begin_token, mts1[0].end_token, mts1[0])) res.end_token = mts1[0].end_token return res
def getNameEx(begin: 'Token', end: 'Token', cla: 'MorphClass', mc: 'MorphCase', gender: 'MorphGender' = MorphGender.UNDEFINED, ignore_brackets_and_hiphens: bool = False, ignore_geo_referent: bool = False) -> str: if (end is None or begin is None): return None if (begin.end_char > end.begin_char and begin != end): return None res = io.StringIO() prefix = None t = begin first_pass2809 = True while True: if first_pass2809: first_pass2809 = False else: t = t.next0_ if (not (t is not None and t.end_char <= end.end_char)): break if (res.tell() > 1000): break if (t.is_table_control_char): continue if (ignore_brackets_and_hiphens): if (BracketHelper.isBracket(t, False)): if (t == end): break if (t.isCharOf("(<[")): br = BracketHelper.tryParse(t, BracketParseAttr.NO, 100) if (br is not None and br.end_char <= end.end_char): tmp = ProperNameHelper.getNameEx( br.begin_token.next0_, br.end_token.previous, MorphClass.UNDEFINED, MorphCase.UNDEFINED, MorphGender.UNDEFINED, ignore_brackets_and_hiphens, False) if (tmp is not None): if ((br.end_char == end.end_char and br.begin_token.next0_ == br.end_token.previous and not br.begin_token.next0_.chars.is_letter) and not ((isinstance( br.begin_token.next0_, ReferentToken)))): pass else: print(" {0}{1}{2}".format( t.getSourceText(), tmp, br.end_token.getSourceText()), end="", file=res, flush=True) t = br.end_token continue if (t.is_hiphen): if (t == end): break elif (t.is_whitespace_before or t.is_whitespace_after): continue tt = Utils.asObjectOrNull(t, TextToken) if (tt is not None): if (not ignore_brackets_and_hiphens): if ((tt.next0_ is not None and tt.next0_.is_hiphen and (isinstance(tt.next0_.next0_, TextToken))) and tt != end and tt.next0_ != end): if (prefix is None): prefix = tt.term else: prefix = "{0}-{1}".format(prefix, tt.term) t = tt.next0_ if (t == end): break else: continue s = None if (cla.value != (0) or not mc.is_undefined or gender != MorphGender.UNDEFINED): for wff in tt.morph.items: wf = Utils.asObjectOrNull(wff, MorphWordForm) if (wf is None): continue if (cla.value != (0)): if ((((wf.class0_.value) & (cla.value))) == 0): continue if (not mc.is_undefined): if (((wf.case_) & mc).is_undefined): continue if (gender != MorphGender.UNDEFINED): if ((((wf.gender) & (gender))) == (MorphGender.UNDEFINED)): continue if (s is None or wf.normal_case == tt.term): s = wf.normal_case if (s is None and gender != MorphGender.UNDEFINED): for wff in tt.morph.items: wf = Utils.asObjectOrNull(wff, MorphWordForm) if (wf is None): continue if (cla.value != (0)): if ((((wf.class0_.value) & (cla.value))) == 0): continue if (not mc.is_undefined): if (((wf.case_) & mc).is_undefined): continue if (s is None or wf.normal_case == tt.term): s = wf.normal_case if (s is None): s = tt.term if (tt.chars.is_last_lower and tt.length_char > 2): s = tt.getSourceText() for i in range(len(s) - 1, -1, -1): if (str.isupper(s[i])): s = s[0:0 + i + 1] break if (prefix is not None): delim = "-" if (ignore_brackets_and_hiphens): delim = " " s = "{0}{1}{2}".format(prefix, delim, s) prefix = (None) if (res.tell() > 0 and len(s) > 0): if (str.isalnum(s[0])): ch0 = Utils.getCharAtStringIO(res, res.tell() - 1) if (ch0 == '-'): pass else: print(' ', end="", file=res) elif (not ignore_brackets_and_hiphens and BracketHelper.canBeStartOfSequence( tt, False, False)): print(' ', end="", file=res) print(s, end="", file=res) elif (isinstance(t, NumberToken)): if (res.tell() > 0): if (not t.is_whitespace_before and Utils.getCharAtStringIO( res, res.tell() - 1) == '-'): pass else: print(' ', end="", file=res) nt = Utils.asObjectOrNull(t, NumberToken) if ((t.morph.class0_.is_adjective and nt.typ == NumberSpellingType.WORDS and nt.begin_token == nt.end_token) and (isinstance(nt.begin_token, TextToken))): print((nt.begin_token).term, end="", file=res) else: print(nt.value, end="", file=res) elif (isinstance(t, MetaToken)): if ((ignore_geo_referent and t != begin and t.getReferent() is not None) and t.getReferent().type_name == "GEO"): continue s = ProperNameHelper.getNameEx( (t).begin_token, (t).end_token, cla, mc, gender, ignore_brackets_and_hiphens, ignore_geo_referent) if (not Utils.isNullOrEmpty(s)): if (res.tell() > 0): if (not t.is_whitespace_before and Utils.getCharAtStringIO( res, res.tell() - 1) == '-'): pass else: print(' ', end="", file=res) print(s, end="", file=res) if (t == end): break if (res.tell() == 0): return None return Utils.toStringStringIO(res)
def tryAttach(t: 'Token', prev: typing.List['DateItemToken']) -> 'DateItemToken': """ Привязать с указанной позиции один примитив Args: cnt: indFrom: """ if (t is None): return None t0 = t if (t0.isChar('_')): t = t.next0_ while t is not None: if (t.is_newline_before): return None if (not t.isChar('_')): break t = t.next0_ elif (BracketHelper.canBeStartOfSequence(t0, True, False)): ok = False t = t.next0_ while t is not None: if (BracketHelper.canBeEndOfSequence(t, True, t0, False)): ok = True break elif (not t.isChar('_')): break t = t.next0_ if (not ok): t = t0 else: t = t.next0_ while t is not None: if (not t.isChar('_')): break t = t.next0_ elif ((isinstance(t0, TextToken)) and t0.isValue("THE", None)): res0 = DateItemToken.__TryAttach(t.next0_, prev) if (res0 is not None): res0.begin_token = t return res0 res = DateItemToken.__TryAttach(t, prev) if (res is None): return None res.begin_token = t0 if (not res.is_whitespace_after and res.end_token.next0_ is not None and res.end_token.next0_.isChar('_')): t = res.end_token.next0_ while t is not None: if (not t.isChar('_')): break else: res.end_token = t t = t.next0_ if (res.typ == DateItemToken.DateItemType.YEAR or res.typ == DateItemToken.DateItemType.CENTURY or res.typ == DateItemToken.DateItemType.NUMBER): tok = None ii = 0 t = res.end_token.next0_ if (t is not None and t.isValue("ДО", None)): tok = DateItemToken.M_NEW_AGE.tryParse(t.next0_, TerminParseAttr.NO) ii = -1 elif (t is not None and t.isValue("ОТ", "ВІД")): tok = DateItemToken.M_NEW_AGE.tryParse(t.next0_, TerminParseAttr.NO) ii = 1 else: tok = DateItemToken.M_NEW_AGE.tryParse(t, TerminParseAttr.NO) ii = 1 if (tok is not None): res.new_age = (-1 if ii < 0 else 1) res.end_token = tok.end_token if (res.typ == DateItemToken.DateItemType.NUMBER): res.typ = DateItemToken.DateItemType.YEAR return res
def tryAttach(t: 'Token', prev: 'OrgItemNameToken', ext_onto: bool, first: bool) -> 'OrgItemNameToken': if (t is None): return None if (t.isValue("ОРДЕНА", None) and t.next0_ is not None): npt = NounPhraseHelper.tryParse(t.next0_, NounPhraseParseAttr.NO, 0) if (npt is not None): t1 = npt.end_token if (((t1.isValue("ЗНАК", None) or t1.isValue("ДРУЖБА", None))) and (t1.whitespaces_after_count < 2)): npt = NounPhraseHelper.tryParse(t1.next0_, NounPhraseParseAttr.NO, 0) if (npt is not None): t1 = npt.end_token return OrgItemNameToken._new1684(t, t1, True) if (t.next0_.getMorphClassInDictionary().is_proper_surname): return OrgItemNameToken._new1684(t, t.next0_, True) ppp = t.kit.processReferent("PERSON", t.next0_) if (ppp is not None): return OrgItemNameToken._new1684(t, ppp.end_token, True) if ((t.whitespaces_after_count < 2) and BracketHelper.canBeStartOfSequence( t.next0_, True, False)): br = BracketHelper.tryParse(t.next0_, BracketParseAttr.NEARCLOSEBRACKET, 10) if (br is not None and (br.length_char < 40)): return OrgItemNameToken._new1684(t, br.end_token, True) if (first and t.chars.is_cyrillic_letter and t.morph.class0_.is_preposition): if (not t.isValue("ПО", None) and not t.isValue("ПРИ", None)): return None res = OrgItemNameToken.__TryAttach(t, prev, ext_onto) if (res is None): if (ext_onto): if (((isinstance(t.getReferent(), GeoReferent))) or (((isinstance(t, TextToken)) and not t.isChar(';')))): return OrgItemNameToken._new1688(t, t, t.getSourceText()) return None if (prev is None and not ext_onto): if (t.kit.ontology is not None): ad = Utils.asObjectOrNull( t.kit.ontology._getAnalyzerData( OrganizationAnalyzer.ANALYZER_NAME), OrganizationAnalyzer.OrgAnalyzerData) if (ad is not None): tok = ad.org_pure_names.tryParse(t, TerminParseAttr.NO) if (tok is not None and tok.end_char > res.end_char): res.end_token = tok.end_token if (prev is not None and not ext_onto): if ((prev.chars.is_all_lower and not res.chars.is_all_lower and not res.is_std_tail) and not res.is_std_name): if (prev.chars.is_latin_letter and res.chars.is_latin_letter): pass elif (OrgItemNameToken.__m_std_nouns.tryParse( res.begin_token, TerminParseAttr.NO) is not None): pass else: return None if ((res.end_token.next0_ is not None and not res.end_token.is_whitespace_after and res.end_token.next0_.is_hiphen) and not res.end_token.next0_.is_whitespace_after): tt = Utils.asObjectOrNull(res.end_token.next0_.next0_, TextToken) if (tt is not None): if (tt.chars == res.chars or tt.chars.is_all_upper): res.end_token = tt res.value = "{0}-{1}".format(res.value, tt.term) if ((res.end_token.next0_ is not None and res.end_token.next0_.is_and and res.end_token.whitespaces_after_count == 1) and res.end_token.next0_.whitespaces_after_count == 1): res1 = OrgItemNameToken.__TryAttach(res.end_token.next0_.next0_, prev, ext_onto) if (res1 is not None and res1.chars == res.chars and OrgItemTypeToken.tryAttach( res.end_token.next0_.next0_, False, None) is None): if (not ((res1.morph.case_) & res.morph.case_).is_undefined): res.end_token = res1.end_token res.value = "{0} {1} {2}".format( res.value, ("ТА" if res.kit.base_language.is_ua else "И"), res1.value) tt = res.begin_token while tt is not None and tt.end_char <= res.end_char: if (OrgItemNameToken.__m_std_nouns.tryParse( tt, TerminParseAttr.NO) is not None): res.std_org_name_nouns += 1 tt = tt.next0_ if (OrgItemNameToken.__m_std_nouns.tryParse(res.end_token, TerminParseAttr.NO) is not None): cou = 1 non = False et = res.end_token if (not OrgItemNameToken.__isNotTermNoun(res.end_token)): non = True br = False tt = res.end_token.next0_ first_pass3045 = True while True: if first_pass3045: first_pass3045 = False else: tt = tt.next0_ if (not (tt is not None)): break if (tt.is_table_control_char): break if (tt.isChar('(')): if (not non): break br = True continue if (tt.isChar(')')): br = False et = tt break if (not ((isinstance(tt, TextToken)))): break if (tt.whitespaces_before_count > 1): if (tt.newlines_before_count > 1): break if (tt.chars != res.end_token.chars): break if (tt.morph.class0_.is_preposition or tt.is_comma_and): continue dd = tt.getMorphClassInDictionary() if (not dd.is_noun and not dd.is_adjective): break npt2 = NounPhraseHelper.tryParse(tt, NounPhraseParseAttr.NO, 0) if (npt2 is None): if (dd == MorphClass.ADJECTIVE): continue break if (OrgItemNameToken.__m_std_nouns.tryParse( npt2.end_token, TerminParseAttr.NO) is None): break if (npt2.end_token.chars != res.end_token.chars): break if ((npt2.end_token.isValue("УПРАВЛЕНИЕ", None) or npt2.end_token.isValue("ИНСТИТУТ", None) or npt2.end_token.isValue("УПРАВЛІННЯ", None)) or npt2.end_token.isValue("ІНСТИТУТ", None) or tt.previous.isValue("ПРИ", None)): rt = tt.kit.processReferent( OrganizationAnalyzer.ANALYZER_NAME, tt) if (rt is not None): break cou += 1 tt = npt2.end_token if (not OrgItemNameToken.__isNotTermNoun(tt)): non = True et = tt if (non and not br): res.std_org_name_nouns += cou res.end_token = et return res
def __TryParse(t: 'Token', prev: 'TransItemToken', after_conj: bool, attach_high: bool = False) -> 'TransItemToken': if (t is None): return None t1 = t if (t1.isChar(',')): t1 = t1.next0_ if (t1 is not None and t1.isValue("ПРИНАДЛЕЖАТЬ", "НАЛЕЖАТИ")): t1 = t1.next0_ if (isinstance(t1, ReferentToken)): if (t1.getReferent().type_name == "ORGANIZATION"): return TransItemToken._new2521(t, t1, TransItemToken.Typs.ORG, t1.getReferent(), t1.morph) route = False if (t1 is not None and ((t1.isValue("СЛЕДОВАТЬ", "СЛІДУВАТИ") or t1.isValue("ВЫПОЛНЯТЬ", "ВИКОНУВАТИ")))): t1 = t1.next0_ route = True if (t1 is not None and t1.morph.class0_.is_preposition): t1 = t1.next0_ if (t1 is not None and ((t1.isValue("РЕЙС", None) or t1.isValue("МАРШРУТ", None)))): t1 = t1.next0_ route = True if (isinstance(t1, ReferentToken)): if (isinstance(t1.getReferent(), GeoReferent)): geo_ = Utils.asObjectOrNull(t1.getReferent(), GeoReferent) if (geo_.is_state or geo_.is_city): tit = TransItemToken._new2522(t, t1, TransItemToken.Typs.ROUTE, list()) tit.route_items.append(geo_) t1 = t1.next0_ first_pass3132 = True while True: if first_pass3132: first_pass3132 = False else: t1 = t1.next0_ if (not (t1 is not None)): break if (t1.is_hiphen): continue if (t1.morph.class0_.is_preposition or t1.morph.class0_.is_conjunction): continue geo_ = (Utils.asObjectOrNull(t1.getReferent(), GeoReferent)) if (geo_ is None): break if (not geo_.is_city and not geo_.is_state): break tit.route_items.append(geo_) tit.end_token = t1 if (len(tit.route_items) > 1 or route): return tit elif ((isinstance(t1.getReferent(), DateReferent)) and (t1.whitespaces_before_count < 3)): tit = TransItemToken._new2523(t, t1, TransItemToken.Typs.DATE, t1.getReferent()) if (t1.next0_ is not None): if (t1.next0_.isValue("В", None) and t1.next0_.next0_ is not None and t1.next0_.next0_.isChar('.')): tit.end_token = t1.next0_.next0_ elif (t1.next0_.isValue("ВЫП", None) or t1.next0_.isValue("ВЫПУСК", None)): tit.end_token = t1.next0_ if (t1.next0_.next0_ is not None and t1.next0_.next0_.isChar('.')): tit.end_token = t1.next0_.next0_ return tit if (isinstance(t, TextToken)): num = MiscHelper.checkNumberPrefix(t) if (num is not None): tit = TransItemToken.__attachRusAutoNumber(num) if (tit is None): tit = TransItemToken._attachNumber(num, False) if (tit is not None): tit.begin_token = t return tit tok = TransItemToken.M_ONTOLOGY.tryParse(t, TerminParseAttr.NO) if (tok is None and ((t.isValue("С", None) or t.isValue("C", None) or t.isValue("ЗА", None)))): tok = TransItemToken.M_ONTOLOGY.tryParse( t.next0_, TerminParseAttr.NO) if (tok is None and BracketHelper.isBracket(t, True)): tok1 = TransItemToken.M_ONTOLOGY.tryParse( t.next0_, TerminParseAttr.NO) if (tok1 is not None and BracketHelper.isBracket( tok1.end_token.next0_, True)): tok = tok1 tok.begin_token = t tok.end_token = tok.end_token.next0_ tok.begin_token = t elif (tok1 is not None): tt = Utils.asObjectOrNull(tok1.termin, TransItemToken.TransTermin) if (tt.typ == TransItemToken.Typs.BRAND): tok = tok1 tok.begin_token = t if (tok is None and t.isValue("МАРКА", None)): res1 = TransItemToken.__TryParse(t.next0_, prev, after_conj, False) if (res1 is not None): if (res1.typ == TransItemToken.Typs.NAME or res1.typ == TransItemToken.Typs.BRAND): res1.begin_token = t res1.typ = TransItemToken.Typs.BRAND return res1 if (tok is not None): tt = Utils.asObjectOrNull(tok.termin, TransItemToken.TransTermin) if (tt.typ == TransItemToken.Typs.NUMBER): tit = TransItemToken.__attachRusAutoNumber( tok.end_token.next0_) if (tit is None): tit = TransItemToken._attachNumber( tok.end_token.next0_, False) if (tit is not None): tit.begin_token = t return tit else: return None if (tt.is_doubt and not attach_high): if (prev is None or prev.typ != TransItemToken.Typs.NOUN): if ((prev is not None and prev.typ == TransItemToken.Typs.BRAND and tt.typ == TransItemToken.Typs.BRAND) and Utils.compareStrings( tt.canonic_text, prev.value, True) == 0): pass else: return None if (tt.canonic_text == "СУДНО"): if ((((tok.morph.number) & (MorphNumber.PLURAL))) != (MorphNumber.UNDEFINED)): if (not BracketHelper.canBeStartOfSequence( tok.end_token.next0_, False, False)): return None tit = TransItemToken._new2524(tok.begin_token, tok.end_token, tt.kind, tt.typ, tt.is_doubt, tok.chars, tok.morph) tit.value = tt.canonic_text if (tit.typ == TransItemToken.Typs.NOUN): tit.value = tit.value.lower() else: tit.value = tit.value.upper() return tit if (tok is None and t.morph.class0_.is_adjective): npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0) if (npt is not None and len(npt.adjectives) > 0): state_ = None tt = t first_pass3133 = True while True: if first_pass3133: first_pass3133 = False else: tt = tt.next0_ if (not (tt is not None and tt.previous != npt.end_token)): break tok = TransItemToken.M_ONTOLOGY.tryParse( tt, TerminParseAttr.NO) if (tok is None and state_ is None): state_ = tt.kit.processReferent("GEO", tt) if (tok is not None and tok.end_token == npt.end_token): if ((tok.termin).typ == TransItemToken.Typs.NOUN): tit = TransItemToken._new2524( t, tok.end_token, (tok.termin).kind, TransItemToken.Typs.NOUN, (tok.termin).is_doubt, tok.chars, npt.morph) tit.value = (tok.termin).canonic_text.lower() tit.alt_value = npt.getNormalCaseText( None, False, MorphGender.UNDEFINED, False).lower() if (LanguageHelper.endsWithEx( tit.alt_value, "суд", "суда", None, None)): if (not BracketHelper.canBeStartOfSequence( tok.end_token.next0_, False, False)): continue if (state_ is not None): if ((state_.referent).is_state): tit.state = state_ return tit if (t is not None and t.isValue("КЛАСС", None) and t.next0_ is not None): br = BracketHelper.tryParse(t.next0_, BracketParseAttr.NO, 100) if (br is not None): return TransItemToken._new2526( t, br.end_token, TransItemToken.Typs.CLASS, MiscHelper.getTextValueOfMetaToken(br, GetTextAttr.NO)) nt = Utils.asObjectOrNull(t, NumberToken) if (nt is not None): if (prev is None or nt.typ != NumberSpellingType.DIGIT): return None if (prev.typ == TransItemToken.Typs.BRAND): return TransItemToken.__attachModel(t, False, prev) else: return None res = TransItemToken.__attachRusAutoNumber(t) if ((res) is not None): if (not res.is_doubt): return res if (prev is not None and prev.typ == TransItemToken.Typs.NOUN and prev.kind == TransportKind.AUTO): return res if (prev is not None and ((prev.typ == TransItemToken.Typs.BRAND or prev.typ == TransItemToken.Typs.MODEL))): return res t1 = t if (t.is_hiphen): t1 = t.next0_ if (prev is not None and prev.typ == TransItemToken.Typs.BRAND and t1 is not None): tit = TransItemToken.__attachModel(t1, True, prev) if (tit is not None): tit.begin_token = t return tit if (prev is not None and ((prev.typ == TransItemToken.Typs.NOUN or after_conj))): br = BracketHelper.tryParse(t, BracketParseAttr.NO, 100) if (br is not None and br.is_quote_type): tit = TransItemToken.tryParse(br.begin_token.next0_, prev, after_conj, False) if (tit is not None and tit.end_token.next0_ == br.end_token): if (not tit.is_doubt or tit.typ == TransItemToken.Typs.BRAND): tit.begin_token = br.begin_token tit.end_token = br.end_token return tit s = MiscHelper.getTextValueOfMetaToken(br, GetTextAttr.NO) if (not Utils.isNullOrEmpty(s) and (len(s) < 30)): chars_ = 0 digs = 0 un = 0 for c in s: if (not Utils.isWhitespace(c)): if (str.isalpha(c)): chars_ += 1 elif (str.isdigit(c)): digs += 1 else: un += 1 if (((digs == 0 and un == 0 and t.next0_.chars.is_capital_upper)) or prev.kind == TransportKind.SHIP or prev.kind == TransportKind.SPACE): return TransItemToken._new2526( br.begin_token, br.end_token, TransItemToken.Typs.NAME, s) if (digs > 0 and (chars_ < 5)): return TransItemToken._new2526( br.begin_token, br.end_token, TransItemToken.Typs.MODEL, s.replace(" ", "")) if (prev is not None and (((prev.typ == TransItemToken.Typs.NOUN or prev.typ == TransItemToken.Typs.BRAND or prev.typ == TransItemToken.Typs.NAME) or prev.typ == TransItemToken.Typs.MODEL))): tit = TransItemToken.__attachModel( t, prev.typ != TransItemToken.Typs.NAME, prev) if (tit is not None): return tit if (((prev is not None and prev.typ == TransItemToken.Typs.NOUN and prev.kind == TransportKind.AUTO) and (isinstance(t, TextToken)) and t.chars.is_letter) and not t.chars.is_all_lower and (t.whitespaces_before_count < 2)): pt = t.kit.processReferent("PERSON", t) if (pt is None): tit = TransItemToken._new2529(t, t, TransItemToken.Typs.BRAND) tit.value = (t).term return tit if (((prev is not None and prev.typ == TransItemToken.Typs.NOUN and ((prev.kind == TransportKind.SHIP or prev.kind == TransportKind.SPACE)))) or after_conj): if (t.chars.is_capital_upper): ok = True npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0) if (npt is not None and len(npt.adjectives) > 0): ok = False else: rt = t.kit.processReferent("PERSON", t) if (rt is not None): ok = False if (t.getMorphClassInDictionary().is_proper_surname): if (not t.morph.case_.is_nominative): ok = False if (ok): t1 = t tt = t.next0_ while tt is not None: if (tt.whitespaces_before_count > 1): break if (tt.chars != t.chars): break tit = TransItemToken.tryParse(tt, None, False, False) if ((tit) is not None): break t1 = tt tt = tt.next0_ s = MiscHelper.getTextValue(t, t1, GetTextAttr.NO) if (s is not None): res1 = TransItemToken._new2530( t, t1, TransItemToken.Typs.NAME, True, s) if (not t1.is_newline_after): br = BracketHelper.tryParse( t1.next0_, BracketParseAttr.NO, 100) if (br is not None): res1.end_token = br.end_token res1.alt_value = res1.value res1.value = MiscHelper.getTextValueOfMetaToken( br, GetTextAttr.NO) return res1 return None
def _process(begin : 'Token', max_char_pos : int, kit : 'AnalysisKit', end_token : 'Token') -> 'TitlePageReferent': end_token.value = begin res = TitlePageReferent() term = None lines = Line.parse(begin, 30, 1500, max_char_pos) if (len(lines) < 1): return None cou = len(lines) min_newlines_count = 10 lines_count_stat = dict() i = 0 while i < len(lines): if (TitleNameToken.canBeStartOfTextOrContent(lines[i].begin_token, lines[i].end_token)): cou = i break j = lines[i].newlines_before_count if (i > 0 and j > 0): if (not j in lines_count_stat): lines_count_stat[j] = 1 else: lines_count_stat[j] += 1 i += 1 max0_ = 0 for kp in lines_count_stat.items(): if (kp[1] > max0_): max0_ = kp[1] min_newlines_count = kp[0] end_char = (lines[cou - 1].end_char if cou > 0 else 0) if (max_char_pos > 0 and end_char > max_char_pos): end_char = max_char_pos names = list() i = 0 while i < cou: if (i == 6): pass j = i while (j < cou) and (j < (i + 5)): if (i == 6 and j == 8): pass if (j > i): if (lines[j - 1].is_pure_en and lines[j].is_pure_ru): break if (lines[j - 1].is_pure_ru and lines[j].is_pure_en): break if (lines[j].newlines_before_count >= (min_newlines_count * 2)): break ttt = TitleNameToken.tryParse(lines[i].begin_token, lines[j].end_token, min_newlines_count) if (ttt is not None): if (lines[i].is_pure_en): ttt.morph.language = MorphLang.EN elif (lines[i].is_pure_ru): ttt.morph.language = MorphLang.RU names.append(ttt) j += 1 i += 1 TitleNameToken.sort(names) name_rt = None if (len(names) > 0): i0 = 0 if (names[i0].morph.language.is_en): ii = 1 while ii < len(names): if (names[ii].morph.language.is_ru and names[ii].rank > 0): i0 = ii break ii += 1 term = res._addName(names[i0].begin_name_token, names[i0].end_name_token) if (names[i0].type_value is not None): res._addType(names[i0].type_value) if (names[i0].speciality is not None): res.speciality = names[i0].speciality rt = ReferentToken(res, names[i0].begin_token, names[i0].end_token) if (kit is not None): kit.embedToken(rt) else: res.addOccurence(TextAnnotation(rt.begin_token, rt.end_token)) end_token.value = rt.end_token name_rt = rt if (begin.begin_char == rt.begin_char): begin = (rt) if (term is not None and kit is not None): t = kit.first_token first_pass3128 = True while True: if first_pass3128: first_pass3128 = False else: t = t.next0_ if (not (t is not None)): break tok = term.tryParse(t, TerminParseAttr.NO) if (tok is None): continue t0 = t t1 = tok.end_token if (t1.next0_ is not None and t1.next0_.isChar('.')): t1 = t1.next0_ if (BracketHelper.canBeStartOfSequence(t0.previous, False, False) and BracketHelper.canBeEndOfSequence(t1.next0_, False, None, False)): t0 = t0.previous t1 = t1.next0_ rt = ReferentToken(res, t0, t1) kit.embedToken(rt) t = (rt) pr = PersonRelations() pers_typ = TitleItemToken.Types.UNDEFINED pers_types = pr.rel_types t = begin first_pass3129 = True while True: if first_pass3129: first_pass3129 = False else: t = t.next0_ if (not (t is not None)): break if (max_char_pos > 0 and t.begin_char > max_char_pos): break if (t == name_rt): continue tpt = TitleItemToken.tryAttach(t) if (tpt is not None): pers_typ = TitleItemToken.Types.UNDEFINED if (tpt.typ == TitleItemToken.Types.TYP): if (len(res.types) == 0): res._addType(tpt.value) elif (len(res.types) == 1): ty = res.types[0].upper() if (ty == "РЕФЕРАТ"): res._addType(tpt.value) elif (ty == "АВТОРЕФЕРАТ"): if (tpt.value == "КАНДИДАТСКАЯ ДИССЕРТАЦИЯ"): res.addSlot(TitlePageReferent.ATTR_TYPE, "автореферат кандидатской диссертации", True, 0) elif (tpt.value == "ДОКТОРСКАЯ ДИССЕРТАЦИЯ"): res.addSlot(TitlePageReferent.ATTR_TYPE, "автореферат докторской диссертации", True, 0) elif (tpt.value == "МАГИСТЕРСКАЯ ДИССЕРТАЦИЯ"): res.addSlot(TitlePageReferent.ATTR_TYPE, "автореферат магистерской диссертации", True, 0) elif (tpt.value == "КАНДИДАТСЬКА ДИСЕРТАЦІЯ"): res.addSlot(TitlePageReferent.ATTR_TYPE, "автореферат кандидатської дисертації", True, 0) elif (tpt.value == "ДОКТОРСЬКА ДИСЕРТАЦІЯ"): res.addSlot(TitlePageReferent.ATTR_TYPE, "автореферат докторської дисертації", True, 0) elif (tpt.value == "МАГІСТЕРСЬКА ДИСЕРТАЦІЯ"): res.addSlot(TitlePageReferent.ATTR_TYPE, "автореферат магістерської дисертації", True, 0) else: res._addType(tpt.value) elif (tpt.value == "РЕФЕРАТ" or tpt.value == "АВТОРЕФЕРАТ"): if (not tpt.value in ty): res._addType(tpt.value) elif (tpt.typ == TitleItemToken.Types.SPECIALITY): if (res.speciality is None): res.speciality = tpt.value elif (tpt.typ in pers_types): pers_typ = tpt.typ t = tpt.end_token if (t.end_char > end_token.value.end_char): end_token.value = t if (t.next0_ is not None and t.next0_.isCharOf(":-")): t = t.next0_ continue if (t.end_char > end_char): break rli = t.getReferents() if (rli is None): continue if (not t.is_newline_before and (isinstance(t.previous, TextToken))): s = (t.previous).term if (s == "ИМЕНИ" or s == "ИМ"): continue if (s == "." and t.previous.previous is not None and t.previous.previous.isValue("ИМ", None)): continue for r in rli: if (isinstance(r, PersonReferent)): if (r != rli[0]): continue p = Utils.asObjectOrNull(r, PersonReferent) if (pers_typ != TitleItemToken.Types.UNDEFINED): if (t.previous is not None and t.previous.isChar('.')): pers_typ = TitleItemToken.Types.UNDEFINED typ = pr.calcTypFromAttrs(p) if (typ != TitleItemToken.Types.UNDEFINED): pr.add(p, typ, 1) pers_typ = typ elif (pers_typ != TitleItemToken.Types.UNDEFINED): pr.add(p, pers_typ, 1) elif (t.previous is not None and t.previous.isChar('©')): pers_typ = TitleItemToken.Types.WORKER pr.add(p, pers_typ, 1) else: tt = t.next0_ first_pass3130 = True while True: if first_pass3130: first_pass3130 = False else: tt = tt.next0_ if (not (tt is not None)): break rr = tt.getReferent() if (rr == res): pers_typ = TitleItemToken.Types.WORKER break if (isinstance(rr, PersonReferent)): if (pr.calcTypFromAttrs(Utils.asObjectOrNull(r, PersonReferent)) != TitleItemToken.Types.UNDEFINED): break else: continue if (rr is not None): break tpt = TitleItemToken.tryAttach(tt) if (tpt is not None): if (tpt.typ != TitleItemToken.Types.TYP and tpt.typ != TitleItemToken.Types.TYPANDTHEME): break tt = tpt.end_token if (tt.end_char > end_token.value.end_char): end_token.value = tt continue if (pers_typ == TitleItemToken.Types.UNDEFINED): tt = t.previous while tt is not None: rr = tt.getReferent() if (rr == res): pers_typ = TitleItemToken.Types.WORKER break if (rr is not None): break if ((tt.isValue("СТУДЕНТ", None) or tt.isValue("СТУДЕНТКА", None) or tt.isValue("СЛУШАТЕЛЬ", None)) or tt.isValue("ДИПЛОМНИК", None) or tt.isValue("ИСПОЛНИТЕЛЬ", None)): pers_typ = TitleItemToken.Types.WORKER break tpt = TitleItemToken.tryAttach(tt) if (tpt is not None and tpt.typ != TitleItemToken.Types.TYP): break tt = tt.previous if (pers_typ != TitleItemToken.Types.UNDEFINED): pr.add(p, pers_typ, 1) else: pr.add(p, pers_typ, .5) if (t.end_char > end_token.value.end_char): end_token.value = t continue if (r == rli[0]): pers_typ = TitleItemToken.Types.UNDEFINED if (isinstance(r, DateReferent)): if (res.date is None): res.date = Utils.asObjectOrNull(r, DateReferent) if (t.end_char > end_token.value.end_char): end_token.value = t elif (isinstance(r, GeoReferent)): if (res.city is None and (r).is_city): res.city = Utils.asObjectOrNull(r, GeoReferent) if (t.end_char > end_token.value.end_char): end_token.value = t if (isinstance(r, OrganizationReferent)): org0_ = Utils.asObjectOrNull(r, OrganizationReferent) if ("курс" in org0_.types and org0_.number is not None): wrapi2519 = RefOutArgWrapper(0) inoutres2520 = Utils.tryParseInt(org0_.number, wrapi2519) i = wrapi2519.value if (inoutres2520): if (i > 0 and (i < 8)): res.student_year = i while org0_.higher is not None: if (org0_.kind != OrganizationKind.DEPARTMENT): break org0_ = org0_.higher if (org0_.kind != OrganizationKind.DEPARTMENT): if (res.org0_ is None): res.org0_ = org0_ elif (OrganizationReferent.canBeHigher(res.org0_, org0_)): res.org0_ = org0_ if (t.end_char > end_token.value.end_char): end_token.value = t if ((isinstance(r, UriReferent)) or (isinstance(r, GeoReferent))): if (t.end_char > end_token.value.end_char): end_token.value = t for ty in pers_types: for p in pr.getPersons(ty): if (pr.getAttrNameForType(ty) is not None): res.addSlot(pr.getAttrNameForType(ty), p, False, 0) if (res.getSlotValue(TitlePageReferent.ATTR_AUTHOR) is None): for p in pr.getPersons(TitleItemToken.Types.UNDEFINED): res.addSlot(TitlePageReferent.ATTR_AUTHOR, p, False, 0) break if (res.city is None and res.org0_ is not None): s = res.org0_.findSlot(OrganizationReferent.ATTR_GEO, None, True) if (s is not None and (isinstance(s.value, GeoReferent))): if ((s.value).is_city): res.city = Utils.asObjectOrNull(s.value, GeoReferent) if (res.date is None): t = begin first_pass3131 = True while True: if first_pass3131: first_pass3131 = False else: t = t.next0_ if (not (t is not None and t.end_char <= end_char)): break city = Utils.asObjectOrNull(t.getReferent(), GeoReferent) if (city is None): continue if (isinstance(t.next0_, TextToken)): if (t.next0_.isCharOf(":,") or t.next0_.is_hiphen): t = t.next0_ rt = t.kit.processReferent(DateAnalyzer.ANALYZER_NAME, t.next0_) if (rt is not None): rt.saveToLocalOntology() res.date = Utils.asObjectOrNull(rt.referent, DateReferent) if (kit is not None): kit.embedToken(rt) break if (len(res.slots) == 0): return None else: return res
def __tryParseThesis(t: 'Token') -> 'ReferentToken': if (t is None): return None t0 = t tt = t mc = tt.getMorphClassInDictionary() preamb = None if (mc.is_conjunction): return None if (t.isValue("LET", None)): return None if (mc.is_preposition or mc.is_misc or mc.is_adverb): if (not MiscHelper.isEngArticle(tt)): tt = tt.next0_ first_pass2871 = True while True: if first_pass2871: first_pass2871 = False else: tt = tt.next0_ if (not (tt is not None)): break if (tt.is_comma): break if (tt.isChar('(')): br = BracketHelper.tryParse(tt, BracketParseAttr.NO, 100) if (br is not None): tt = br.end_token continue if (MiscHelper.canBeStartOfSentence(tt)): break npt0 = NounPhraseHelper.tryParse( tt, Utils.valToEnum( (NounPhraseParseAttr.PARSENUMERICASADJECTIVE) | (NounPhraseParseAttr.REFERENTCANBENOUN), NounPhraseParseAttr), 0) if (npt0 is not None): tt = npt0.end_token continue if (tt.getMorphClassInDictionary().is_verb): break if (tt is None or not tt.is_comma or tt.next0_ is None): return None preamb = MetaToken(t0, tt.previous) tt = tt.next0_ t1 = tt mc = tt.getMorphClassInDictionary() npt = NounPhraseHelper.tryParse( tt, Utils.valToEnum((NounPhraseParseAttr.PARSENUMERICASADJECTIVE) | (NounPhraseParseAttr.REFERENTCANBENOUN) | (NounPhraseParseAttr.PARSEADVERBS), NounPhraseParseAttr), 0) if (npt is None and (isinstance(tt, TextToken))): if (tt.chars.is_all_upper): npt = NounPhraseToken(tt, tt) elif (not tt.chars.is_all_lower): if (mc.is_proper or preamb is not None): npt = NounPhraseToken(tt, tt) if (npt is None): return None if (mc.is_personal_pronoun): return None t2 = npt.end_token.next0_ if (t2 is None or MiscHelper.canBeStartOfSentence(t2) or not ((isinstance(t2, TextToken)))): return None if (not t2.getMorphClassInDictionary().is_verb): return None t3 = t2 tt = t2.next0_ while tt is not None: if (not tt.getMorphClassInDictionary().is_verb): break tt = tt.next0_ first_pass2872 = True while True: if first_pass2872: first_pass2872 = False else: tt = tt.next0_ if (not (tt is not None)): break if (tt.next0_ is None): t3 = tt break if (tt.isCharOf(".;!?")): if (MiscHelper.canBeStartOfSentence(tt.next0_)): t3 = tt break if (not ((isinstance(tt, TextToken)))): continue if (BracketHelper.canBeStartOfSequence(tt, False, False)): br = BracketHelper.tryParse(tt, BracketParseAttr.NO, 100) if (br is not None): tt = br.end_token continue tt = t3 if (t3.isCharOf(";.!?")): tt = tt.previous txt = MiscHelper.getTextValue( t2, tt, Utils.valToEnum( (GetTextAttr.KEEPREGISTER) | (GetTextAttr.KEEPQUOTES), GetTextAttr)) if (txt is None or (len(txt) < 15)): return None if (t0 != t1): tt = t1.previous if (tt.is_comma): tt = tt.previous txt0 = MiscHelper.getTextValue( t0, tt, Utils.valToEnum( (GetTextAttr.KEEPREGISTER) | (GetTextAttr.KEEPQUOTES), GetTextAttr)) if (txt0 is not None and len(txt0) > 10): if (t0.chars.is_capital_upper): txt0 = ((str.lower(txt0[0])) + txt0[1:]) txt = "{0}, {1}".format(txt, txt0) tt = t1 if (MiscHelper.isEngArticle(tt)): tt = tt.next0_ nam = MiscHelper.getTextValue(tt, t2.previous, GetTextAttr.KEEPQUOTES) if (nam.startswith("SO-CALLED")): nam = nam[9:].strip() dr = DefinitionReferent() dr.kind = DefinitionKind.ASSERTATION dr.addSlot(DefinitionReferent.ATTR_TERMIN, nam, False, 0) dr.addSlot(DefinitionReferent.ATTR_VALUE, txt, False, 0) return ReferentToken(dr, t0, t3)
def parse(t: 'Token', max_char: int = 0, prev: 'InstrToken' = None) -> 'InstrToken': is_start_of_line = False t00 = t if (t is not None): is_start_of_line = t00.is_newline_before while t is not None: if (t.is_table_control_char and not t.isChar(chr(0x1F))): if (t.is_newline_after and not is_start_of_line): is_start_of_line = True t = t.next0_ else: break if (t is None): return None if (t.is_newline_before): is_start_of_line = True t0 = t t1 = None has_word = False first_pass2988 = True while True: if first_pass2988: first_pass2988 = False else: t = t.next0_ if (not (t is not None)): break if (t.is_newline_before and t != t0): break if (max_char > 0 and t.begin_char > max_char): break if (is_start_of_line and t == t0): if (t.isValue("ГЛАВА", None)): next0__ = InstrToken.parse(t.next0_, 0, None) if (next0__ is not None and next0__.typ == ILTypes.PERSON): next0__.begin_token = t return next0__ tt = None if ((isinstance(t.getReferent(), PersonReferent)) or (isinstance(t.getReferent(), PersonPropertyReferent)) or (isinstance(t.getReferent(), InstrumentParticipant))): return InstrToken.__correctPerson( InstrToken._new1405(t00, t, ILTypes.PERSON, t)) is_ref = False if (isinstance(t.getReferent(), PersonPropertyReferent)): tt = t.next0_ is_ref = True elif (prev is not None and prev.typ == ILTypes.PERSON): rt = t.kit.processReferent(PersonAnalyzer.ANALYZER_NAME, t) if (rt is not None): if (isinstance(rt.referent, PersonReferent)): return InstrToken._new1406(t00, rt.end_token, ILTypes.PERSON) tt = rt.end_token.next0_ cou = 0 t11 = (None if tt is None else tt.previous) first_pass2989 = True while True: if first_pass2989: first_pass2989 = False else: tt = tt.next0_ if (not (tt is not None)): break if (tt.is_table_control_char): continue re = tt.getReferent() if (isinstance(re, PersonReferent)): return InstrToken._new1405(t00, tt, ILTypes.PERSON, tt) if (isinstance(re, GeoReferent)): t11 = tt continue if (re is not None): break if (DecreeToken.isKeyword(tt, False) is not None): break if (tt.is_newline_before): cou += 1 if ((cou) > 4): break if (tt is None and is_ref): return InstrToken._new1405(t00, Utils.ifNotNull(t11, t), ILTypes.PERSON, t) dt = DecreeToken.tryAttach(t, None, False) if (dt is not None): if (dt.typ == DecreeToken.ItemType.TYP and not t.chars.is_all_lower): if (t != t0): break has_verb_ = False tt = dt.end_token while tt is not None: if (tt.is_newline_before): break elif ((isinstance(tt, TextToken)) and (tt).is_pure_verb): has_verb_ = True break tt = tt.next0_ if (not has_verb_): res2 = InstrToken._new1409( t0, dt.end_token, ILTypes.TYP, Utils.ifNotNull(dt.full_value, dt.value)) if (res2.value == "ДОПОЛНИТЕЛЬНОЕ СОГЛАШЕНИЕ" or res2.value == "ДОДАТКОВА УГОДА"): if (res2.begin_char > 500 and res2.newlines_before_count > 1): res2.typ = ILTypes.APPENDIX return res2 if (dt.typ == DecreeToken.ItemType.NUMBER): if (t != t0): break return InstrToken._new1409(t0, dt.end_token, ILTypes.REGNUMBER, dt.value) if (dt.typ == DecreeToken.ItemType.ORG): if (t != t0): break return InstrToken._new1411(t0, dt.end_token, ILTypes.ORGANIZATION, dt.ref, dt.value) if (dt.typ == DecreeToken.ItemType.TERR): if (t != t0): break re = InstrToken._new1411(t0, dt.end_token, ILTypes.GEO, dt.ref, dt.value) t1 = re.end_token.next0_ if (t1 is not None and t1.isChar(',')): t1 = t1.next0_ if (t1 is not None and t1.isValue("КРЕМЛЬ", None)): re.end_token = t1 elif ((t1 is not None and t1.isValue("ДОМ", "БУДИНОК") and t1.next0_ is not None) and t1.next0_.isValue("СОВЕТ", "РАД")): re.end_token = t1.next0_ if (t1.next0_.next0_ is not None and (isinstance( t1.next0_.next0_.getReferent(), GeoReferent))): re.end_token = t1.next0_.next0_ return re if (dt.typ == DecreeToken.ItemType.OWNER): if (t != t0): break if (dt.ref is not None and str(dt.ref.referent).startswith("агент")): dt = (None) if (dt is not None): res1 = InstrToken._new1411(t0, dt.end_token, ILTypes.PERSON, dt.ref, dt.value) return InstrToken.__correctPerson(res1) if (BracketHelper.canBeStartOfSequence(t, False, False)): br = BracketHelper.tryParse(t, BracketParseAttr.NO, 100) if (br is not None): t1 = br.end_token t = t1 continue if (t.next0_ is not None and BracketHelper.canBeEndOfSequence( t.next0_, False, None, False)): t1 = t.next0_ t = t1 continue if (isinstance(t, TextToken)): if (t.isChar('_')): t1 = t continue r = t.getReferent() if (isinstance(r, DateReferent)): tt = t if (tt.next0_ is not None and tt.next0_.isCharOf(",;")): tt = tt.next0_ if (not t.is_newline_before and not tt.is_newline_after): t1 = tt continue if (not has_word): return InstrToken._new1405(t, tt, ILTypes.DATE, t) if (t != t0): break has_word = True if (isinstance(r, InstrumentParticipant)): tt = (t).begin_token first_pass2990 = True while True: if first_pass2990: first_pass2990 = False else: tt = tt.next0_ if (not (tt is not None and (tt.end_char < t.end_char))): break rr = tt.getReferent() if (rr is None): continue if ((isinstance(rr, OrganizationReferent)) or (isinstance(rr, BankDataReferent)) or (isinstance(rr, UriReferent))): r = (None) break if ((isinstance(r, PersonReferent)) or (isinstance(r, PersonPropertyReferent)) or (isinstance(r, InstrumentParticipant))): if (t != t0): break if (isinstance(r, InstrumentParticipant)): pass res1 = InstrToken._new1405(t, t, ILTypes.PERSON, t) return InstrToken.__correctPerson(res1) if (isinstance(r, OrganizationReferent)): if (t != t0): break return InstrToken._new1405(t, t, ILTypes.ORGANIZATION, t) if (isinstance(r, DecreePartReferent)): dpr = Utils.asObjectOrNull(r, DecreePartReferent) if (dpr.appendix is not None): if (t.is_newline_before or is_start_of_line): if (t.is_newline_after or t.whitespaces_before_count > 30): return InstrToken._new1409(t, t, ILTypes.APPENDIX, "ПРИЛОЖЕНИЕ") ok = True tt = t.next0_ first_pass2991 = True while True: if first_pass2991: first_pass2991 = False else: tt = tt.next0_ if (not (tt is not None)): break if (tt.is_newline_before): break npt = NounPhraseHelper.tryParse( tt, NounPhraseParseAttr.NO, 0) if (npt is not None): tt = npt.end_token continue ok = False break if (ok): return InstrToken._new1409(t, t, ILTypes.APPENDIX, "ПРИЛОЖЕНИЕ") if ((isinstance(r, DecreeReferent)) and (r).kind == DecreeKind.PUBLISHER and t == t0): res1 = InstrToken._new1406(t, t, ILTypes.APPROVED) tt = t.next0_ first_pass2992 = True while True: if first_pass2992: first_pass2992 = False else: tt = tt.next0_ if (not (tt is not None)): break if (tt.isCharOf(",;")): continue if ((isinstance(tt.getReferent(), DecreeReferent)) and (tt.getReferent()).kind == DecreeKind.PUBLISHER): res1.end_token = t else: break return res1 if (t.isValue("ЗА", None) and t.next0_ is not None and t.is_newline_before): rr = t.next0_.getReferent() if ((isinstance(rr, PersonReferent)) or (isinstance(rr, PersonPropertyReferent)) or (isinstance(rr, InstrumentParticipant))): if (t != t0): break res1 = InstrToken._new1405(t, t.next0_, ILTypes.PERSON, t.next0_) t = t.next0_.next0_ if ((isinstance(rr, InstrumentParticipant)) and t is not None): r = t.getReferent() if ((r) is not None): if ((isinstance(r, PersonReferent)) or (isinstance(r, PersonPropertyReferent))): res1.end_token = t res1.ref = (t) return res1 ii = 0 while ii < len(InstrToken._m_directives): if (t.isValue(InstrToken._m_directives[ii], None)): if (t.next0_ is not None and t.next0_.isValue("СЛЕДУЮЩЕЕ", "НАСТУПНЕ")): if (t != t0): break t11 = t.next0_ ok = False if (t11.next0_ is not None and t11.next0_.isCharOf(":.") and t11.next0_.is_newline_after): ok = True t11 = t11.next0_ if (ok): return InstrToken._new1409( t, t11, ILTypes.DIRECTIVE, InstrToken._m_directives_norm[ii]) if (t.is_newline_after or ((t.next0_ is not None and t.next0_.isChar(':') and t.next0_.is_newline_after))): if (t != t0): break if (not t.is_newline_before): if ((InstrToken._m_directives_norm[ii] != "ПРИКАЗ" and InstrToken._m_directives_norm[ii] != "ПОСТАНОВЛЕНИЕ" and InstrToken._m_directives_norm[ii] != "НАКАЗ") and InstrToken._m_directives_norm[ii] != "ПОСТАНОВУ"): break return InstrToken._new1409( t, (t if t.is_newline_after else t.next0_), ILTypes.DIRECTIVE, InstrToken._m_directives_norm[ii]) break ii += 1 if (t.is_newline_before and t.chars.is_letter and t.length_char == 1): for d in InstrToken._m_directives: t11 = MiscHelper.tryAttachWordByLetters(d, t, True) if (t11 is not None): if (t11.next0_ is not None and t11.next0_.isChar(':')): t11 = t11.next0_ return InstrToken._new1406(t, t11, ILTypes.DIRECTIVE) tte = ((t).begin_token if (isinstance(t, MetaToken)) else t) term = ((tte).term if isinstance(tte, TextToken) else None) if (is_start_of_line and not tte.chars.is_all_lower and t == t0): npt = NounPhraseHelper.tryParse(tte, NounPhraseParseAttr.NO, 0) if (npt is not None and ((term == "ПРИЛОЖЕНИЯ" or term == "ДОДАТКИ"))): # if (tte.Next != null && tte.Next.IsChar(':')) npt = (None) if (npt is not None and npt.morph.case_.is_nominative and (isinstance(npt.end_token, TextToken))): term1 = (npt.end_token).term if (((term1 == "ПРИЛОЖЕНИЕ" or term1 == "ДОДАТОК" or term1 == "МНЕНИЕ") or term1 == "ДУМКА" or term1 == "АКТ") or term1 == "ФОРМА" or term == "ЗАЯВКА"): tt1 = npt.end_token.next0_ dt1 = DecreeToken.tryAttach(tt1, None, False) if (dt1 is not None and dt1.typ == DecreeToken.ItemType.NUMBER): tt1 = dt1.end_token.next0_ elif (isinstance(tt1, NumberToken)): tt1 = tt1.next0_ elif ((isinstance(tt1, TextToken)) and tt1.length_char == 1 and tt1.chars.is_letter): tt1 = tt1.next0_ ok = True if (tt1 is None): ok = False elif (tt1.isValue("В", "У")): ok = False elif (tt1.isValue("К", None) and tt1.is_newline_before): return InstrToken._new1409(t, t, ILTypes.APPENDIX, term1) elif (not tt1.is_newline_before and InstrToken._checkEntered(tt1) is not None): ok = False elif (tt1 == t.next0_ and ((tt1.isChar(':') or ((tt1.isValue("НА", None) and term1 != "ЗАЯВКА"))))): ok = False if (ok): br = BracketHelper.tryParse( tt1, BracketParseAttr.NO, 100) if (br is not None): tt1 = br.end_token.next0_ if (br.end_token.next0_ is None or not br.end_token.is_newline_after or br.end_token.next0_.isCharOf(";,")): ok = False if (tt1 is not None and tt1.isValue( "ПРИЛОЖЕНИЕ", "ДОДАТОК")): ok = False if (prev is not None and prev.typ == ILTypes.APPENDIX): ok = False if (ok): cou = 0 ttt = tte.previous while ttt is not None and (cou < 300): if (ttt.is_table_control_char): if (not ttt.isChar(chr(0x1F))): if (ttt == tte.previous and ttt.isChar(chr(0x1E))): pass else: ok = False break ttt = ttt.previous cou += 1 if (ok): it1 = InstrToken1.parse(t, True, None, 0, None, False, 0, False) if (it1 is not None): if (it1.has_verb): ok = False if (ok and t.previous is not None): ttp = t.previous first_pass2993 = True while True: if first_pass2993: first_pass2993 = False else: ttp = ttp.previous if (not (ttp is not None)): break if (ttp.is_table_control_char and not ttp.isChar(chr(0x1F))): continue if (BracketHelper.isBracket(ttp, False) and not BracketHelper.canBeEndOfSequence( ttp, False, None, False)): continue if (ttp.isCharOf(";:")): ok = False break if ((ok and t.previous is not None and (t.newlines_before_count < 3)) and not t.is_newline_after): lines = 0 ttp = t.previous first_pass2994 = True while True: if first_pass2994: first_pass2994 = False else: ttp = ttp.previous if (not (ttp is not None)): break if (not ttp.is_newline_before): continue while ttp is not None and (ttp.end_char < t.begin_char): if (isinstance(ttp, NumberToken)): pass elif ((isinstance(ttp, TextToken)) and ttp.length_char > 1): if (ttp.isValue( "ПРИЛОЖЕНИЕ", "ДОДАТОК")): ok = False break else: break ttp = ttp.next0_ lines += 1 if ((lines) > 1): break if (ok and ((term1 != "ПРИЛОЖЕНИЕ" and term1 != "ДОДАТОК" and term1 != "МНЕНИЕ"))): if (t.newlines_before_count < 3): ok = False if (ok): return InstrToken._new1409(t, t, ILTypes.APPENDIX, term1) app = False if ((((term == "ОСОБОЕ" or term == "ОСОБЛИВЕ")) and t.next0_ is not None and t.next0_.isValue("МНЕНИЕ", "ДУМКА")) and t == t0 and is_start_of_line): app = True if ((((term == "ДОПОЛНИТЕЛЬНОЕ" or term == "ДОДАТКОВА")) and t.next0_ is not None and t.next0_.isValue("СОГЛАШЕНИЕ", "УГОДА")) and t == t0 and is_start_of_line): app = True if (app): tt = t.next0_ while tt is not None: if (tt.is_newline_before): break elif (tt.getMorphClassInDictionary() == MorphClass.VERB): app = False break tt = tt.next0_ if (app): return InstrToken._new1406(t, t.next0_, ILTypes.APPENDIX) if (not t.chars.is_all_lower and t == t0): tt = InstrToken._checkApproved(t) if (tt is not None): if (tt.next0_ is not None and (isinstance(tt.next0_.getReferent(), DecreeReferent))): return InstrToken._new1405(t, tt, ILTypes.APPROVED, tt.next0_.getReferent()) dt1 = DecreeToken.tryAttach(tt.next0_, None, False) if (dt1 is not None and dt1.typ == DecreeToken.ItemType.TYP): return InstrToken._new1406(t, tt, ILTypes.APPROVED) t1 = t is_start_of_line = False if (t1 is None): return None res = InstrToken._new1406(t00, t1, ILTypes.UNDEFINED) res.no_words = True t = t0 first_pass2995 = True while True: if first_pass2995: first_pass2995 = False else: t = t.next0_ if (not (t is not None and t.end_char <= t1.end_char)): break if (not ((isinstance(t, TextToken)))): if (isinstance(t, ReferentToken)): res.no_words = False continue if (not t.chars.is_letter): continue res.no_words = False if ((t).is_pure_verb): res.has_verb = True if (t0.isValue("ВОПРОС", "ПИТАННЯ") and t0.next0_ is not None and t0.next0_.isCharOf(":.")): res.typ = ILTypes.QUESTION return res
def tryAttachRequisites(t: 'Token', cur: 'InstrumentParticipant', other: 'InstrumentParticipant', cant_be_empty: bool = False) -> 'ReferentToken': if (t is None or cur is None): return None err = 0 spec_chars = 0 rt = None t0 = t is_in_tab_cell = False cou = 0 tt = t.next0_ while tt is not None and (cou < 300): if (tt.is_table_control_char): is_in_tab_cell = True break tt = tt.next0_ cou += 1 first_pass3018 = True while True: if first_pass3018: first_pass3018 = False else: t = t.next0_ if (not (t is not None)): break if (t.begin_char == 8923): pass if (t.is_table_control_char): if (t != t0): if (rt is not None): rt.end_token = t.previous elif (not cant_be_empty): rt = ReferentToken(cur, t0, t.previous) break else: continue if ((t.isCharOf(":.") or t.isValue("М", None) or t.isValue("M", None)) or t.isValue("П", None)): if (rt is not None): rt.end_token = t continue pp = ParticipantToken.tryAttachToExist(t, cur, other) if (pp is not None): if (pp.referent != cur): break if (rt is None): rt = ReferentToken(cur, t, t) rt.end_token = pp.end_token err = 0 continue if (t.is_newline_before): iii = InstrToken.parse(t, 0, None) if (iii is not None): if (iii.typ == ILTypes.APPENDIX): break if (t.whitespaces_before_count > 25 and not is_in_tab_cell): if (t != t0): if (t.previous is not None and t.previous.isCharOf(",;")): pass elif (t.newlines_before_count > 1): break if ((isinstance(t.getReferent(), PersonReferent)) or (isinstance(t.getReferent(), OrganizationReferent))): if (not cur._containsRef(t.getReferent())): break if ((t.isCharOf(";:,.") or t.is_hiphen or t.morph.class0_.is_preposition) or t.morph.class0_.is_conjunction): continue if (t.isCharOf("_/\\")): spec_chars += 1 if ((spec_chars) > 10 and rt is None): rt = ReferentToken(cur, t0, t) if (rt is not None): rt.end_token = t continue if (t.is_newline_before and (isinstance(t, NumberToken))): break if (t.isValue("ОФИС", None)): if (BracketHelper.canBeStartOfSequence(t.next0_, True, False)): br = BracketHelper.tryParse(t.next0_, BracketParseAttr.NO, 100) if (br is not None): t = br.end_token continue if ((isinstance(t.next0_, TextToken)) and not t.next0_.chars.is_all_lower): t = t.next0_ continue r = t.getReferent() if ((((isinstance(r, PersonReferent)) or (isinstance(r, AddressReferent)) or (isinstance(r, UriReferent))) or (isinstance(r, OrganizationReferent)) or (isinstance(r, PhoneReferent))) or (isinstance(r, PersonIdentityReferent)) or (isinstance(r, BankDataReferent))): if (other is not None and other.findSlot(None, r, True) is not None): if (not ((isinstance(r, UriReferent)))): break if (rt is None): rt = ReferentToken(cur, t, t) if (cur.findSlot(InstrumentParticipant.ATTR_DELEGATE, r, True) is not None): pass else: cur.addSlot(InstrumentParticipant.ATTR_REF, r, False, 0) rt.end_token = t err = 0 else: if ((isinstance(t, TextToken)) and t.length_char > 1): err += 1 if (is_in_tab_cell and rt is not None): if (err > 300): break elif (err > 4): break return rt
def tryAttach(t: 'Token', p1: 'InstrumentParticipant' = None, p2: 'InstrumentParticipant' = None, is_contract: bool = False) -> 'ParticipantToken': if (t is None): return None tt = t br = False if (p1 is None and p2 is None and is_contract): r1 = t.getReferent() if ((r1 is not None and t.next0_ is not None and t.next0_.is_comma_and) and (isinstance(t.next0_.next0_, ReferentToken))): r2 = t.next0_.next0_.getReferent() if (r1.type_name == r2.type_name): ttt = t.next0_.next0_.next0_ refs = list() refs.append(r1) refs.append(r2) first_pass3014 = True while True: if first_pass3014: first_pass3014 = False else: ttt = ttt.next0_ if (not (ttt is not None)): break if ((ttt.is_comma_and and ttt.next0_ is not None and ttt.next0_.getReferent() is not None) and ttt.next0_.getReferent().type_name == r1.type_name): ttt = ttt.next0_ if (not ttt.getReferent() in refs): refs.append(ttt.getReferent()) continue break first_pass3015 = True while True: if first_pass3015: first_pass3015 = False else: ttt = ttt.next0_ if (not (ttt is not None)): break if (ttt.is_comma or ttt.morph.class0_.is_preposition): continue if ((ttt.isValue("ИМЕНОВАТЬ", None) or ttt.isValue("ДАЛЬНЕЙШИЙ", None) or ttt.isValue("ДАЛЕЕ", None)) or ttt.isValue("ТЕКСТ", None)): continue if (ttt.isValue("ДОГОВАРИВАТЬСЯ", None)): continue npt = NounPhraseHelper.tryParse( ttt, NounPhraseParseAttr.NO, 0) if (npt is not None and npt.noun.isValue("СТОРОНА", None) and npt.morph.number != MorphNumber.SINGULAR): re = ParticipantToken._new1467( t, npt.end_token, ParticipantToken.Kinds.NAMEDASPARTS) re.parts = refs return re break if ((isinstance(r1, OrganizationReferent)) or (isinstance(r1, PersonReferent))): has_br = False has_named = False if (isinstance(r1, PersonReferent)): if (t.previous is not None and t.previous.isValue("ЛИЦО", None)): return None elif (t.previous is not None and ((t.previous.isValue("ВЫДАВАТЬ", None) or t.previous.isValue("ВЫДАТЬ", None)))): return None ttt = (t).begin_token while ttt is not None and (ttt.end_char < t.end_char): if (ttt.isChar('(')): has_br = True elif ((ttt.isValue("ИМЕНОВАТЬ", None) or ttt.isValue( "ДАЛЬНЕЙШИЙ", None) or ttt.isValue("ДАЛЕЕ", None)) or ttt.isValue("ТЕКСТ", None)): has_named = True elif ((ttt.is_comma or ttt.morph.class0_.is_preposition or ttt.is_hiphen) or ttt.isChar(':')): pass elif (isinstance(ttt, ReferentToken)): pass elif (has_br or has_named): npt = NounPhraseHelper.tryParse( ttt, NounPhraseParseAttr.REFERENTCANBENOUN, 0) if (npt is None): break if (has_br): if (npt.end_token.next0_ is None or not npt.end_token.next0_.isChar(')')): break if (not has_named): if (ParticipantToken.M_ONTOLOGY.tryParse( ttt, TerminParseAttr.NO) is None): break re = ParticipantToken._new1467( t, t, ParticipantToken.Kinds.NAMEDAS) re.typ = npt.getNormalCaseText(None, True, MorphGender.UNDEFINED, False) re.parts = list() re.parts.append(r1) return re ttt = ttt.next0_ has_br = False has_named = False end_side = None brr = None add_refs = None ttt = t.next0_ first_pass3016 = True while True: if first_pass3016: first_pass3016 = False else: ttt = ttt.next0_ if (not (ttt is not None)): break if ((isinstance(ttt, NumberToken)) and (isinstance(ttt.next0_, TextToken)) and (ttt.next0_).term == "СТОРОНЫ"): ttt = ttt.next0_ end_side = ttt if (ttt.next0_ is not None and ttt.next0_.is_comma): ttt = ttt.next0_ if (ttt.next0_ is not None and ttt.next0_.is_and): break if (brr is not None and ttt.begin_char > brr.end_char): brr = (None) if (BracketHelper.canBeStartOfSequence(ttt, False, False)): brr = BracketHelper.tryParse(ttt, BracketParseAttr.NO, 100) if (brr is not None and (brr.length_char < 7) and ttt.isChar('(')): ttt = brr.end_token brr = (None) continue elif ((ttt.isValue("ИМЕНОВАТЬ", None) or ttt.isValue( "ДАЛЬНЕЙШИЙ", None) or ttt.isValue("ДАЛЕЕ", None)) or ttt.isValue("ТЕКСТ", None)): has_named = True elif ((ttt.is_comma or ttt.morph.class0_.is_preposition or ttt.is_hiphen) or ttt.isChar(':')): pass elif (brr is not None or has_named): if (BracketHelper.canBeStartOfSequence( ttt, True, False)): ttt = ttt.next0_ npt = NounPhraseHelper.tryParse( ttt, NounPhraseParseAttr.REFERENTCANBENOUN, 0) typ22 = None if (npt is not None): ttt = npt.end_token if (npt.end_token.isValue("ДОГОВОР", None)): continue else: ttok = None if (isinstance(ttt, MetaToken)): ttok = ParticipantToken.M_ONTOLOGY.tryParse( (ttt).begin_token, TerminParseAttr.NO) if (ttok is not None): typ22 = ttok.termin.canonic_text elif (has_named and ttt.morph.class0_.is_adjective): typ22 = ttt.getNormalCaseText( MorphClass.ADJECTIVE, False, MorphGender.UNDEFINED, False) elif (brr is not None): continue else: break if (BracketHelper.canBeEndOfSequence( ttt.next0_, True, None, False)): ttt = ttt.next0_ if (brr is not None): if (ttt.next0_ is None): ttt = brr.end_token continue ttt = ttt.next0_ if (not has_named and typ22 is None): if (ParticipantToken.M_ONTOLOGY.tryParse( npt.begin_token, TerminParseAttr.NO) is None): break re = ParticipantToken._new1467( t, ttt, ParticipantToken.Kinds.NAMEDAS) re.typ = (Utils.ifNotNull( typ22, npt.getNormalCaseText(None, True, MorphGender.UNDEFINED, False))) re.parts = list() re.parts.append(r1) return re elif ((ttt.isValue("ЗАРЕГИСТРИРОВАННЫЙ", None) or ttt.isValue("КАЧЕСТВО", None) or ttt.isValue("ПРОЖИВАЮЩИЙ", None)) or ttt.isValue("ЗАРЕГ", None)): pass elif (ttt.getReferent() == r1): pass elif ( (isinstance(ttt.getReferent(), PersonIdentityReferent)) or (isinstance(ttt.getReferent(), AddressReferent))): if (add_refs is None): add_refs = list() add_refs.append(ttt.getReferent()) else: prr = ttt.kit.processReferent("PERSONPROPERTY", ttt) if (prr is not None): ttt = prr.end_token continue if (isinstance(ttt.getReferent(), GeoReferent)): continue npt = NounPhraseHelper.tryParse( ttt, NounPhraseParseAttr.NO, 0) if (npt is not None): if ((npt.noun.isValue("МЕСТО", None) or npt.noun.isValue("ЖИТЕЛЬСТВО", None) or npt.noun.isValue("ПРЕДПРИНИМАТЕЛЬ", None)) or npt.noun.isValue("ПОЛ", None) or npt.noun.isValue("РОЖДЕНИЕ", None)): ttt = npt.end_token continue if (ttt.is_newline_before): break if (ttt.length_char < 3): continue mc = ttt.getMorphClassInDictionary() if (mc.is_adverb or mc.is_adjective): continue if (ttt.chars.is_all_upper): continue break if (end_side is not None or ((add_refs is not None and t.previous is not None and t.previous.is_and))): re = ParticipantToken._new1467( t, Utils.ifNotNull(end_side, t), ParticipantToken.Kinds.NAMEDAS) re.typ = (None) re.parts = list() re.parts.append(r1) if (add_refs is not None): re.parts.extend(add_refs) return re too = ParticipantToken.M_ONTOLOGY.tryParse(t, TerminParseAttr.NO) if (too is not None): if ((isinstance(t.previous, TextToken)) and t.previous.isValue("ЛИЦО", None)): too = (None) if (too is not None and too.termin.tag is not None and too.termin.canonic_text != "СТОРОНА"): tt1 = too.end_token.next0_ if (tt1 is not None): if (tt1.is_hiphen or tt1.isChar(':')): tt1 = tt1.next0_ if (isinstance(tt1, ReferentToken)): r1 = tt1.getReferent() if ((isinstance(r1, PersonReferent)) or (isinstance(r1, OrganizationReferent))): re = ParticipantToken._new1467( t, tt1, ParticipantToken.Kinds.NAMEDAS) re.typ = too.termin.canonic_text re.parts = list() re.parts.append(r1) return re add_typ1 = (None if p1 is None else p1.typ) add_typ2 = (None if p2 is None else p2.typ) if (BracketHelper.canBeStartOfSequence(tt, False, False) and tt.next0_ is not None): br = True tt = tt.next0_ term1 = None term2 = None if (add_typ1 is not None and add_typ1.find(' ') > 0 and not add_typ1.startswith("СТОРОНА")): term1 = Termin(add_typ1) if (add_typ2 is not None and add_typ2.find(' ') > 0 and not add_typ2.startswith("СТОРОНА")): term2 = Termin(add_typ2) named = False typ_ = None t1 = None t0 = tt first_pass3017 = True while True: if first_pass3017: first_pass3017 = False else: tt = tt.next0_ if (not (tt is not None)): break if (tt.morph.class0_.is_preposition and typ_ is not None): continue if (tt.isCharOf("(:)") or tt.is_hiphen): continue if (tt.is_table_control_char): break if (tt.is_newline_before and tt != t0): if (isinstance(tt, NumberToken)): break if ((isinstance(tt, TextToken)) and (isinstance(tt.previous, TextToken))): if (tt.previous.isValue((tt).term, None)): break if (BracketHelper.isBracket(tt, False)): continue tok = (ParticipantToken.M_ONTOLOGY.tryParse( tt, TerminParseAttr.NO) if ParticipantToken.M_ONTOLOGY is not None else None) if (tok is not None and (isinstance(tt.previous, TextToken))): if (tt.previous.isValue("ЛИЦО", None)): return None if (tok is None): if (add_typ1 is not None and ((MiscHelper.isNotMoreThanOneError(add_typ1, tt) or ((((isinstance(tt, MetaToken))) and (tt).begin_token.isValue(add_typ1, None)))))): if (typ_ is not None): if (not ParticipantToken.__isTypesEqual( add_typ1, typ_)): break typ_ = add_typ1 t1 = tt continue if (add_typ2 is not None and ((MiscHelper.isNotMoreThanOneError(add_typ2, tt) or ((((isinstance(tt, MetaToken))) and (tt).begin_token.isValue(add_typ2, None)))))): if (typ_ is not None): if (not ParticipantToken.__isTypesEqual( add_typ2, typ_)): break typ_ = add_typ2 t1 = tt continue if (tt.chars.is_letter): if (term1 is not None): tok1 = term1.tryParse(tt, TerminParseAttr.NO) if (tok1 is not None): if (typ_ is not None): if (not ParticipantToken.__isTypesEqual( add_typ1, typ_)): break typ_ = add_typ1 tt = tok1.end_token t1 = tt continue if (term2 is not None): tok2 = term2.tryParse(tt, TerminParseAttr.NO) if (tok2 is not None): if (typ_ is not None): if (not ParticipantToken.__isTypesEqual( add_typ2, typ_)): break typ_ = add_typ2 tt = tok2.end_token t1 = tt continue if (named and tt.getMorphClassInDictionary().is_noun): if (not tt.chars.is_all_lower or BracketHelper.isBracket(tt.previous, True)): if (DecreeToken.isKeyword(tt, False) is None): val = tt.getNormalCaseText( MorphClass.NOUN, True, MorphGender.UNDEFINED, False) if (typ_ is not None): if (not ParticipantToken.__isTypesEqual( typ_, val)): break typ_ = val t1 = tt continue if (named and typ_ is None and is_contract): if ((isinstance(tt, TextToken)) and tt.chars.is_cyrillic_letter and tt.chars.is_capital_upper): dc = tt.getMorphClassInDictionary() if (dc.is_undefined or dc.is_noun): dt = DecreeToken.tryAttach(tt, None, False) ok = True if (dt is not None): ok = False elif (tt.isValue("СТОРОНА", None)): ok = False if (ok): typ_ = (tt).getLemma() t1 = tt continue if (dc.is_adjective): npt = NounPhraseHelper.tryParse( tt, NounPhraseParseAttr.NO, 0) if (npt is not None and len(npt.adjectives) > 0 and npt.noun.getMorphClassInDictionary( ).is_noun): typ_ = npt.getNormalCaseText( None, True, MorphGender.UNDEFINED, False) t1 = npt.end_token continue if (tt == t): break if ((isinstance(tt, NumberToken)) or tt.isChar('.')): break if (tt.length_char < 4): if (typ_ is not None): continue break if (tok.termin.tag is None): named = True else: if (typ_ is not None): break if (tok.termin.canonic_text == "СТОРОНА"): tt1 = tt.next0_ if (tt1 is not None and tt1.is_hiphen): tt1 = tt1.next0_ if (not ((isinstance(tt1, NumberToken)))): break if (tt1.is_newline_before): break typ_ = "{0} {1}".format(tok.termin.canonic_text, (tt1).value) t1 = tt1 else: typ_ = tok.termin.canonic_text t1 = tok.end_token break tt = tok.end_token if (typ_ is None): return None if (not named and t1 != t and not typ_.startswith("СТОРОНА")): if (not ParticipantToken.__isTypesEqual(typ_, add_typ1) and not ParticipantToken.__isTypesEqual(typ_, add_typ2)): return None if (BracketHelper.canBeEndOfSequence(t1.next0_, False, None, False)): t1 = t1.next0_ if (not t.is_whitespace_before and BracketHelper.canBeStartOfSequence( t.previous, False, False)): t = t.previous elif (BracketHelper.canBeStartOfSequence(t, False, False) and BracketHelper.canBeEndOfSequence(t1.next0_, True, t, True)): t1 = t1.next0_ if (br and t1.next0_ is not None and BracketHelper.canBeEndOfSequence( t1.next0_, False, None, False)): t1 = t1.next0_ res = ParticipantToken._new1472( t, t1, (ParticipantToken.Kinds.NAMEDAS if named else ParticipantToken.Kinds.PURE), typ_) if (t.isChar(':')): res.begin_token = t.next0_ return res
def __TryAttach(t: 'Token', prev: typing.List['DateItemToken']) -> 'DateItemToken': from pullenti.ner.measure.internal.MeasureToken import MeasureToken if (t is None): return None nt = Utils.asObjectOrNull(t, NumberToken) begin = t end = t is_in_brack = False if ((BracketHelper.canBeStartOfSequence(t, False, False) and t.next0_ is not None and (isinstance(t.next0_, NumberToken))) and BracketHelper.canBeEndOfSequence(t.next0_.next0_, False, None, False)): nt = (Utils.asObjectOrNull(t.next0_, NumberToken)) end = t.next0_.next0_ is_in_brack = True if ((t.is_newline_before and BracketHelper.isBracket(t, False) and (isinstance(t.next0_, NumberToken))) and BracketHelper.isBracket(t.next0_.next0_, False)): nt = (Utils.asObjectOrNull(t.next0_, NumberToken)) end = t.next0_.next0_ is_in_brack = True if (nt is not None): if (nt.int_value is None): return None if (nt.typ == NumberSpellingType.WORDS): if (nt.morph.class0_.is_noun and not nt.morph.class0_.is_adjective): if (t.next0_ is not None and ((t.next0_.isValue("КВАРТАЛ", None) or t.next0_.isValue("ПОЛУГОДИЕ", None) or t.next0_.isValue("ПІВРІЧЧЯ", None)))): pass else: return None if (NumberHelper.tryParseAge(nt) is not None): return None res = DateItemToken._new653(begin, end, DateItemToken.DateItemType.NUMBER, nt.int_value, nt.morph) if ((res.int_value == 20 and (isinstance(nt.next0_, NumberToken)) and (nt.next0_).int_value is not None) and nt.next0_.length_char == 2 and prev is not None): num = 2000 + (nt.next0_).int_value if ((num < 2030) and len(prev) > 0 and prev[len(prev) - 1].typ == DateItemToken.DateItemType.MONTH): ok = False if (nt.whitespaces_after_count == 1): ok = True elif (nt.is_newline_after and nt.is_newline_after): ok = True if (ok): nt = (Utils.asObjectOrNull(nt.next0_, NumberToken)) res.end_token = nt res.int_value = num if (res.int_value == 20 or res.int_value == 201): tt = t.next0_ if (tt is not None and tt.isChar('_')): while tt is not None: if (not tt.isChar('_')): break tt = tt.next0_ tt = DateItemToken.__testYearRusWord(tt, False) if (tt is not None): res.int_value = 0 res.end_token = tt res.typ = DateItemToken.DateItemType.YEAR return res if (res.int_value <= 12 and t.next0_ is not None and (t.whitespaces_after_count < 3)): tt = t.next0_ if (tt.isValue("ЧАС", None)): if (((isinstance(t.previous, TextToken)) and not t.previous.chars.is_letter and not t.is_whitespace_before) and (isinstance(t.previous.previous, NumberToken)) and not t.previous.is_whitespace_before): pass else: res.typ = DateItemToken.DateItemType.HOUR res.end_token = tt tt = tt.next0_ if (tt is not None and tt.isChar('.')): res.end_token = tt tt = tt.next0_ first_pass2816 = True while True: if first_pass2816: first_pass2816 = False else: tt = tt.next0_ if (not (tt is not None)): break if (tt.isValue("УТРО", "РАНОК")): res.end_token = tt res.typ = DateItemToken.DateItemType.HOUR return res if (tt.isValue("ВЕЧЕР", "ВЕЧІР")): res.end_token = tt res.int_value += 12 res.typ = DateItemToken.DateItemType.HOUR return res if (tt.isValue("ДЕНЬ", None)): res.end_token = tt if (res.int_value < 10): res.int_value += 12 res.typ = DateItemToken.DateItemType.HOUR return res if (tt.isValue("НОЧЬ", "НІЧ")): res.end_token = tt if (res.int_value == 12): res.int_value = 0 elif (res.int_value > 9): res.int_value += 12 res.typ = DateItemToken.DateItemType.HOUR return res if (tt.is_comma or tt.morph.class0_.is_adverb): continue break if (res.typ == DateItemToken.DateItemType.HOUR): return res can_be_year_ = True if (prev is not None and len(prev) > 0 and prev[len(prev) - 1].typ == DateItemToken.DateItemType.MONTH): pass elif ((prev is not None and len(prev) >= 4 and prev[len(prev) - 1].typ == DateItemToken.DateItemType.DELIM) and prev[len(prev) - 2].can_by_month): pass elif (nt.next0_ is not None and ((nt.next0_.isValue("ГОД", None) or nt.next0_.isValue("РІК", None)))): if (res.int_value < 1000): can_be_year_ = False tt = DateItemToken.__testYearRusWord(nt.next0_, False) if (tt is not None and DateItemToken.__isNewAge(tt.next0_)): res.typ = DateItemToken.DateItemType.YEAR res.end_token = tt elif (can_be_year_): if (res.can_be_year): tt = DateItemToken.__testYearRusWord( nt.next0_, res.is_newline_before) if ((tt) is not None): if ((tt.isValue("Г", None) and not tt.is_whitespace_before and t.previous is not None) and ((t.previous.isValue("КОРПУС", None) or t.previous.isValue("КОРП", None)))): pass elif ( (((nt.next0_.isValue("Г", None) and (t.whitespaces_before_count < 3) and t.previous is not None) and t.previous.isValue("Я", None) and t.previous.previous is not None) and t.previous.previous.isCharOf("\\/") and t.previous.previous.previous is not None) and t.previous.previous.previous.isValue( "А", None)): return None else: res.end_token = tt res.typ = DateItemToken.DateItemType.YEAR res.lang = tt.morph.language elif (tt is not None and (nt.whitespaces_after_count < 2) and (nt.end_char - nt.begin_char) == 1): res.end_token = tt res.typ = DateItemToken.DateItemType.YEAR res.lang = tt.morph.language if (nt.previous is not None): if (nt.previous.isValue("В", "У") or nt.previous.isValue("К", None) or nt.previous.isValue("ДО", None)): tt = DateItemToken.__testYearRusWord(nt.next0_, False) if ((tt) is not None): ok = False if ((res.int_value < 100) and (isinstance(tt, TextToken)) and (((tt).term == "ГОДА" or (tt).term == "РОКИ"))): pass else: ok = True if (nt.previous.isValue("ДО", None) and nt.next0_.isValue("Г", None)): cou = 0 ttt = nt.previous.previous while ttt is not None and (cou < 10): mt = MeasureToken.tryParse( ttt, None, False, False) if (mt is not None and mt.end_char > nt.end_char): ok = False break ttt = ttt.previous cou += 1 if (ok): res.end_token = tt res.typ = DateItemToken.DateItemType.YEAR res.lang = tt.morph.language res.begin_token = nt.previous elif (((nt.previous.isValue("IN", None) or nt.previous.isValue("SINCE", None))) and res.can_be_year): res.typ = DateItemToken.DateItemType.YEAR res.begin_token = nt.previous elif (nt.previous.isValue("NEL", None) or nt.previous.isValue("DEL", None)): if (res.can_be_year): res.typ = DateItemToken.DateItemType.YEAR res.lang = MorphLang.IT res.begin_token = nt.previous elif (nt.previous.isValue("IL", None) and res.can_be_day): res.lang = MorphLang.IT res.begin_token = nt.previous t1 = res.end_token.next0_ if (t1 is not None): if ((t1.isValue("ЧАС", None) or t1.isValue("ГОДИНА", None))): if ((((prev is not None and len(prev) == 2 and prev[0].can_be_hour) and prev[1].typ == DateItemToken.DateItemType.DELIM and not prev[1].is_whitespace_after) and not prev[1].is_whitespace_after and res.int_value >= 0) and (res.int_value < 59)): prev[0].typ = DateItemToken.DateItemType.HOUR res.typ = DateItemToken.DateItemType.MINUTE res.end_token = t1 elif (res.int_value < 24): if (t1.next0_ is not None and t1.next0_.isChar('.')): t1 = t1.next0_ res.typ = DateItemToken.DateItemType.HOUR res.end_token = t1 elif ((res.int_value < 60) and ((t1.isValue("МИНУТА", None) or t1.isValue("МИН", None) or t.isValue("ХВИЛИНА", None)))): if (t1.next0_ is not None and t1.next0_.isChar('.')): t1 = t1.next0_ res.typ = DateItemToken.DateItemType.MINUTE res.end_token = t1 elif ((res.int_value < 60) and ((t1.isValue("СЕКУНДА", None) or t1.isValue("СЕК", None)))): if (t1.next0_ is not None and t1.next0_.isChar('.')): t1 = t1.next0_ res.typ = DateItemToken.DateItemType.SECOND res.end_token = t1 elif ((res.int_value < 30) and ((t1.isValue("ВЕК", "ВІК") or t1.isValue("СТОЛЕТИЕ", "СТОЛІТТЯ")))): res.typ = DateItemToken.DateItemType.CENTURY res.end_token = t1 elif (res.int_value <= 4 and t1.isValue("КВАРТАЛ", None)): res.typ = DateItemToken.DateItemType.QUARTAL res.end_token = t1 elif (res.int_value <= 2 and ((t1.isValue("ПОЛУГОДИЕ", None) or t1.isValue("ПІВРІЧЧЯ", None)))): res.typ = DateItemToken.DateItemType.HALFYEAR res.end_token = t1 return res t0 = Utils.asObjectOrNull(t, TextToken) if (t0 is None): return None txt = t0.getSourceText() if ((txt[0] == 'I' or txt[0] == 'X' or txt[0] == 'Х') or txt[0] == 'V'): lat = NumberHelper.tryParseRoman(t) if (lat is not None and lat.end_token.next0_ is not None and lat.int_value is not None): val = lat.int_value tt = lat.end_token.next0_ if (tt.isValue("КВАРТАЛ", None) and val > 0 and val <= 4): return DateItemToken._new654( t, tt, DateItemToken.DateItemType.QUARTAL, val) if (tt.isValue("ПОЛУГОДИЕ", "ПІВРІЧЧЯ") and val > 0 and val <= 2): return DateItemToken._new654( t, lat.end_token.next0_, DateItemToken.DateItemType.HALFYEAR, val) if (tt.isValue("ВЕК", "ВІК") or tt.isValue("СТОЛЕТИЕ", "СТОЛІТТЯ")): return DateItemToken._new654( t, lat.end_token.next0_, DateItemToken.DateItemType.CENTURY, val) if (tt.isValue("В", None) and tt.next0_ is not None and tt.next0_.isChar('.')): if (prev is not None and len(prev) > 0 and prev[len(prev) - 1].typ == DateItemToken.DateItemType.POINTER): return DateItemToken._new654( t, tt.next0_, DateItemToken.DateItemType.CENTURY, val) if (DateItemToken.__isNewAge(tt.next0_.next0_)): return DateItemToken._new654( t, tt.next0_, DateItemToken.DateItemType.CENTURY, val) if (tt.is_hiphen): lat2 = NumberHelper.tryParseRoman(tt.next0_) if ((lat2 is not None and lat2.int_value is not None and lat2.int_value > val) and lat2.end_token.next0_ is not None): if (lat2.end_token.next0_.isValue("ВЕК", "ВІК") or lat2.end_token.next0_.isValue( "СТОЛЕТИЕ", "СТОЛІТТЯ")): return DateItemToken._new654( t, lat.end_token, DateItemToken.DateItemType.CENTURY, val) if (t is not None and t.isValue("НАПРИКІНЦІ", None)): return DateItemToken._new660(t, t, DateItemToken.DateItemType.POINTER, "конец") if (t is not None and t.isValue("ДОНЕДАВНА", None)): return DateItemToken._new660(t, t, DateItemToken.DateItemType.POINTER, "сегодня") tok = DateItemToken.M_SEASONS.tryParse(t, TerminParseAttr.NO) if ((tok is not None and (Utils.valToEnum(tok.termin.tag, DatePointerType)) == DatePointerType.SUMMER and t.morph.language.is_ru) and (isinstance(t, TextToken))): str0_ = (t).term if (str0_ != "ЛЕТОМ" and str0_ != "ЛЕТА" and str0_ != "ЛЕТО"): tok = (None) if (tok is not None): return DateItemToken._new654( t, tok.end_token, DateItemToken.DateItemType.POINTER, Utils.valToEnum(tok.termin.tag, DatePointerType)) npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0) if (npt is not None): tok = DateItemToken.M_SEASONS.tryParse(npt.end_token, TerminParseAttr.NO) if ((tok is not None and (Utils.valToEnum(tok.termin.tag, DatePointerType)) == DatePointerType.SUMMER and t.morph.language.is_ru) and (isinstance(t, TextToken))): str0_ = (t).term if (str0_ != "ЛЕТОМ" and str0_ != "ЛЕТА" and str0_ != "ЛЕТО"): tok = (None) if (tok is not None): return DateItemToken._new654( t, tok.end_token, DateItemToken.DateItemType.POINTER, Utils.valToEnum(tok.termin.tag, DatePointerType)) typ_ = DateItemToken.DateItemType.NUMBER if (npt.noun.isValue("КВАРТАЛ", None)): typ_ = DateItemToken.DateItemType.QUARTAL elif (npt.end_token.isValue("ПОЛУГОДИЕ", None) or npt.end_token.isValue("ПІВРІЧЧЯ", None)): typ_ = DateItemToken.DateItemType.HALFYEAR elif (npt.end_token.isValue("НАЧАЛО", None) or npt.end_token.isValue("ПОЧАТОК", None)): return DateItemToken._new660( t, npt.end_token, DateItemToken.DateItemType.POINTER, "начало") elif (npt.end_token.isValue("СЕРЕДИНА", None)): return DateItemToken._new660( t, npt.end_token, DateItemToken.DateItemType.POINTER, "середина") elif (npt.end_token.isValue("КОНЕЦ", None) or npt.end_token.isValue("КІНЕЦЬ", None) or npt.end_token.isValue("НАПРИКІНЕЦЬ", None)): return DateItemToken._new660( t, npt.end_token, DateItemToken.DateItemType.POINTER, "конец") elif (npt.end_token.isValue("ВРЕМЯ", None) and len(npt.adjectives) > 0 and npt.end_token.previous.isValue("НАСТОЯЩЕЕ", None)): return DateItemToken._new660( t, npt.end_token, DateItemToken.DateItemType.POINTER, "сегодня") elif (npt.end_token.isValue("ЧАС", None) and len(npt.adjectives) > 0 and npt.end_token.previous.isValue("ДАНИЙ", None)): return DateItemToken._new660( t, npt.end_token, DateItemToken.DateItemType.POINTER, "сегодня") if (typ_ != DateItemToken.DateItemType.NUMBER): delta = 0 if (len(npt.adjectives) > 0): if (npt.adjectives[0].isValue("ПОСЛЕДНИЙ", None) or npt.adjectives[0].isValue("ОСТАННІЙ", None)): return DateItemToken._new654( t0, npt.end_token, typ_, (4 if typ_ == DateItemToken.DateItemType.QUARTAL else 2)) if (npt.adjectives[0].isValue("ПРЕДЫДУЩИЙ", None) or npt.adjectives[0].isValue("ПОПЕРЕДНІЙ", None)): delta = -1 elif (npt.adjectives[0].isValue("СЛЕДУЮЩИЙ", None) or npt.adjectives[0].isValue("ПОСЛЕДУЮЩИЙ", None) or npt.adjectives[0].isValue("НАСТУПНИЙ", None)): delta = 1 else: return None cou = 0 tt = t.previous first_pass2817 = True while True: if first_pass2817: first_pass2817 = False else: tt = tt.previous if (not (tt is not None)): break if (cou > 200): break dr = Utils.asObjectOrNull(tt.getReferent(), DateRangeReferent) if (dr is None): continue if (typ_ == DateItemToken.DateItemType.QUARTAL): ii = dr.quarter_number if (ii < 1): continue ii += delta if ((ii < 1) or ii > 4): continue return DateItemToken._new654(t0, npt.end_token, typ_, ii) if (typ_ == DateItemToken.DateItemType.HALFYEAR): ii = dr.halfyear_number if (ii < 1): continue ii += delta if ((ii < 1) or ii > 2): continue return DateItemToken._new654(t0, npt.end_token, typ_, ii) term = t0.term if (not str.isalnum(term[0])): if (t0.isCharOf(".\\/:") or t0.is_hiphen): return DateItemToken._new660(t0, t0, DateItemToken.DateItemType.DELIM, term) elif (t0.isChar(',')): return DateItemToken._new660(t0, t0, DateItemToken.DateItemType.DELIM, term) else: return None if (term == "O" or term == "О"): if ((isinstance(t.next0_, NumberToken)) and not t.is_whitespace_after and len( (t.next0_).value) == 1): return DateItemToken._new654(t, t.next0_, DateItemToken.DateItemType.NUMBER, (t.next0_).int_value) if (str.isalpha(term[0])): inf = DateItemToken.M_MONTHES.tryParse(t, TerminParseAttr.NO) if (inf is not None and inf.termin.tag is None): inf = DateItemToken.M_MONTHES.tryParse(inf.end_token.next0_, TerminParseAttr.NO) if (inf is not None and (isinstance(inf.termin.tag, int))): return DateItemToken._new675(inf.begin_token, inf.end_token, DateItemToken.DateItemType.MONTH, inf.termin.tag, inf.termin.lang) return None
def tryAttach(t: 'Token') -> 'ParenthesisToken': if (t is None): return None tok = ParenthesisToken.__m_termins.tryParse(t, TerminParseAttr.NO) if (tok is not None): res = ParenthesisToken(t, tok.end_token) return res if (not ((isinstance(t, TextToken)))): return None mc = t.getMorphClassInDictionary() ok = False if (mc.is_adverb): ok = True elif (mc.is_adjective): if (t.morph.containsAttr("сравн.", None) and t.morph.containsAttr("кач.прил.", None)): ok = True if (ok and t.next0_ is not None): if (t.next0_.isChar(',')): return ParenthesisToken(t, t) t1 = t.next0_ if (t1.getMorphClassInDictionary() == MorphClass.VERB): if (t1.morph.containsAttr("н.вр.", None) and t1.morph.containsAttr("нес.в.", None) and t1.morph.containsAttr("дейст.з.", None)): return ParenthesisToken(t, t1) t1 = (None) if ((t.isValue("В", None) and t.next0_ is not None and t.next0_.isValue("СООТВЕТСТВИЕ", None)) and t.next0_.next0_ is not None and t.next0_.next0_.morph.class0_.is_preposition): t1 = t.next0_.next0_.next0_ elif (t.isValue("СОГЛАСНО", None)): t1 = t.next0_ elif (t.isValue("В", None) and t.next0_ is not None): if (t.next0_.isValue("СИЛА", None)): t1 = t.next0_.next0_ elif (t.next0_.morph.class0_.is_adjective or t.next0_.morph.class0_.is_pronoun): npt = NounPhraseHelper.tryParse(t.next0_, NounPhraseParseAttr.NO, 0) if (npt is not None): if (npt.noun.isValue("ВИД", None) or npt.noun.isValue("СЛУЧАЙ", None) or npt.noun.isValue("СФЕРА", None)): return ParenthesisToken(t, npt.end_token) if (t1 is not None): if (t1.next0_ is not None): npt1 = NounPhraseHelper.tryParse(t1, NounPhraseParseAttr.NO, 0) if (npt1 is not None): if (npt1.noun.isValue("НОРМА", None) or npt1.noun.isValue("ПОЛОЖЕНИЕ", None) or npt1.noun.isValue("УКАЗАНИЕ", None)): t1 = npt1.end_token.next0_ r = t1.getReferent() if (r is not None): res = ParenthesisToken._new1086(t, t1, r) if (t1.next0_ is not None and t1.next0_.is_comma): sila = False ttt = t1.next0_.next0_ first_pass2873 = True while True: if first_pass2873: first_pass2873 = False else: ttt = ttt.next0_ if (not (ttt is not None)): break if (ttt.isValue("СИЛА", None) or ttt.isValue("ДЕЙСТВИЕ", None)): sila = True continue if (ttt.is_comma): if (sila): res.end_token = ttt.previous break if (BracketHelper.canBeStartOfSequence( ttt, False, False)): break return res npt = NounPhraseHelper.tryParse(t1, NounPhraseParseAttr.NO, 0) if (npt is not None): return ParenthesisToken(t, npt.end_token) tt = t if (tt.isValue("НЕ", None) and t is not None): tt = tt.next0_ if (tt.morph.class0_.is_preposition and tt is not None): tt = tt.next0_ npt1 = NounPhraseHelper.tryParse(tt, NounPhraseParseAttr.NO, 0) if (npt1 is not None): tt = npt1.end_token if (tt.next0_ is not None and tt.next0_.is_comma): return ParenthesisToken(t, tt.next0_) if (npt1.noun.isValue("ОЧЕРЕДЬ", None)): return ParenthesisToken(t, tt) if (t.isValue("ВЕДЬ", None)): return ParenthesisToken(t, t) return None
def parse(t0: 'Token', lev_: int) -> 'MailLine': if (t0 is None): return None res = MailLine(t0, t0) pr = True t = t0 first_pass3027 = True while True: if first_pass3027: first_pass3027 = False else: t = t.next0_ if (not (t is not None)): break if (t.is_newline_before and t0 != t): break res.end_token = t if (t.is_table_control_char or t.is_hiphen): continue if (pr): if ((isinstance(t, TextToken)) and t.isCharOf(">|")): res.lev += 1 else: pr = False tok = MailLine.M_FROM_WORDS.tryParse(t, TerminParseAttr.NO) if (tok is not None and tok.end_token.next0_ is not None and tok.end_token.next0_.isChar(':')): res.typ = MailLine.Types.FROM t = tok.end_token.next0_ continue if (isinstance(t, ReferentToken)): r = t.getReferent() if (r is not None): if ((((isinstance(r, PersonReferent)) or (isinstance(r, GeoReferent)) or (isinstance(r, AddressReferent))) or r.type_name == "PHONE" or r.type_name == "URI") or (isinstance(r, PersonPropertyReferent)) or r.type_name == "ORGANIZATION"): res.refs.append(r) if (res.typ == MailLine.Types.UNDEFINED): t = t0 while t is not None and (t.end_char < res.end_char): if (not t.is_hiphen and t.chars.is_letter): break t = t.next0_ ok = 0 nams = 0 oth = 0 last_comma = None first_pass3028 = True while True: if first_pass3028: first_pass3028 = False else: t = t.next0_ if (not (t is not None and (t.end_char < res.end_char))): break if (isinstance(t.getReferent(), PersonReferent)): nams += 1 continue if (isinstance(t, TextToken)): if (not t.chars.is_letter): last_comma = t continue tok = MailLine.M_HELLO_WORDS.tryParse( t, TerminParseAttr.NO) if (tok is not None): ok += 1 t = tok.end_token continue if (t.isValue("ВСЕ", None) or t.isValue("ALL", None) or t.isValue("TEAM", None)): nams += 1 continue pit = PersonItemToken.tryAttach( t, None, PersonItemToken.ParseAttr.NO, None) if (pit is not None): nams += 1 t = pit.end_token continue oth += 1 if ((oth) > 3): if (ok > 0 and last_comma is not None): res.end_token = last_comma oth = 0 break if ((oth < 3) and ok > 0): res.typ = MailLine.Types.HELLO if (res.typ == MailLine.Types.UNDEFINED): ok_words = 0 if (t0.isValue("HAVE", None)): pass t = t0 first_pass3029 = True while True: if first_pass3029: first_pass3029 = False else: t = t.next0_ if (not (t is not None and t.end_char <= res.end_char)): break if (not ((isinstance(t, TextToken)))): continue if (t.isChar('<')): br = BracketHelper.tryParse(t, BracketParseAttr.NO, 100) if (br is not None): t = br.end_token continue if (not t.is_letters or t.is_table_control_char): continue tok = MailLine.M_REGARD_WORDS.tryParse(t, TerminParseAttr.NO) if (tok is not None): ok_words += 1 while t is not None and t.end_char <= tok.end_char: t.tag = (tok.termin) t = t.next0_ t = tok.end_token if ((isinstance(t.next0_, TextToken)) and t.next0_.morph.case_.is_genitive): t = t.next0_ first_pass3030 = True while True: if first_pass3030: first_pass3030 = False else: t = t.next0_ if (not (t.end_char <= res.end_char)): break if (t.morph.class0_.is_conjunction): continue npt1 = NounPhraseHelper.tryParse( t, NounPhraseParseAttr.NO, 0) if (npt1 is None): break if (not npt1.morph.case_.is_genitive): break while t.end_char < npt1.end_char: t.tag = (t) t = t.next0_ t.tag = (t) continue if ((t.morph.class0_.is_preposition or t.morph.class0_.is_conjunction or t.morph.class0_.is_misc) or t.isValue("C", None)): continue if ((ok_words > 0 and t.previous is not None and t.previous.is_comma) and t.previous.begin_char > t0.begin_char and not t.chars.is_all_lower): res.end_token = t.previous break npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0) if (npt is None): if ((res.end_char - t.end_char) > 10): ok_words = 0 break tok = MailLine.M_REGARD_WORDS.tryParse(npt.end_token, TerminParseAttr.NO) if (tok is not None and (isinstance(npt.end_token, TextToken))): term = (npt.end_token).term if (term == "ДЕЛ"): tok = (None) if (tok is None): if (npt.noun.isValue("НАДЕЖДА", None)): t.tag = (t) elif (ok_words > 0 and t.isValue("NICE", None) and ((res.end_char - npt.end_char) < 13)): t.tag = (t) else: ok_words = 0 break ok_words += 1 while t is not None and t.end_char <= tok.end_char: t.tag = (tok.termin) t = t.next0_ t = tok.end_token if (ok_words > 0): res.typ = MailLine.Types.BESTREGARDS if (res.typ == MailLine.Types.UNDEFINED): t = t0 while t is not None and (t.end_char < res.end_char): if (not ((isinstance(t, TextToken)))): break elif (not t.is_hiphen and t.chars.is_letter): break t = t.next0_ if (t is not None): if (t != t0): pass if (((t.isValue("ПЕРЕСЫЛАЕМОЕ", None) or t.isValue("ПЕРЕАДРЕСОВАННОЕ", None))) and t.next0_ is not None and t.next0_.isValue("СООБЩЕНИЕ", None)): res.typ = MailLine.Types.FROM res.must_be_first_line = True elif ((t.isValue("НАЧАЛО", None) and t.next0_ is not None and ((t.next0_.isValue("ПЕРЕСЫЛАЕМОЕ", None) or t.next0_.isValue("ПЕРЕАДРЕСОВАННОЕ", None)))) and t.next0_.next0_ is not None and t.next0_.next0_.isValue("СООБЩЕНИЕ", None)): res.typ = MailLine.Types.FROM res.must_be_first_line = True elif (t.isValue("ORIGINAL", None) and t.next0_ is not None and ((t.next0_.isValue("MESSAGE", None) or t.next0_.isValue("APPOINTMENT", None)))): res.typ = MailLine.Types.FROM res.must_be_first_line = True elif (t.isValue("ПЕРЕСЛАНО", None) and t.next0_ is not None and t.next0_.isValue("ПОЛЬЗОВАТЕЛЕМ", None)): res.typ = MailLine.Types.FROM res.must_be_first_line = True elif (((t.getReferent() is not None and t.getReferent().type_name == "DATE")) or ((t.isValue("IL", None) and t.next0_ is not None and t.next0_.isValue("GIORNO", None))) or ((t.isValue("ON", None) and (isinstance(t.next0_, ReferentToken)) and t.next0_.getReferent().type_name == "DATE"))): has_from = False has_date = t.getReferent() is not None and t.getReferent( ).type_name == "DATE" if (t.is_newline_after and (lev_ < 5)): res1 = MailLine.parse(t.next0_, lev_ + 1) if (res1 is not None and res1.typ == MailLine.Types.HELLO): res.typ = MailLine.Types.FROM next0__ = MailLine.parse(res.end_token.next0_, lev_ + 1) if (next0__ is not None): if (next0__.typ != MailLine.Types.UNDEFINED): next0__ = (None) tmax = res.end_char if (next0__ is not None): tmax = next0__.end_char br1 = None while t is not None and t.end_char <= tmax: if (t.isValue("ОТ", None) or t.isValue("FROM", None)): has_from = True elif ( t.getReferent() is not None and ((t.getReferent().type_name == "URI" or (isinstance(t.getReferent(), PersonReferent))))): if (t.getReferent().type_name == "URI" and has_date): if (br1 is not None): has_from = True next0__ = (None) if (t.previous.isChar('<') and t.next0_ is not None and t.next0_.isChar('>')): t = t.next0_ if (t.next0_ is not None and t.next0_.isChar(':')): t = t.next0_ if (t.is_newline_after): has_from = True next0__ = (None) t = t.next0_ while t is not None and t.end_char <= res.end_char: if (t.isValue("HA", None) and t.next0_ is not None and t.next0_.isValue("SCRITTO", None)): has_from = True break elif (((t.isValue("НАПИСАТЬ", None) or t.isValue("WROTE", None))) and ((res.end_char - t.end_char) < 10)): has_from = True break t = t.next0_ if (has_from): res.typ = MailLine.Types.FROM if (next0__ is not None and t.end_char >= next0__.begin_char): res.end_token = next0__.end_token break elif (br1 is None and not t.isChar('<') and BracketHelper.canBeStartOfSequence( t, True, False)): br1 = BracketHelper.tryParse( t, BracketParseAttr.NO, 100) if (br1 is not None): t = br1.end_token t = t.next0_ else: has_uri = False while t is not None and (t.end_char < res.end_char): if (t.getReferent() is not None and ((t.getReferent().type_name == "URI" or (isinstance(t.getReferent(), PersonReferent))))): has_uri = True elif (t.isValue("ПИСАТЬ", None) and has_uri): if (t.next0_ is not None and t.next0_.isChar('(')): if (has_uri): res.typ = MailLine.Types.FROM break t = t.next0_ return res
def __getNameWithoutBrackets(begin: 'Token', end: 'Token', normalize_first_noun_group: bool = False, normal_first_group_single: bool = False, ignore_geo_referent: bool = False) -> str: """ Получить строковое значение между токенами, при этом исключая кавычки и скобки Args: begin(Token): начальный токен end(Token): конечный токен normalize_first_noun_group(bool): нормализовывать ли первую именную группу (именит. падеж) normal_first_group_single(bool): приводить ли к единственному числу первую именную группу ignore_geo_referent(bool): игнорировать внутри географические сущности """ res = None if (BracketHelper.canBeStartOfSequence(begin, False, False) and BracketHelper.canBeEndOfSequence(end, False, begin, False)): begin = begin.next0_ end = end.previous if (normalize_first_noun_group and not begin.morph.class0_.is_preposition): npt = NounPhraseHelper.tryParse( begin, NounPhraseParseAttr.REFERENTCANBENOUN, 0) if (npt is not None): if (npt.noun.getMorphClassInDictionary().is_undefined and len(npt.adjectives) == 0): npt = (None) if (npt is not None and npt.end_token.end_char > end.end_char): npt = (None) if (npt is not None): res = npt.getNormalCaseText(None, normal_first_group_single, MorphGender.UNDEFINED, False) te = npt.end_token.next0_ if (((te is not None and te.next0_ is not None and te.is_comma) and (isinstance(te.next0_, TextToken)) and te.next0_.end_char <= end.end_char) and te.next0_.morph.class0_.is_verb and te.next0_.morph.class0_.is_adjective): for it in te.next0_.morph.items: if (it.gender == npt.morph.gender or (((it.gender) & (npt.morph.gender))) != (MorphGender.UNDEFINED)): if (not ( (it.case_) & npt.morph.case_).is_undefined): if (it.number == npt.morph.number or (((it.number) & (npt.morph.number))) != (MorphNumber.UNDEFINED)): var = (te.next0_).term if (isinstance(it, MorphWordForm)): var = (it).normal_case bi = MorphBaseInfo._new549( MorphClass.ADJECTIVE, npt.morph.gender, npt.morph.number, npt.morph.language) var = Morphology.getWordform(var, bi) if (var is not None): res = "{0}, {1}".format(res, var) te = te.next0_.next0_ break if (te is not None and te.end_char <= end.end_char): s = ProperNameHelper.getNameEx(te, end, MorphClass.UNDEFINED, MorphCase.UNDEFINED, MorphGender.UNDEFINED, True, ignore_geo_referent) if (not Utils.isNullOrEmpty(s)): if (not str.isalnum(s[0])): res = "{0}{1}".format(res, s) else: res = "{0} {1}".format(res, s) elif ((isinstance(begin, TextToken)) and begin.chars.is_cyrillic_letter): mm = begin.getMorphClassInDictionary() if (not mm.is_undefined): res = begin.getNormalCaseText(mm, False, MorphGender.UNDEFINED, False) if (begin.end_char < end.end_char): res = "{0} {1}".format( res, ProperNameHelper.getNameEx(begin.next0_, end, MorphClass.UNDEFINED, MorphCase.UNDEFINED, MorphGender.UNDEFINED, True, False)) if (res is None): res = ProperNameHelper.getNameEx(begin, end, MorphClass.UNDEFINED, MorphCase.UNDEFINED, MorphGender.UNDEFINED, True, ignore_geo_referent) if (not Utils.isNullOrEmpty(res)): k = 0 i = len(res) - 1 while i >= 0: if (res[i] == '*' or Utils.isWhitespace(res[i])): pass else: break i -= 1 k += 1 if (k > 0): if (k == len(res)): return None res = res[0:0 + len(res) - k] return res
def tryAttachTerritory( li: typing.List['TerrItemToken'], ad: 'AnalyzerData', attach_always: bool = False, cits: typing.List['CityItemToken'] = None, exists: typing.List['GeoReferent'] = None) -> 'ReferentToken': if (li is None or len(li) == 0): return None ex_obj = None new_name = None adj_list = list() noun = None add_noun = None rt = TerrAttachHelper.__tryAttachMoscowAO(li, ad) if (rt is not None): return rt if (li[0].termin_item is not None and li[0].termin_item.canonic_text == "ТЕРРИТОРИЯ"): res2 = TerrAttachHelper.__tryAttachPureTerr(li, ad) return res2 if (len(li) == 2): if (li[0].rzd is not None and li[1].rzd_dir is not None): rzd = GeoReferent() rzd._addName(li[1].rzd_dir) rzd._addTypTer(li[0].kit.base_language) rzd.addSlot(GeoReferent.ATTR_REF, li[0].rzd.referent, False, 0) rzd.addExtReferent(li[0].rzd) return ReferentToken(rzd, li[0].begin_token, li[1].end_token) if (li[1].rzd is not None and li[0].rzd_dir is not None): rzd = GeoReferent() rzd._addName(li[0].rzd_dir) rzd._addTypTer(li[0].kit.base_language) rzd.addSlot(GeoReferent.ATTR_REF, li[1].rzd.referent, False, 0) rzd.addExtReferent(li[1].rzd) return ReferentToken(rzd, li[0].begin_token, li[1].end_token) can_be_city_before = False adj_terr_before = False if (cits is not None): if (cits[0].typ == CityItemToken.ItemType.CITY): can_be_city_before = True elif (cits[0].typ == CityItemToken.ItemType.NOUN and len(cits) > 1): can_be_city_before = True k = 0 while k < len(li): if (li[k].onto_item is not None): if (ex_obj is not None or new_name is not None): break if (noun is not None): if (k == 1): if (noun.termin_item.canonic_text == "РАЙОН" or noun.termin_item.canonic_text == "ОБЛАСТЬ" or noun.termin_item.canonic_text == "СОЮЗ"): if (isinstance(li[k].onto_item.referent, GeoReferent)): if ((li[k].onto_item.referent).is_state): break ok = False tt = li[k].end_token.next0_ if (tt is None): ok = True elif (tt.isCharOf(",.")): ok = True if (not ok): ok = MiscLocationHelper.checkGeoObjectBefore( li[0].begin_token) if (not ok): adr = AddressItemToken.tryParse( tt, None, False, False, None) if (adr is not None): if (adr.typ == AddressItemToken.ItemType.STREET): ok = True if (not ok): break if (li[k].onto_item is not None): if (noun.begin_token.isValue("МО", None) or noun.begin_token.isValue("ЛО", None)): return None ex_obj = li[k] elif (li[k].termin_item is not None): if (noun is not None): break if (li[k].termin_item.is_always_prefix and k > 0): break if (k > 0 and li[k].is_doubt): if (li[k].begin_token == li[k].end_token and li[k].begin_token.isValue("ЗАО", None)): break if (li[k].termin_item.is_adjective or li[k].is_geo_in_dictionary): adj_list.append(li[k]) else: if (ex_obj is not None): geo_ = Utils.asObjectOrNull(ex_obj.onto_item.referent, GeoReferent) if (geo_ is None): break if (ex_obj.is_adjective and ((li[k].termin_item.canonic_text == "СОЮЗ" or li[k].termin_item.canonic_text == "ФЕДЕРАЦИЯ"))): str0_ = str(ex_obj.onto_item) if (not li[k].termin_item.canonic_text in str0_): return None if (li[k].termin_item.canonic_text == "РАЙОН" or li[k].termin_item.canonic_text == "ОКРУГ" or li[k].termin_item.canonic_text == "КРАЙ"): tmp = io.StringIO() for s in geo_.slots: if (s.type_name == GeoReferent.ATTR_TYPE): print("{0};".format(s.value), end="", file=tmp, flush=True) if (not li[k].termin_item.canonic_text in Utils.toStringStringIO(tmp).upper()): if (k != 1 or new_name is not None): break new_name = li[0] new_name.is_adjective = True new_name.onto_item = (None) ex_obj = (None) noun = li[k] if (k == 0): tt = TerrItemToken.tryParse(li[k].begin_token.previous, None, True, False) if (tt is not None and tt.morph.class0_.is_adjective): adj_terr_before = True else: if (ex_obj is not None): break if (new_name is not None): break new_name = li[k] k += 1 name = None alt_name = None full_name = None morph_ = None if (ex_obj is not None): if (ex_obj.is_adjective and not ex_obj.morph.language.is_en and noun is None): if (attach_always and ex_obj.end_token.next0_ is not None): npt = NounPhraseHelper.tryParse(ex_obj.begin_token, NounPhraseParseAttr.NO, 0) if (ex_obj.end_token.next0_.is_comma_and): pass elif (npt is None): pass else: str0_ = StreetItemToken.tryParse( ex_obj.end_token.next0_, None, False, None, False) if (str0_ is not None): if (str0_.typ == StreetItemType.NOUN and str0_.end_token == npt.end_token): return None else: cit = CityItemToken.tryParse(ex_obj.end_token.next0_, None, False, None) if (cit is not None and ((cit.typ == CityItemToken.ItemType.NOUN or cit.typ == CityItemToken.ItemType.CITY))): npt = NounPhraseHelper.tryParse( ex_obj.begin_token, NounPhraseParseAttr.NO, 0) if (npt is not None and npt.end_token == cit.end_token): pass else: return None elif (ex_obj.begin_token.isValue("ПОДНЕБЕСНЫЙ", None)): pass else: return None if (noun is None and ex_obj.can_be_city): cit0 = CityItemToken.tryParseBack(ex_obj.begin_token.previous) if (cit0 is not None and cit0.typ != CityItemToken.ItemType.PROPERNAME): return None if (ex_obj.is_doubt and noun is None): ok2 = False if (TerrAttachHelper.__canBeGeoAfter(ex_obj.end_token.next0_)): ok2 = True elif (not ex_obj.can_be_surname and not ex_obj.can_be_city): if ((ex_obj.end_token.next0_ is not None and ex_obj.end_token.next0_.isChar(')') and ex_obj.begin_token.previous is not None) and ex_obj.begin_token.previous.isChar('(')): ok2 = True elif (ex_obj.chars.is_latin_letter and ex_obj.begin_token.previous is not None): if (ex_obj.begin_token.previous.isValue("IN", None)): ok2 = True elif (ex_obj.begin_token.previous.isValue("THE", None) and ex_obj.begin_token.previous.previous is not None and ex_obj.begin_token.previous.previous.isValue( "IN", None)): ok2 = True if (not ok2): cit0 = CityItemToken.tryParseBack( ex_obj.begin_token.previous) if (cit0 is not None and cit0.typ != CityItemToken.ItemType.PROPERNAME): pass elif (MiscLocationHelper.checkGeoObjectBefore( ex_obj.begin_token.previous)): pass else: return None name = ex_obj.onto_item.canonic_text morph_ = ex_obj.morph elif (new_name is not None): if (noun is None): return None j = 1 while j < k: if (li[j].is_newline_before and not li[0].is_newline_before): return None j += 1 morph_ = noun.morph if (new_name.is_adjective): if (noun.termin_item.acronym == "АО"): if (noun.begin_token != noun.end_token): return None if (new_name.morph.gender != MorphGender.FEMINIE): return None geo_before = None tt0 = li[0].begin_token.previous if (tt0 is not None and tt0.is_comma_and): tt0 = tt0.previous if (not li[0].is_newline_before and tt0 is not None): geo_before = (Utils.asObjectOrNull(tt0.getReferent(), GeoReferent)) if (Utils.indexOfList(li, noun, 0) < Utils.indexOfList( li, new_name, 0)): if (noun.termin_item.is_state): return None if (new_name.can_be_surname and geo_before is None): if (((noun.morph.case_) & new_name.morph.case_).is_undefined): return None if (MiscHelper.isExistsInDictionary( new_name.begin_token, new_name.end_token, (MorphClass.ADJECTIVE) | MorphClass.PRONOUN | MorphClass.VERB)): if (noun.begin_token != new_name.begin_token): if (geo_before is None): if (len(li) == 2 and TerrAttachHelper.__canBeGeoAfter( li[1].end_token.next0_)): pass elif (len(li) == 3 and li[2].termin_item is not None and TerrAttachHelper.__canBeGeoAfter( li[2].end_token.next0_)): pass elif (new_name.is_geo_in_dictionary): pass elif (new_name.end_token.is_newline_after): pass else: return None npt = NounPhraseHelper.tryParse( new_name.end_token, NounPhraseParseAttr.PARSEPRONOUNS, 0) if (npt is not None and npt.end_token != new_name.end_token): if (len(li) >= 3 and li[2].termin_item is not None and npt.end_token == li[2].end_token): add_noun = li[2] else: return None rtp = new_name.kit.processReferent("PERSON", new_name.begin_token) if (rtp is not None): return None name = ProperNameHelper.getNameEx(new_name.begin_token, new_name.end_token, MorphClass.ADJECTIVE, MorphCase.UNDEFINED, noun.termin_item.gender, False, False) else: ok = False if (((k + 1) < len(li)) and li[k].termin_item is None and li[k + 1].termin_item is not None): ok = True elif ((k < len(li)) and li[k].onto_item is not None): ok = True elif (k == len(li) and not new_name.is_adj_in_dictionary): ok = True elif (MiscLocationHelper.checkGeoObjectBefore( li[0].begin_token) or can_be_city_before): ok = True elif (MiscLocationHelper.checkGeoObjectAfter( li[k - 1].end_token)): ok = True elif (len(li) == 3 and k == 2): cit = CityItemToken.tryParse(li[2].begin_token, None, False, None) if (cit is not None): if (cit.typ == CityItemToken.ItemType.CITY or cit.typ == CityItemToken.ItemType.NOUN): ok = True elif (len(li) == 2): ok = TerrAttachHelper.__canBeGeoAfter( li[len(li) - 1].end_token.next0_) if (not ok and not li[0].is_newline_before and not li[0].chars.is_all_lower): rt00 = li[0].kit.processReferent( "PERSONPROPERTY", li[0].begin_token.previous) if (rt00 is not None): ok = True if (noun.termin_item is not None and noun.termin_item.is_strong and new_name.is_adjective): ok = True if (noun.is_doubt and len(adj_list) == 0 and geo_before is None): return None name = ProperNameHelper.getNameEx(new_name.begin_token, new_name.end_token, MorphClass.ADJECTIVE, MorphCase.UNDEFINED, noun.termin_item.gender, False, False) if (not ok and not attach_always): if (MiscHelper.isExistsInDictionary( new_name.begin_token, new_name.end_token, (MorphClass.ADJECTIVE) | MorphClass.PRONOUN | MorphClass.VERB)): if (exists is not None): for e0_ in exists: if (e0_.findSlot(GeoReferent.ATTR_NAME, name, True) is not None): ok = True break if (not ok): return None full_name = "{0} {1}".format( ProperNameHelper.getNameEx(li[0].begin_token, noun.begin_token.previous, MorphClass.ADJECTIVE, MorphCase.UNDEFINED, noun.termin_item.gender, False, False), noun.termin_item.canonic_text) else: if (not attach_always or ((noun.termin_item is not None and noun.termin_item.canonic_text == "ФЕДЕРАЦИЯ"))): is_latin = noun.chars.is_latin_letter and new_name.chars.is_latin_letter if (Utils.indexOfList(li, noun, 0) > Utils.indexOfList( li, new_name, 0)): if (not is_latin): return None if (not new_name.is_district_name and not BracketHelper.canBeStartOfSequence( new_name.begin_token, False, False)): if (len(adj_list) == 0 and MiscHelper.isExistsInDictionary( new_name.begin_token, new_name.end_token, (MorphClass.NOUN) | MorphClass.PRONOUN)): if (len(li) == 2 and noun.is_city_region and (noun.whitespaces_after_count < 2)): pass else: return None if (not is_latin): if ((noun.termin_item.is_region and not attach_always and ((not adj_terr_before or new_name.is_doubt))) and not noun.is_city_region and not noun.termin_item.is_specific_prefix): if (not MiscLocationHelper. checkGeoObjectBefore( noun.begin_token)): if (not noun.is_doubt and noun.begin_token != noun.end_token): pass else: return None if (noun.is_doubt and len(adj_list) == 0): if (((noun.termin_item.acronym == "МО" or noun.termin_item.acronym == "ЛО")) and k == (len(li) - 1) and li[k].termin_item is not None): add_noun = li[k] k += 1 else: return None pers = new_name.kit.processReferent( "PERSON", new_name.begin_token) if (pers is not None): return None name = MiscHelper.getTextValue(new_name.begin_token, new_name.end_token, GetTextAttr.NO) if (new_name.begin_token != new_name.end_token): ttt = new_name.begin_token.next0_ while ttt is not None and ttt.end_char <= new_name.end_char: if (ttt.chars.is_letter): ty = TerrItemToken.tryParse( ttt, None, False, False) if ((ty is not None and ty.termin_item is not None and noun is not None) and ((noun.termin_item.canonic_text in ty.termin_item.canonic_text or ty.termin_item.canonic_text in noun.termin_item.canonic_text))): name = MiscHelper.getTextValue( new_name.begin_token, ttt.previous, GetTextAttr.NO) break ttt = ttt.next0_ if (len(adj_list) > 0): npt = NounPhraseHelper.tryParse(adj_list[0].begin_token, NounPhraseParseAttr.NO, 0) if (npt is not None and npt.end_token == noun.end_token): alt_name = "{0} {1}".format( npt.getNormalCaseText(None, False, MorphGender.UNDEFINED, False), name) else: if ((len(li) == 1 and noun is not None and noun.end_token.next0_ is not None) and (isinstance( noun.end_token.next0_.getReferent(), GeoReferent))): g = Utils.asObjectOrNull(noun.end_token.next0_.getReferent(), GeoReferent) if (noun.termin_item is not None): tyy = noun.termin_item.canonic_text.lower() ooo = False if (g.findSlot(GeoReferent.ATTR_TYPE, tyy, True) is not None): ooo = True elif (tyy.endswith("район") and g.findSlot( GeoReferent.ATTR_TYPE, "район", True) is not None): ooo = True if (ooo): return ReferentToken._new719(g, noun.begin_token, noun.end_token.next0_, noun.begin_token.morph) if ((len(li) == 1 and noun == li[0] and li[0].termin_item is not None) and TerrItemToken.tryParse( li[0].end_token.next0_, None, True, False) is None and TerrItemToken.tryParse(li[0].begin_token.previous, None, True, False) is None): if (li[0].morph.number == MorphNumber.PLURAL): return None cou = 0 str0_ = li[0].termin_item.canonic_text.lower() tt = li[0].begin_token.previous first_pass2898 = True while True: if first_pass2898: first_pass2898 = False else: tt = tt.previous if (not (tt is not None)): break if (tt.is_newline_after): cou += 10 else: cou += 1 if (cou > 500): break g = Utils.asObjectOrNull(tt.getReferent(), GeoReferent) if (g is None): continue ok = True cou = 0 tt = li[0].end_token.next0_ first_pass2899 = True while True: if first_pass2899: first_pass2899 = False else: tt = tt.next0_ if (not (tt is not None)): break if (tt.is_newline_before): cou += 10 else: cou += 1 if (cou > 500): break tee = TerrItemToken.tryParse(tt, None, True, False) if (tee is None): continue ok = False break if (ok): ii = 0 while g is not None and (ii < 3): if (g.findSlot(GeoReferent.ATTR_TYPE, str0_, True) is not None): return ReferentToken._new719( g, li[0].begin_token, li[0].end_token, noun.begin_token.morph) g = g.higher ii += 1 break return None ter = None if (ex_obj is not None and (isinstance(ex_obj.tag, GeoReferent))): ter = (Utils.asObjectOrNull(ex_obj.tag, GeoReferent)) else: ter = GeoReferent() if (ex_obj is not None): geo_ = Utils.asObjectOrNull(ex_obj.onto_item.referent, GeoReferent) if (geo_ is not None and not geo_.is_city): ter._mergeSlots2(geo_, li[0].kit.base_language) else: ter._addName(name) if (noun is None and ex_obj.can_be_city): ter._addTypCity(li[0].kit.base_language) else: pass elif (new_name is not None): ter._addName(name) if (alt_name is not None): ter._addName(alt_name) if (noun is not None): if (noun.termin_item.canonic_text == "АО"): ter._addTyp( ("АВТОНОМНИЙ ОКРУГ" if li[0].kit.base_language.is_ua else "АВТОНОМНЫЙ ОКРУГ")) elif (noun.termin_item.canonic_text == "МУНИЦИПАЛЬНОЕ СОБРАНИЕ" or noun.termin_item.canonic_text == "МУНІЦИПАЛЬНЕ ЗБОРИ"): ter._addTyp(("МУНІЦИПАЛЬНЕ УТВОРЕННЯ" if li[0].kit.base_language.is_ua else "МУНИЦИПАЛЬНОЕ ОБРАЗОВАНИЕ")) elif (noun.termin_item.acronym == "МО" and add_noun is not None): ter._addTyp(add_noun.termin_item.canonic_text) else: if (noun.termin_item.canonic_text == "СОЮЗ" and ex_obj is not None and ex_obj.end_char > noun.end_char): return ReferentToken._new719(ter, ex_obj.begin_token, ex_obj.end_token, ex_obj.morph) ter._addTyp(noun.termin_item.canonic_text) if (noun.termin_item.is_region and ter.is_state): ter._addTypReg(li[0].kit.base_language) if (ter.is_state and ter.is_region): for a in adj_list: if (a.termin_item.is_region): ter._addTypReg(li[0].kit.base_language) break if (ter.is_state): if (full_name is not None): ter._addName(full_name) res = ReferentToken(ter, li[0].begin_token, li[k - 1].end_token) if (noun is not None and noun.morph.class0_.is_noun): res.morph = noun.morph else: res.morph = MorphCollection() ii = 0 while ii < k: for v in li[ii].morph.items: bi = MorphBaseInfo(v) if (noun is not None): if (bi.class0_.is_adjective): bi.class0_ = MorphClass.NOUN res.morph.addItem(bi) ii += 1 if (li[0].termin_item is not None and li[0].termin_item.is_specific_prefix): res.begin_token = li[0].end_token.next0_ if (add_noun is not None and add_noun.end_char > res.end_char): res.end_token = add_noun.end_token if ((isinstance(res.begin_token.previous, TextToken)) and (res.whitespaces_before_count < 2)): tt = Utils.asObjectOrNull(res.begin_token.previous, TextToken) if (tt.term == "АР"): for ty in ter.typs: if ("республика" in ty or "республіка" in ty): res.begin_token = tt break return res
def tryAttach(t : 'Token') -> 'TitleItemToken': tt = Utils.asObjectOrNull(t, TextToken) if (tt is not None): t1 = tt if (tt.term == "ТЕМА"): tit = TitleItemToken.tryAttach(tt.next0_) if (tit is not None and tit.typ == TitleItemToken.Types.TYP): t1 = tit.end_token if (t1.next0_ is not None and t1.next0_.isChar(':')): t1 = t1.next0_ return TitleItemToken._new2501(t, t1, TitleItemToken.Types.TYPANDTHEME, tit.value) if (tt.next0_ is not None and tt.next0_.isChar(':')): t1 = tt.next0_ return TitleItemToken(tt, t1, TitleItemToken.Types.THEME) if (tt.term == "ПО" or tt.term == "НА"): if (tt.next0_ is not None and tt.next0_.isValue("ТЕМА", None)): t1 = tt.next0_ if (t1.next0_ is not None and t1.next0_.isChar(':')): t1 = t1.next0_ return TitleItemToken(tt, t1, TitleItemToken.Types.THEME) if (tt.term == "ПЕРЕВОД" or tt.term == "ПЕР"): tt2 = tt.next0_ if (tt2 is not None and tt2.isChar('.')): tt2 = tt2.next0_ if (isinstance(tt2, TextToken)): if ((tt2).term == "C" or (tt2).term == "С"): tt2 = tt2.next0_ if (isinstance(tt2, TextToken)): return TitleItemToken(t, tt2, TitleItemToken.Types.TRANSLATE) if (tt.term == "СЕКЦИЯ" or tt.term == "SECTION" or tt.term == "СЕКЦІЯ"): t1 = tt.next0_ if (t1 is not None and t1.isChar(':')): t1 = t1.next0_ br = BracketHelper.tryParse(t1, BracketParseAttr.NO, 100) if (br is not None): t1 = br.end_token elif (t1 != tt.next0_): while t1 is not None: if (t1.is_newline_after): break t1 = t1.next0_ if (t1 is None): return None if (t1 != tt.next0_): return TitleItemToken(tt, t1, TitleItemToken.Types.DUST) t1 = (None) if (tt.isValue("СПЕЦИАЛЬНОСТЬ", "СПЕЦІАЛЬНІСТЬ")): t1 = tt.next0_ elif (tt.morph.class0_.is_preposition and tt.next0_ is not None and tt.next0_.isValue("СПЕЦИАЛЬНОСТЬ", "СПЕЦІАЛЬНІСТЬ")): t1 = tt.next0_.next0_ elif (tt.isChar('/') and tt.is_newline_before): t1 = tt.next0_ if (t1 is not None): if (t1.isCharOf(":") or t1.is_hiphen): t1 = t1.next0_ spec = TitleItemToken.__tryAttachSpeciality(t1, True) if (spec is not None): spec.begin_token = t return spec sss = TitleItemToken.__tryAttachSpeciality(t, False) if (sss is not None): return sss if (isinstance(t, ReferentToken)): return None npt = NounPhraseHelper.tryParse(t, NounPhraseParseAttr.NO, 0) if (npt is not None): s = npt.getNormalCaseText(None, False, MorphGender.UNDEFINED, False) tok = TitleItemToken.M_TERMINS.tryParse(npt.end_token, TerminParseAttr.NO) if (tok is not None): ty = Utils.valToEnum(tok.termin.tag, TitleItemToken.Types) if (ty == TitleItemToken.Types.TYP): tit = TitleItemToken.tryAttach(tok.end_token.next0_) if (tit is not None and tit.typ == TitleItemToken.Types.THEME): return TitleItemToken._new2501(npt.begin_token, tit.end_token, TitleItemToken.Types.TYPANDTHEME, s) if (s == "РАБОТА" or s == "РОБОТА" or s == "ПРОЕКТ"): return None t1 = tok.end_token if (s == "ДИССЕРТАЦИЯ" or s == "ДИСЕРТАЦІЯ"): err = 0 ttt = t1.next0_ first_pass3125 = True while True: if first_pass3125: first_pass3125 = False else: ttt = ttt.next0_ if (not (ttt is not None)): break if (ttt.morph.class0_.is_preposition): continue if (ttt.isValue("СОИСКАНИЕ", "")): continue npt1 = NounPhraseHelper.tryParse(ttt, NounPhraseParseAttr.NO, 0) if (npt1 is not None and npt1.noun.isValue("СТЕПЕНЬ", "СТУПІНЬ")): ttt = npt1.end_token t1 = ttt continue rt = t1.kit.processReferent("PERSON", ttt) if (rt is not None and (isinstance(rt.referent, PersonPropertyReferent))): ppr = Utils.asObjectOrNull(rt.referent, PersonPropertyReferent) if (ppr.name == "доктор наук"): t1 = rt.end_token s = "ДОКТОРСКАЯ ДИССЕРТАЦИЯ" break elif (ppr.name == "кандидат наук"): t1 = rt.end_token s = "КАНДИДАТСКАЯ ДИССЕРТАЦИЯ" break elif (ppr.name == "магистр"): t1 = rt.end_token s = "МАГИСТЕРСКАЯ ДИССЕРТАЦИЯ" break if (ttt.isValue("ДОКТОР", None) or ttt.isValue("КАНДИДАТ", None) or ttt.isValue("МАГИСТР", "МАГІСТР")): t1 = ttt npt1 = NounPhraseHelper.tryParse(ttt.next0_, NounPhraseParseAttr.NO, 0) if (npt1 is not None and npt1.end_token.isValue("НАУК", None)): t1 = npt1.end_token s = ("МАГИСТЕРСКАЯ ДИССЕРТАЦИЯ" if ttt.isValue("МАГИСТР", "МАГІСТР") else ("ДОКТОРСКАЯ ДИССЕРТАЦИЯ" if ttt.isValue("ДОКТОР", None) else "КАНДИДАТСКАЯ ДИССЕРТАЦИЯ")) break err += 1 if ((err) > 3): break if (t1.next0_ is not None and t1.next0_.isChar('.')): t1 = t1.next0_ if (s.endswith("ОТЧЕТ") and t1.next0_ is not None and t1.next0_.isValue("О", None)): npt1 = NounPhraseHelper.tryParse(t1.next0_, NounPhraseParseAttr.PARSEPREPOSITION, 0) if (npt1 is not None and npt1.morph.case_.is_prepositional): t1 = npt1.end_token return TitleItemToken._new2501(npt.begin_token, t1, ty, s) tok1 = TitleItemToken.M_TERMINS.tryParse(t, TerminParseAttr.NO) if (tok1 is not None): t1 = tok1.end_token re = TitleItemToken(tok1.begin_token, t1, Utils.valToEnum(tok1.termin.tag, TitleItemToken.Types)) return re if (BracketHelper.canBeStartOfSequence(t, False, False)): tok1 = TitleItemToken.M_TERMINS.tryParse(t.next0_, TerminParseAttr.NO) if (tok1 is not None and BracketHelper.canBeEndOfSequence(tok1.end_token.next0_, False, None, False)): t1 = tok1.end_token.next0_ return TitleItemToken(tok1.begin_token, t1, Utils.valToEnum(tok1.termin.tag, TitleItemToken.Types)) return None
def tryCreateCanonicDecreeRefUri(t : 'Token') -> 'CanonicDecreeRefUri': """ Это для оформления ссылок по некоторым стандартам (когда гиперссылкой нужно выделить не всю сущность, а лишь некоторую её часть) Args: t(Token): """ if (not ((isinstance(t, ReferentToken)))): return None dr = Utils.asObjectOrNull(t.getReferent(), DecreeReferent) if (dr is not None): if (dr.kind == DecreeKind.PUBLISHER): return None res = CanonicDecreeRefUri._new806(t.kit.sofa.text, dr, t.begin_char, t.end_char) if ((t.previous is not None and t.previous.isChar('(') and t.next0_ is not None) and t.next0_.isChar(')')): return res if ((t).misc_attrs != 0): return res rt = Utils.asObjectOrNull(t, ReferentToken) if (rt.begin_token.isChar('(') and rt.end_token.isChar(')')): res = CanonicDecreeRefUri._new806(t.kit.sofa.text, dr, rt.begin_token.next0_.begin_char, rt.end_token.previous.end_char) return res next_decree_items = None if ((t.next0_ is not None and t.next0_.is_comma_and and (isinstance(t.next0_.next0_, ReferentToken))) and (isinstance(t.next0_.next0_.getReferent(), DecreeReferent))): next_decree_items = DecreeToken.tryAttachList((t.next0_.next0_).begin_token, None, 10, False) if (next_decree_items is not None and len(next_decree_items) > 1): i = 0 while i < (len(next_decree_items) - 1): if (next_decree_items[i].is_newline_after): del next_decree_items[i + 1:i + 1+len(next_decree_items) - i - 1] break i += 1 was_typ = False was_num = False tt = (t).begin_token first_pass2832 = True while True: if first_pass2832: first_pass2832 = False else: tt = tt.next0_ if (not (tt is not None and tt.end_char <= t.end_char)): break if (tt.begin_char == t.begin_char and tt.isChar('(') and tt.next0_ is not None): res.begin_char = tt.next0_.begin_char if (tt.isChar('(') and tt.next0_ is not None and tt.next0_.isValue("ДАЛЕЕ", None)): if (res.end_char >= tt.begin_char): res.end_char = tt.previous.end_char break if (tt.end_char == t.end_char and tt.isChar(')')): res.end_char = tt.previous.end_char tt1 = tt.previous while tt1 is not None and tt1.begin_char >= res.begin_char: if (tt1.isChar('(') and tt1.previous is not None): if (res.begin_char < tt1.previous.begin_char): res.end_char = tt1.previous.end_char tt1 = tt1.previous li = DecreeToken.tryAttachList(tt, None, 10, False) if (li is not None and len(li) > 0): ii = 0 while ii < (len(li) - 1): if (li[ii].typ == DecreeToken.ItemType.TYP and li[ii + 1].typ == DecreeToken.ItemType.TERR): res.type_with_geo = MiscHelper.getTextValue(li[ii].begin_token, li[ii + 1].end_token, GetTextAttr.FIRSTNOUNGROUPTONOMINATIVESINGLE) ii += 1 if ((next_decree_items is not None and len(next_decree_items) > 1 and (len(next_decree_items) < len(li))) and next_decree_items[0].typ != DecreeToken.ItemType.TYP): d = len(li) - len(next_decree_items) j = 0 while j < len(next_decree_items): if (next_decree_items[j].typ != li[d + j].typ): break j += 1 if (j >= len(next_decree_items)): del li[0:0+d] res.begin_char = li[0].begin_char elif ((next_decree_items is not None and len(next_decree_items) == 1 and next_decree_items[0].typ == DecreeToken.ItemType.NAME) and len(li) == 2 and li[1].typ == DecreeToken.ItemType.NAME): res.begin_char = li[1].begin_char res.end_char = li[1].end_char break elif ((next_decree_items is not None and len(next_decree_items) == 1 and next_decree_items[0].typ == DecreeToken.ItemType.NUMBER) and li[len(li) - 1].typ == DecreeToken.ItemType.NUMBER): res.begin_char = li[len(li) - 1].begin_char res.end_char = li[len(li) - 1].end_char i = 0 first_pass2833 = True while True: if first_pass2833: first_pass2833 = False else: i += 1 if (not (i < len(li))): break l_ = li[i] if (l_.begin_char > t.end_char): del li[i:i+len(li) - i] break if (l_.typ == DecreeToken.ItemType.NAME): if (not was_num): if (dr.kind == DecreeKind.CONTRACT): continue if (((i + 1) < len(li)) and ((li[i + 1].typ == DecreeToken.ItemType.DATE or li[i + 1].typ == DecreeToken.ItemType.NUMBER))): continue ee = l_.begin_token.previous.end_char if (ee > res.begin_char and (ee < res.end_char)): res.end_char = ee break if (l_.typ == DecreeToken.ItemType.NUMBER): was_num = True if (i == 0): if (l_.typ == DecreeToken.ItemType.TYP): was_typ = True elif (l_.typ == DecreeToken.ItemType.OWNER or l_.typ == DecreeToken.ItemType.ORG): if (((i + 1) < len(li)) and ((li[1].typ == DecreeToken.ItemType.DATE or li[1].typ == DecreeToken.ItemType.NUMBER))): was_typ = True if (was_typ): tt0 = l_.begin_token.previous if (tt0 is not None and tt0.isChar('.')): tt0 = tt0.previous if (tt0 is not None and ((tt0.isValue("УТВЕРЖДЕННЫЙ", None) or tt0.isValue("УТВЕРДИТЬ", None) or tt0.isValue("УТВ", None)))): if (l_.begin_char > res.begin_char): res.begin_char = l_.begin_char if (res.end_char < res.begin_char): res.end_char = t.end_char res.is_adopted = True if (len(li) > 0): tt = li[len(li) - 1].end_token if (tt.isChar(')')): tt = tt.previous continue if (was_typ): na = DecreeToken.tryAttachName(tt, dr.typ0, True, False) if (na is not None and tt.begin_char > t.begin_char): tt1 = na.end_token.next0_ if (tt1 is not None and tt1.isCharOf(",()")): tt1 = tt1.next0_ if (tt1 is not None and (tt1.end_char < t.end_char)): if (tt1.isValue("УТВЕРЖДЕННЫЙ", None) or tt1.isValue("УТВЕРДИТЬ", None) or tt1.isValue("УТВ", None)): tt = tt1 continue if (tt.previous is not None and tt.previous.isChar(':') and na.end_char <= res.end_char): res.begin_char = tt.begin_char break if (tt.previous.end_char > res.begin_char): res.end_char = tt.previous.end_char break return res dpr = Utils.asObjectOrNull(t.getReferent(), DecreePartReferent) if (dpr is None): return None if ((t.previous is not None and t.previous.is_hiphen and (isinstance(t.previous.previous, ReferentToken))) and (isinstance(t.previous.previous.getReferent(), DecreePartReferent))): if (DecreePartReferent.createRangeReferent(Utils.asObjectOrNull(t.previous.previous.getReferent(), DecreePartReferent), dpr) is not None): return None t1 = t has_diap = False diap_ref = None if ((t.next0_ is not None and t.next0_.is_hiphen and (isinstance(t.next0_.next0_, ReferentToken))) and (isinstance(t.next0_.next0_.getReferent(), DecreePartReferent))): diap = DecreePartReferent.createRangeReferent(Utils.asObjectOrNull(dpr, DecreePartReferent), Utils.asObjectOrNull(t.next0_.next0_.getReferent(), DecreePartReferent)) if (diap is not None): dpr = diap has_diap = True t1 = t.next0_.next0_ diap_ref = (Utils.asObjectOrNull(t1, ReferentToken)) res = CanonicDecreeRefUri._new808(t.kit.sofa.text, dpr, t.begin_char, t1.end_char, has_diap) if ((t.previous is not None and t.previous.isChar('(') and t1.next0_ is not None) and t1.next0_.isChar(')')): return res tt = (t).begin_token while tt is not None and tt.end_char <= t.end_char: if (isinstance(tt.getReferent(), DecreeReferent)): if (tt.begin_char > t.begin_char): res.end_char = tt.previous.end_char if (tt.previous.morph.class0_.is_preposition and tt.previous.previous is not None): res.end_char = tt.previous.previous.end_char elif (tt.end_char < t.end_char): res.begin_char = tt.begin_char break tt = tt.next0_ has_same_before = DecreeHelper.__hasSameDecree(t, dpr, True) has_same_after = DecreeHelper.__hasSameDecree(t, dpr, False) ptmin = PartToken.ItemType.PREFIX ptmin2 = PartToken.ItemType.PREFIX max0_ = 0 max2 = 0 for s in dpr.slots: pt = PartToken._getTypeByAttrName(s.type_name) if (pt == PartToken.ItemType.PREFIX): continue co = PartToken._getRank(pt) if (co < 1): if (pt == PartToken.ItemType.PART and dpr.findSlot(DecreePartReferent.ATTR_CLAUSE, None, True) is not None): co = PartToken._getRank(PartToken.ItemType.PARAGRAPH) else: continue if (co > max0_): max2 = max0_ ptmin2 = ptmin max0_ = co ptmin = pt elif (co > max2): max2 = co ptmin2 = pt if (ptmin != PartToken.ItemType.PREFIX): tt = (t).begin_token while tt is not None and tt.end_char <= res.end_char: if (tt.begin_char >= res.begin_char): pt = PartToken.tryAttach(tt, None, False, False) if (pt is not None and pt.typ == ptmin): res.begin_char = pt.begin_char res.end_char = pt.end_char if (pt.typ == PartToken.ItemType.APPENDIX and pt.end_token.isValue("К", None) and pt.begin_token != pt.end_token): res.end_char = pt.end_token.previous.end_char if (pt.end_char == t.end_char): if ((t.next0_ is not None and t.next0_.is_comma_and and (isinstance(t.next0_.next0_, ReferentToken))) and (isinstance(t.next0_.next0_.getReferent(), DecreePartReferent))): tt1 = (t.next0_.next0_).begin_token ok = True if (tt1.chars.is_letter): ok = False if (ok): for v in pt.values: res.begin_char = v.begin_char res.end_char = v.end_char break if (not has_diap): return res break tt = tt.next0_ if (has_diap and diap_ref is not None): tt = diap_ref.begin_token while tt is not None and tt.end_char <= diap_ref.end_char: if (tt.isChar(',')): break if (tt != diap_ref.begin_token and tt.is_whitespace_before): break res.end_char = tt.end_char tt = tt.next0_ return res if (((has_same_before or has_same_after)) and ptmin != PartToken.ItemType.PREFIX): tt = (t).begin_token first_pass2834 = True while True: if first_pass2834: first_pass2834 = False else: tt = tt.next0_ if (not (tt is not None and tt.end_char <= res.end_char)): break if (tt.begin_char >= res.begin_char): pt = (PartToken.tryAttach(tt, None, False, False) if not has_same_before else None) if (pt is not None): if (pt.typ == ptmin): for v in pt.values: res.begin_char = v.begin_char res.end_char = v.end_char return res tt = pt.end_token continue if ((isinstance(tt, NumberToken)) and tt.begin_char == res.begin_char): res.end_char = tt.end_char while tt is not None and tt.next0_ is not None: if (not tt.next0_.isChar('.') or tt.is_whitespace_after or tt.next0_.is_whitespace_after): break if (not ((isinstance(tt.next0_.next0_, NumberToken)))): break tt = tt.next0_.next0_ res.end_char = tt.end_char if (tt.next0_ is not None and tt.next0_.is_hiphen): if (isinstance(tt.next0_.next0_, NumberToken)): tt = tt.next0_.next0_ res.end_char = tt.end_char while tt is not None and tt.next0_ is not None: if (not tt.next0_.isChar('.') or tt.is_whitespace_after or tt.next0_.is_whitespace_after): break if (not ((isinstance(tt.next0_.next0_, NumberToken)))): break tt = tt.next0_.next0_ res.end_char = tt.end_char elif (tt.next0_.next0_ is not None and (isinstance(tt.next0_.next0_.getReferent(), DecreePartReferent)) and has_diap): res.end_char = (tt.next0_.next0_).begin_token.end_char return res if (BracketHelper.canBeStartOfSequence(tt, True, False) and tt.begin_char == res.begin_char and has_same_before): br = BracketHelper.tryParse(tt, BracketParseAttr.NO, 100) if (br is not None and br.end_token.previous == tt.next0_): res.end_char = br.end_char return res return res if (not has_same_before and not has_same_after and ptmin != PartToken.ItemType.PREFIX): tt = (t).begin_token while tt is not None and tt.end_char <= res.end_char: if (tt.begin_char >= res.begin_char): pts = PartToken.tryAttachList(tt, False, 40) if (pts is None or len(pts) == 0): break i = 0 while i < len(pts): if (pts[i].typ == ptmin): res.begin_char = pts[i].begin_char res.end_char = pts[i].end_char tt = pts[i].end_token if (tt.next0_ is not None and tt.next0_.is_hiphen): if (isinstance(tt.next0_.next0_, NumberToken)): res.end_char = tt.next0_.next0_.end_char elif (tt.next0_.next0_ is not None and (isinstance(tt.next0_.next0_.getReferent(), DecreePartReferent)) and has_diap): res.end_char = (tt.next0_.next0_).begin_token.end_char return res i += 1 tt = tt.next0_ return res