Example #1
0
def test_time():
    nlp = pipeline(merge_patterns=TIME_PATTERNS)
    text = "Сегодня появилось официальное сообщение о том, что в связи с ремонтом дороги с 23:00 до 6:00 вплоть до " \
           "5 мая будет закрываться движение транспорта"
    doc = nlp(text)
    assert doc[14].text == '23:00'
    assert doc[16].text == doc[16].text
Example #2
0
def test_sentence_splitting_with_sections():
    text = "На заводе «Этерно» в Челябинске запущена новая производственная линия\n\nНа челябинском заводе «ЭТЕРНО», " \
           "учредителями которого являются ЧТПЗ и РОСНАНО, состоялся запуск производства штампосварных деталей " \
           "(разрезных тройников) с использованием нанотехнологий."
    nlp = pipeline(terminal_patterns=NO_TERMINAL_PATTERNS)
    doc = nlp(text)
    assert len(list(doc.sents)) == 2
Example #3
0
def test_pronouns():
    nlp = pipeline(PRONOUN_PATTERNS)
    text = "кто-либо, что-либо, какой-либо, чей-либо, когда-либо, где-либо, куда-либо, откуда-либо, кто-нибудь, " \
           "что-нибудь, какой-нибудь, чей-нибудь, когда-нибудь, где-нибудь, куда-нибудь, откуда-нибудь, как-нибудь, " \
           "сколько-нибудь, кто-то, что-то, какой-то, такой-то, чей-то, когда-то, тогда-то, где-то, там-то, куда-то, " \
           "туда-то, откуда-то, оттуда-то, как-то, так-то, сколько-то, столько-то"
    doc = nlp(text)
    assert [i.text for i in doc if not i.is_punct] == text.split(', ')
Example #4
0
def test_foreign_surnames():
    nlp = pipeline(FOREIGN_SURNAME_PATTERNS)

    text = "Сан-Мартин, Сен-Симон, Сен-Жюст, Сент-Бёв, Мак-Магон, Мак-Кинли, аль-Кадир, Турсун-заде, Мамед-оглы, " \
           "Явер-кызы, Измаил-бей, Кемаль-паша, Мирза-хан, Ахмед-шах, Чингисхан"
    doc = nlp(text)

    assert [i.text for i in doc if not i.is_punct] == text.split(', ')
Example #5
0
def test_sentence_segmentation():
    text = "Сбербанк планирует выходить из ситуации, постепенно повышая ставки по кредитам, заявил вчера на " \
           "Давосском экономическом форуме глава Сбербанка Герман Греф. \"Ставки все взаимосвязаны. Если ставки " \
           "растут по пассивной части, то они растут и по активной части. Четыре-пять месяцев назад мы выдавали " \
           "ипотеку под 8% годовых на восемь лет, а сегодня у нас ставки привлечения — 8%. Конечно, это делать " \
           "невозможно. Мы, конечно, будем постепенно поднимать ставки по кредитам физическим лицам\",— цитирует " \
           "господина Грефа \"РИА Новости\""
    nlp = pipeline(terminal_patterns=NO_TERMINAL_PATTERNS)
    doc = nlp(text)
    assert len(list(doc.sents)) == 6
Example #6
0
def test_sentence_segmentation_merge():
    text = "Конкурсный управляющий посредством публичного предложения проводит реализацию имущества СХА «Победа» " \
           "(с. Старая Калитва Россошанского р-на Воронежской обл.), наименование, местоположение и рыночная " \
           "стоимость которого указаны в объявлении, опубликованном…"
    nlp = pipeline(terminal_patterns=NO_TERMINAL_PATTERNS)
    doc = nlp(text)
    assert len(list(doc.sents)) == 1
    text = "28 мая 2013 года в отношении главы администрации Смоленска Александра Данилюка возбуждено уголовное дело " \
           "по ч. 2 ст. 286 УК РФ (\"Превышение должностных полномочий\")."
    doc = nlp(text)
    assert len(list(doc.sents)) == 1
Example #7
0
def test_geographic_names():
    nlp = pipeline(GEOGRAPHIC_NAMES_PATTERNS)
    text = "Усть-Абакан, Соль-Илецк, Верх-Ирмень, Ново-Вязники, Нижне-Гнилое, Австро-Венгрия, Эльзас-Лотарингия"
    doc = nlp(text)
    assert [i.text for i in doc if not i.is_punct] == text.split(', ')
Example #8
0
def test_compound_words_with_digits():
    nlp = pipeline(COMPOUND_WORDS_WITH_DIGIT_PATTERNS)
    text = "Лихие 90-е — журналистское клише, характеризующее период постсоветской России в 1990-х — 2000-х гг."
    doc = nlp(text)
    assert doc[1].text == '90-е'
    assert doc[11].text == '1990-х'
Example #9
0
def test_proper_names_with_digits():
    nlp = pipeline(PROPER_NAMES_WITH_DIGITS_PATTERNS)
    text = "МКБ-10 — Международная классификация болезней 10-го пересмотра."
    doc = nlp(text)
    assert doc[0].text == 'МКБ-10'
