def test_slice_doc_1(self): text = 'этилен мама этилен' __doc = LegalDocument(text) __doc.parse() subdoc = __doc.subdoc_slice(slice(2, 3)) self.assertEqual('этилен', subdoc.text)
def test_normalize_doc_slice_1(self): doc_text = """\n\n\nАкционерное 3`4`` общество «Газпром - 'Вибраниум' и Криптонит» (АО «ГВК»), "именуемое" в собранием `` акционеров собранием `` акционеров \'\' \ дальнейшем «Благотворитель», """ doc_o = LegalDocument(doc_text) doc_o.parse() print(doc_o.tokens_map.tokens)
def __init__(self, original_text): LegalDocument.__init__(self, original_text) # self.subjects: SemanticTag or None = None self.contract_values: [ContractValue] = [] self.agents_tags: [SemanticTag] = [] self.attributes_tree = ContractSchema()
def find_sections( self, doc: LegalDocument, factory: AbstractPatternFactory, headlines: List[str], headline_patterns_prefix: str = 'headline.', confidence_threshold=HyperParameters.header_topic_min_confidence ) -> dict: sections_filtered = {} for section_type in headlines: # find best header for each section pattern_prefix = f'{headline_patterns_prefix}{section_type}' headers: [LegalDocument] = [ doc.subdoc_slice(p.header.as_slice()) for p in doc.paragraphs ] _max_confidence = 0 _max_header_i = 0 for header_index, header in enumerate(headers): if header.text and header.text.strip(): vvs = header.calculate_distances_per_pattern( factory, pattern_prefix=pattern_prefix, merge=False) vv = max_exclusive_pattern(list(vvs.values())) _confidence = max(vv) if _confidence > _max_confidence: _max_confidence = _confidence _max_header_i = header_index if _max_confidence > confidence_threshold: # TODO: use one-hots, do not collapse to a single topic put_if_better(sections_filtered, _max_header_i, (_max_confidence, section_type), lambda a, b: a[1] < b[1]) sections = {} for header_i in sections_filtered: confidence, section_type = sections_filtered[header_i] para = doc.paragraphs[header_i] body = doc.subdoc_slice(para.body.as_slice(), name=section_type + '.body') head = doc.subdoc_slice(para.header.as_slice(), name=section_type + ".head") hl_info = HeadlineMeta(header_i, section_type, confidence, head, body) sections[section_type] = hl_info doc.sections = sections # TODO: keep doc immutable return sections
def test_concat_docs(self): tm1 = LegalDocument('text prefix \n').parse() tm2 = LegalDocument('more words').parse() N = 10 expected_tokens = len(tm1.tokens) + N * len(tm2.tokens) for _ in range(N): tm1 += tm2 # //tm1.parse() self.assertEqual(expected_tokens, len(tm1.tokens))
def save_analysis(db_document: DbJsonDoc, doc: LegalDocument, state: int, retry_number: int = 0): # TODO: does not save attributes analyse_json_obj: dict = doc.to_json_obj() db = get_mongodb_connection() documents_collection = db['documents'] db_document.analysis = analyse_json_obj db_document.state = state db_document.retry_number = retry_number documents_collection.update({'_id': doc.get_id()}, db_document.as_dict(), True)
def test_normalize_doc_tokenization(self): doc_text = """n\n\nАкционерное общество «Газпром - Вибраниум и Криптонит» (АО «ГВК»), именуемое в \ дальнейшем «Благотворитель», в лице заместителя генерального директора по персоналу и \ организационному развитию Неизвестного И.И., действующего на основании на основании Доверенности № Д-17 от 29.01.2018г, \ с одной стороны, и Фонд поддержки социальных инициатив «Интерстеларные пущи», именуемый в дальнейшем «Благополучатель», \ в лице Генерального директора ____________________действующего на основании Устава, с другой стороны, \ именуемые совместно «Стороны», а по отдельности «Сторона», заключили настоящий Договор о нижеследующем: """ doc = LegalDocument(doc_text) doc.parse() self.assertEqual(doc.tokens_map.text.lower(), doc.tokens_map_norm.text.lower()) for i in range(len(doc.tokens)): self.assertEqual(doc.tokens[i].lower(), doc.tokens_cc[i].lower())
def test_slice_doc_2(self): text = 'этилен мама этилен' __doc = LegalDocument(text) __doc.parse() tm: TextMap = __doc.tokens_map subdoc = __doc.subdoc_slice(slice(0, 1)) del __doc tm2: TextMap = subdoc.tokens_map self.assertEqual('этилен', tm2[0]) self.assertEqual('этилен', tm2.text) self.assertEqual(0, tm2.token_index_by_char(1))
def test_concat_docs_2(self): tm1 = LegalDocument('text prefix \n').parse() tm2 = LegalDocument('\rmore words').parse() N = 10 expected_tokens = len(tm1.tokens_cc) + N * len(tm2.tokens_cc) for _ in range(N): tm1 += tm2 print(tm1.tokens_map_norm._full_text) # //tm1.parse() self.assertEqual(expected_tokens, len(tm1.tokens_cc)) self.assertEqual('more words', tm1.tokens_map_norm.text_range((3, 5)))
def test_doc_parser(self): db = get_mongodb_connection() if db is None: # TODO: this is a weird way of detecting we're on CI return FILENAME = "/Users/artem/work/nemo/goil/IN/Другие договоры/Договор Формула.docx" wp = WordDocParser() res = wp.read_doc(FILENAME) doc: LegalDocument = LegalDocument('') doc.parse() last = 0 for d in res['documents']: for p in d['paragraphs']: header_text = p['paragraphHeader']['text'] + '\n' body_text = p['paragraphBody']['text'] + '\n' header = LegalDocument(header_text) header.parse() # self.assertEqual(self.n(header_text), header.text) doc += header headerspan = (last, len(doc.tokens_map)) print(headerspan) last = len(doc.tokens_map) body = LegalDocument(body_text) body.parse() doc += body bodyspan = (last, len(doc.tokens_map)) header_tag = SemanticTag('headline', header_text, headerspan) body_tag = SemanticTag('paragraphBody', None, bodyspan) print(header_tag) # print(body_tag) para = Paragraph(header_tag, body_tag) doc.paragraphs.append(para) last = len(doc.tokens_map) h_subdoc = doc.subdoc_slice(para.header.as_slice()) b_subdoc = doc.subdoc_slice(para.body.as_slice()) # self.assertEqual(self.n(header_text), h_subdoc.text) # self.assertEqual(self.n(body_text), b_subdoc.text) print('-' * 100) print(doc.text) headers = [ doc.subdoc_slice(p.header.as_slice()) for p in doc.paragraphs ] print('-' * 100)
def test_finditer__a(self): from analyser.transaction_values import _re_greather_then text = """стоимость, равную или превышающую 2000000 ( два миллиона ) долларов сша, но менее""" __doc = LegalDocument(text) __doc.parse() doc = __doc.subdoc_slice(slice(2, len(__doc.tokens_map))) tm = doc.tokens_map iter = tm.finditer(_re_greather_then) spans_ = [t for t in iter] spans = spans_[0] self.assertEqual('превышающую', tm.text_range(spans)) self.assertEqual(2, spans[0]) self.assertEqual(3, spans[1])
def test_find_agent_fond_2(self): txt = ''' основании Устава, с одной стороны, и Фонд «Благо», именуемое в дальнейшем «Благополучатель», в лице председателя''' r = re.compile(r_quoted_name, re.MULTILINE) x = r.search(n(txt)) self.assertEqual('Благо', x['name']) r = re.compile(r_type_and_name, re.MULTILINE) x = r.search(n(txt)) self.assertEqual('Фонд', x['type']) self.assertEqual('Благо', x['name']) r = re.compile(complete_re_str_org, re.MULTILINE) x = r.search(n(txt)) self.assertEqual('Фонд', x['type']) self.assertEqual('Благо', x['name']) r = re.compile(complete_re_str, re.MULTILINE) x = r.search(n(txt)) self.assertEqual('Фонд', x['type']) self.assertEqual('Благо', x['name']) r = complete_re x = r.search(n(txt)) self.assertEqual('Фонд', x['type']) self.assertEqual('Благо', x['name']) tags: List[SemanticTag] = find_org_names(LegalDocument(txt).parse(), decay_confidence=False) self._validate_org(tags, 1, ('Фонд', 'Благо', 'Благополучатель'))
def test_find_agent_fond(self): txt = '''Одобрить предоставление безвозмездной финансовой помощи Фонду «Олимп» в размере 1500000 (один миллион пятьсот тысяч) рублей \ для создания и организации работы интернет-платформы «Олимп» по поддержке стартапов в сфере взаимопомощи. Время подведения итогов голосования – 18 часов 00 минут.''' r = re.compile(r_quoted_name, re.MULTILINE) x = r.search(n(txt)) self.assertEqual('Олимп', x['name']) r = re.compile(r_type_and_name, re.MULTILINE) x = r.search(n(txt)) self.assertEqual('Фонду', x['type']) self.assertEqual('Олимп', x['name']) r = re.compile(complete_re_str_org, re.MULTILINE) x = r.search(n(txt)) self.assertEqual('Фонду', x['type']) self.assertEqual('Олимп', x['name']) r = re.compile(complete_re_str, re.MULTILINE) x = r.search(n(txt)) self.assertEqual('Фонду', x['type']) self.assertEqual('Олимп', x['name']) r = complete_re x = r.search(n(txt)) self.assertEqual('Фонду', x['type']) self.assertEqual('Олимп', x['name']) tags: List[SemanticTag] = find_org_names(LegalDocument(txt).parse(), decay_confidence=False) self._validate_org(tags, 1, ('Фонду', 'Олимп', None))
def test_org_dict_0_1(self): t0 = """Общество с ограниченной ответственностью «Газпромнефть-сахалин», в лице Генерального директора, Имя Имя Имя, действующего на основании Устава, именуемое в дальнейшем «Заказчик», и ЧАСТНОЕ""" \ + _suffix tags: [SemanticTag] = find_org_names(LegalDocument(t0).parse()) self._validate_org(tags, 1, ('Общество с ограниченной ответственностью', 'Газпромнефть-Сахалин', 'Заказчик'))
def test_org_dict_4_2(self): t = n( """Государственное автономное учреждение дополнительного профессионального образования Свердловской области «Армавирский учебно-технический центр», на основании Лицензии на право осуществления образовательной деятельности в лице директора Птицына Евгения Георгиевича, действующего на основании Устава, с одной стороны, """ ) tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse()) self._validate_org(tags, 1, ('Государственное автономное учреждение', 'Армавирский учебно-технический центр', None))
def test_PARAGRAPH_DELIMITER_docs(self): tm1 = LegalDocument(f'text\rprefix {PARAGRAPH_DELIMITER} postfix').parse() expected_tokens = ['text', 'prefix', '\n', 'postfix'] self.assertEqual(expected_tokens, tm1.tokens) self.assertEqual('text\rprefix', tm1.tokens_map.text_range((0, 2))) self.assertEqual('text\rprefix', tm1.tokens_map_norm.text_range((0, 2)))
def test_org_dict_3_1(self): t = n(""" Федеральное государственное бюджетное образовательное учреждение высшего образования «Государственный университет» (ФГБОУ ВО «ГУ»), именуемое в дальнейшем «Исполнитель», в лице ____________________ Сергеева """) tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse()) self._validate_org(tags, 1, ( 'Федеральное государственное бюджетное образовательное учреждение высшего образования', 'Государственный университет', 'Исполнитель'))
def is_same_org(self, legal_doc: LegalDocument, db_doc, subsidiary: str): warnings.warn("use _same_org", DeprecationWarning) if db_doc.get("user") is not None and db_doc["user"].get( "attributes") is not None and db_doc["user"]["attributes"].get( "org-1-name") is not None: if subsidiary == db_doc["user"]["attributes"]["org-1-name"][ "value"]: return True else: return legal_doc.is_same_org(subsidiary)
def test_org_dict_2(self): t = n(""" ООО «Газпромнефть-Региональные продажи» в дальнейшем «БлаготворЮтель», с другой стороны """) tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse()) self._validate_org( tags, 1, ('Общество с ограниченной ответственностью', 'Газпромнефть-Региональные продажи', 'БлаготворЮтель'))
def test_embedd_large(self): point1 = [1, 6, 4] emb = FakeEmbedder(point1) ld = LegalDocument('a b c d e f g h').parse() print(ld.tokens) emb.embedd_large(ld.tokens_map_norm, 5) # print(ld.embeddings) print(ld.tokens)
def test_find_ip3(self): t = n(""" Сибирь , и ИП Лужин В. В., именуемый в дальнейшем « Исполнитель » , \ с другой стороны , именуемые в дальнейшем совместно « Стороны » , а по отдельности - « Сторона » , заключили настоящий договор о нижеследующем : """) tags: [SemanticTag] = find_org_names(LegalDocument(t).parse()) self._validate_org( tags, 1, ('Индивидуальный предприниматель', 'Лужин В. В.', 'Исполнитель'))
def test_org_dict_4_1(self): t = n( """Автономная некоммерческая организация дополнительного профессионального образования «ООО», \ именуемое далее Исполнитель, в лице Директора Уткиной Е.В., действующей на основании Устава, с одной стороны,""" ) tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse()) self._validate_org( tags, 1, ('Автономная некоммерческая организация', 'ООО', 'Исполнитель'))
def test_charter_parser(self): # from renderer import SilentRenderer point1 = [1, 6, 4] emb = FakeEmbedder(point1) legal_doc = LegalDocument("1. ЮРИДИЧЕСКИЙ содержание 4.").parse() charter = CharterDocument(legal_doc).parse() charter_parser = CharterParser(emb, emb) actx = AuditContext() charter_parser.find_org_date_number(charter, actx) charter_parser.find_attributes(charter, actx) print(charter.warnings)
def test_org_dict_1(self): t = n( "ООО «Газпромнефть-Региональные продажи», в лице начальника управления по связям с общественностью " "Иванова Семена Евгеньевича, действующего на основании Доверенности в дальнейшем «Благотворитель», " "с другой стороны заключили настоящий Договор о нижеследующем: \n") tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse()) self._validate_org( tags, 1, ('Общество с ограниченной ответственностью', 'Газпромнефть-Региональные продажи', 'Благотворитель'))
def _find_most_relevant_paragraph(section: LegalDocument, attention_vector: FixedVector, min_len: int, return_delimiters=True): _blur = HyperParameters.subject_paragraph_attention_blur _padding = _blur * 2 + 1 paragraph_attention_vector = smooth_safe( np.pad(attention_vector, _padding, mode='constant'), _blur)[_padding:-_padding] top_index = int(np.argmax(paragraph_attention_vector)) span = section.sentence_at_index(top_index) if min_len is not None and span[1] - span[0] < min_len: next_span = section.sentence_at_index(span[1] + 1, return_delimiters) span = (span[0], next_span[1]) # confidence = paragraph_attention_vector[top_index] confidence_region = attention_vector[span[0]:span[1]] confidence = estimate_confidence_by_mean_top_non_zeros(confidence_region) return span, confidence, paragraph_attention_vector
def test_org_dict_0(self): t1 = 'ЧАСТНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ " БИЗНЕС ШКОЛА - СЕМИНАРЫ", ' \ 'действующее на ' \ 'основании лицензии №_____от _______., именуемое в дальнейшем «Исполнитель», ' \ 'в лице ___________ Имя Имя Имя, ' \ 'действующего на основании Устава, и Имя Имя Имя, именуемая в дальнейшем «Слушатель», в дальнейшем совместно ' \ 'именуемые «Стороны», а по отдельности – «Сторона», заключили настоящий Договор об оказании образовательных ' \ 'услуг (далее – «Договор») о нижеследующем:' t1 = n(t1) # r = re.compile(r_types, re.MULTILINE) r = complete_re_ignore_case x = r.search(t1) print('===r_alias_prefix=', x['r_alias_prefix']) print('===r_quoted_name=', x['r_quoted_name']) print('===r_quoted_name_alias=', x['r_quoted_name_alias']) tags: List[SemanticTag] = find_org_names(LegalDocument(t1).parse()) self._validate_org(tags, 1, ( 'ЧАСТНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ', 'БИЗНЕС ШКОЛА-СЕМИНАРЫ', 'Исполнитель')) t = 'Общество с ограниченной ответственностью «Газпромнефть-сахалин», в лице Генерального директора, ' \ 'Имя Имя Имя, действующего на основании Устава, именуемое в дальнейшем «Заказчик», ' \ 'и ЧАСТНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ " БИЗНЕС ШКОЛА - СЕМИНАРЫ", действующее ' \ 'на основании лицензии №_____от _______., именуемое в дальнейшем «Исполнитель», в лице ___________ Имя Имя Имя, ' \ 'действующего на основании Устава, и Имя Имя Имя, именуемая в дальнейшем «Слушатель», в дальнейшем совместно ' \ 'именуемые «Стороны», а по отдельности – «Сторона», заключили ' \ 'настоящий Договор об оказании образовательных услуг (далее – «Договор») о нижеследующем:' tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse()) self._validate_org(tags, 2, ('Общество с ограниченной ответственностью', 'Газпромнефть-Сахалин', 'Заказчик')) self._validate_org(tags, 1, ( 'ЧАСТНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ', 'БИЗНЕС ШКОЛА-СЕМИНАРЫ', 'Исполнитель'))
def find_value_sign_currency( value_section_subdoc: LegalDocument, factory: ContractPatternFactory = None) -> List[ContractValue]: if factory is not None: value_section_subdoc.calculate_distances_per_pattern(factory) vectors = factory.make_contract_value_attention_vectors( value_section_subdoc) # merge dictionaries of attention vectors value_section_subdoc.distances_per_pattern_dict = { **value_section_subdoc.distances_per_pattern_dict, **vectors } attention_vector_tuned = value_section_subdoc.distances_per_pattern_dict[ 'value_attention_vector_tuned'] else: # HATI-HATI: this case is for Unit Testing only attention_vector_tuned = None return find_value_sign_currency_attention(value_section_subdoc, attention_vector_tuned, absolute_spans=True)
def test_find_agents_person(self): doc_text = """Общество с ограниченной ответственностью «Кишки Бога» (ООО «Кишки Бога»), именуемое в дальнейшем «Заказчик», \ в лице генерального директора Шприца Александра Устыныча, действующего на основании Устава, с одной \ стороны, и Базедов Болезнь Бледнович, являющийся гражданином Российской Федерации, действующий \ от собственного имени, именуемый в дальнейшем «Исполнитель», с другой стороны, совместно \ именуемые «Стороны», и каждая в отдельности «Сторона», заключили настоящий """ tags: List[SemanticTag] = find_org_names( LegalDocument(doc_text).parse()) self._validate_org(tags, 2, ('Общество с ограниченной ответственностью', 'Кишки Бога', 'Заказчик')) self._validate_org(tags, 1, (None, 'Базедов Болезнь Бледнович', 'Исполнитель'))
def find_charter_org(charter: LegalDocument) -> [SemanticTag]: """ TODO: see also find_protocol_org :param charter: :return: """ ret = [] x: [SemanticTag] = find_org_names( charter[0:HyperParameters.protocol_caption_max_size_words], max_names=1) nm = SemanticTag.find_by_kind(x, 'org-1-name') if nm is not None: ret.append(nm) else: charter.warn(ParserWarnings.org_name_not_found) tp = SemanticTag.find_by_kind(x, 'org-1-type') if tp is not None: ret.append(tp) else: charter.warn(ParserWarnings.org_type_not_found) return ret
def test_find_agent_MPZ(self): txt = ''' 2016 год. Акционерное общество “Газпромнефть - МНПЗ” (АО “ГПН-МНПЗ”), именуемое в дальнейшем «Организацией» водопроводно-канализационного хозяйства''' txt = n(txt) x = re.compile(r_type_and_name, re.MULTILINE).search(n(txt)) self.assertEqual('Акционерное общество', x['type']) self.assertEqual('Газпромнефть - МНПЗ', x['name']) tags: List[SemanticTag] = find_org_names(LegalDocument(txt).parse()) self._validate_org( tags, 1, ('Акционерное общество', 'Газпромнефть-МНПЗ', 'Организацией'))