Ejemplo n.º 1
0
  def test_slice_doc_1(self):
    text = 'этилен мама этилен'
    __doc = LegalDocument(text)
    __doc.parse()

    subdoc = __doc.subdoc_slice(slice(2, 3))
    self.assertEqual('этилен', subdoc.text)
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
    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()
Ejemplo n.º 4
0
    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
Ejemplo n.º 5
0
  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))
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
  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())
Ejemplo n.º 8
0
  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))
Ejemplo n.º 9
0
  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)))
Ejemplo n.º 10
0
    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)
Ejemplo n.º 11
0
  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])
Ejemplo n.º 12
0
    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, ('Фонд', 'Благо', 'Благополучатель'))
Ejemplo n.º 13
0
    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))
Ejemplo n.º 14
0
    def test_org_dict_0_1(self):

        t0 = """Общество с ограниченной ответственностью «Газпромнефть-сахалин», в лице Генерального директора, Имя Имя Имя, действующего на основании Устава, именуемое в дальнейшем «Заказчик», и ЧАСТНОЕ""" \
             + _suffix
        tags: [SemanticTag] = find_org_names(LegalDocument(t0).parse())

        self._validate_org(tags, 1,
                           ('Общество с ограниченной ответственностью',
                            'Газпромнефть-Сахалин', 'Заказчик'))
Ejemplo n.º 15
0
    def test_org_dict_4_2(self):
        t = n(
            """Государственное автономное  учреждение дополнительного профессионального образования Свердловской области «Армавирский учебно-технический центр»,  на основании Лицензии на право осуществления образовательной деятельности в лице директора  Птицына Евгения Георгиевича, действующего на основании Устава, с одной стороны, """
        )

        tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse())
        self._validate_org(tags, 1,
                           ('Государственное автономное учреждение',
                            'Армавирский учебно-технический центр', None))
Ejemplo n.º 16
0
  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)))
Ejemplo n.º 17
0
    def test_org_dict_3_1(self):

        t = n("""
    Федеральное государственное бюджетное образовательное учреждение высшего образования «Государственный университет» (ФГБОУ ВО «ГУ»), именуемое в дальнейшем «Исполнитель», в лице ____________________ Сергеева
    """)

        tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse())
        self._validate_org(tags, 1, (
            'Федеральное государственное бюджетное образовательное учреждение высшего образования',
            'Государственный университет', 'Исполнитель'))
Ejemplo n.º 18
0
 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)
Ejemplo n.º 19
0
    def test_org_dict_2(self):

        t = n("""
    ООО «Газпромнефть-Региональные продажи» в дальнейшем «БлаготворЮтель», с другой стороны
    """)

        tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse())
        self._validate_org(
            tags, 1, ('Общество с ограниченной ответственностью',
                      'Газпромнефть-Региональные продажи', 'БлаготворЮтель'))
Ejemplo n.º 20
0
    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)
Ejemplo n.º 21
0
    def test_find_ip3(self):

        t = n("""
    Сибирь , и ИП Лужин В. В., именуемый в дальнейшем « Исполнитель » , \
    с другой стороны , именуемые в дальнейшем совместно « Стороны » , а по отдельности - « Сторона » , заключили настоящий договор о нижеследующем : 
    """)

        tags: [SemanticTag] = find_org_names(LegalDocument(t).parse())
        self._validate_org(
            tags, 1,
            ('Индивидуальный предприниматель', 'Лужин В. В.', 'Исполнитель'))
Ejemplo n.º 22
0
    def test_org_dict_4_1(self):

        t = n(
            """Автономная некоммерческая организация дополнительного профессионального образования «ООО»,  \
      именуемое далее Исполнитель, в лице Директора Уткиной Е.В., действующей на основании Устава, с одной стороны,"""
        )

        tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse())
        self._validate_org(
            tags, 1,
            ('Автономная некоммерческая организация', 'ООО', 'Исполнитель'))
Ejemplo n.º 23
0
    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)
Ejemplo n.º 24
0
    def test_org_dict_1(self):

        t = n(
            "ООО «Газпромнефть-Региональные продажи», в лице начальника управления по связям с общественностью "
            "Иванова Семена Евгеньевича, действующего на основании Доверенности в дальнейшем «Благотворитель», "
            "с другой стороны заключили настоящий Договор о нижеследующем: \n")

        tags: List[SemanticTag] = find_org_names(LegalDocument(t).parse())

        self._validate_org(
            tags, 1, ('Общество с ограниченной ответственностью',
                      'Газпромнефть-Региональные продажи', 'Благотворитель'))
Ejemplo n.º 25
0
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
Ejemplo n.º 26
0
    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, (
            'ЧАСТНОЕ УЧРЕЖДЕНИЕ ДОПОЛНИТЕЛЬНОГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ',
            'БИЗНЕС ШКОЛА-СЕМИНАРЫ', 'Исполнитель'))
Ejemplo n.º 27
0
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)
Ejemplo n.º 28
0
    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, 'Базедов Болезнь Бледнович', 'Исполнитель'))
Ejemplo n.º 29
0
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
Ejemplo n.º 30
0
    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,
            ('Акционерное общество', 'Газпромнефть-МНПЗ', 'Организацией'))