Example #10
0
def test_adverb_and_compound_prepositions():
    nlp = pipeline(COMPOUND_PREPOSITION_PATTERNS + ADVERB_PATTERNS)
    text = "во-первых, во-вторых, в-третьих, в-десятых, в-главных, в-последних, из-за, из-под, по-за, по-над, " \
           "по-под, с-под, для-ради, за-ради"
    doc = nlp(text)
    assert [i.text for i in doc if not i.is_punct] == text.split(', ')
Example #11
0
def test_interjection():
    nlp = pipeline(INTERJECTIONS_PATTERNS)
    text = "Ха-ха-ха, ничего-то ты не знаешь, Джон Сноу!"
    doc = nlp(text)
    assert doc[0].text == 'Ха-ха-ха'
Example #12
0
def test_particles():
    nlp = pipeline(PARTICLE_PATTERNS)
    text = "ничего-де, Ответь-ка, Вот-те, Чёрт-те, довольно-таки, наконец-таки"
    doc = nlp(text)
    assert [i.text for i in doc if not i.is_punct] == text.split(', ')
Example #13
0
def test_compound_adjectives():
    nlp = pipeline(merge_patterns=COMPOUND_NOUNS + COMPOUND_ADJECTIVE_PATTERNS)
    text = "Социал-демократия — социальная политика и идейно-политическое течение"
    doc = nlp(text)
    assert doc[0].text == 'Социал-демократия'
    assert doc[5].text == 'идейно-политическое'
Example #14
0
def test_directions():
    nlp = pipeline(DIRECTION_PATTERNS)
    text = "северо-запад, северо-восток, юго-запад, юго-восток"
    doc = nlp(text)
    assert [i.text for i in doc if not i.is_punct] == text.split(', ')
Example #15
0
def test_units():
    nlp = pipeline(merge_patterns=UNIT_PATTERNS)
    text = "около 10 км/ч"
    doc = nlp(text)
    assert doc[2].text == 'км/ч'
Example #16
0
def test_loanwords():
    nlp = pipeline(LOANWORDS_PATTERNS)
    text = "обер-мастер, унтер-офицер, лейб-медик, штаб-квартира, вице-президент, экс-чемпион"
    doc = nlp(text)
    assert [i.text for i in doc if not i.is_punct] == text.split(', ')
Example #17
0
def test_percentage():
    nlp = pipeline(merge_patterns=PERCENTAGE_PATTERNS)
    text = "100% токенизация"
    doc = nlp(text)
    assert doc[0].text == '100%'
Example #18
0
def test_org_names():
    nlp = pipeline(ORG_NAMES_PATTERNS)
    text = "«Альфа-групп» контролирует почти все активы девелопера DVI Group, сообщили «Ведомостям» два " \
           "консультанта, работавших с ней."
    doc = nlp(text)
    assert doc[1].text == 'Альфа-групп'
Example #19
0
def test_conjuct_words():
    nlp = pipeline(CONJUNCT_WORDS_PATTERNS)
    text = "Чемпионат мира 2018 в Ростове-на-Дону"
    doc = nlp(text)
    assert doc[-1].text == 'Ростове-на-Дону'
Example #20
0
def test_compound_words():
    nlp = pipeline(COMPOUND_NOUNS)
    text = "Социал-демократия — социальная политика и идейно-политическое течение"
    doc = nlp(text)
    assert doc[0].text == 'Социал-демократия'
Example #21
0
def test_common_shortforms():
    text = "Почтовый индекс территория Коллективный сад Борец, рп. Кропачево, Ашинский р-н"
    nlp = pipeline(ADDRESS_PATTERNS)
    doc = nlp(text)
    assert doc[-1].text == 'р-н'
Example #22
0
            documents_gold_sentences[docid].append(gold)
            gold_segmentation[docid].append([1] + [0] * (len(sent_words) - 1))
    return parsed_sentences, gold_sentences, gold_segmentation, documents, documents_gold_sentences


if __name__ == "__main__":
    import argparse
    import time

    start_time = time.time()

    parser = argparse.ArgumentParser()
    parser.add_argument('--conllu_file', help='Syntagrus CoNLL file', required=True, type=str)
    args = parser.parse_args()

    nlp = pipeline(MERGE_PATTERNS + SYNTAGRUS_RARE_CASES, NO_TERMINAL_PATTERNS)
    parsed_sentences, gold_sentences, gold_segmentation, documents, documents_gold_sentences = extract_docs_and_golds(
        nlp,
        args.conllu_file)
    unaligned, aligned = find_unaligned_sentences(parsed_sentences, gold_sentences)

    golden_count = sum([len(sent.words) for sent in gold_sentences])
    fully_correct_parsed_count = sum([len(sent) for sent in aligned])
    parsed_count = sum([len(sent) for sent in parsed_sentences])
    partially_correct_parsed_count = count_partially_aligned_tokens(unaligned)

    strict_tokenization_evaluation = calculate_f1(correct_count=fully_correct_parsed_count, golden_count=golden_count,
                                                  produced_count=parsed_count)
    loose_tokenization_evaluation = calculate_f1(
        correct_count=fully_correct_parsed_count + partially_correct_parsed_count,
        golden_count=golden_count,