# -*- coding: utf-8 -*- """ Простой тест лемматизации для русского языка. Проверяет, что слово (после лемматизации) находится в предложении. """ import sys from pathlib import Path from dataclasses import dataclass sys.path.insert(0, str(Path(__file__).parent.parent)) from lemmatizer import RussianLemmatizer lemmatizer = RussianLemmatizer() @dataclass class TestSearch: word: str sentence: str # Тесты для топонимов (включая разные падежи и формы) TESTS_TOPONIMS = [ TestSearch(word="Ворошиловка", sentence="Он ездил на работу с Ворошиловки до телезавода, а обратно ходил пешком."), TestSearch(word='Рязань-1', sentence='Примерно в 1969 году запускаются поезда от станции Рязани-1 до Дягилева и Леска - пара рейсов в день, но всё же.'), TestSearch(word='Дягилево', sentence='Примерно в 1969 году запускаются поезда от станции Рязани-1 до Дягилева и Леска - пара рейсов в день, но всё же.'), TestSearch(word='Лесок', sentence='Примерно в 1969 году запускаются поезда от станции Рязани-1 до Дягилева и Леска - пара рейсов в день, но всё же.'), TestSearch(word="Дашково-Песочня", sentence="31 маршрутка ходила из Дашково-Песочни в Дягилево."), TestSearch(word="Ворошиловку", sentence="Он ездил на работу с Ворошиловки до телезавода, а обратно ходил пешком."), TestSearch(word='Рязани-1', sentence='Примерно в 1969 году запускаются поезда от станции Рязани-1 до Дягилева и Леска - пара рейсов в день, но всё же.'), TestSearch(word='Дягилева', sentence='Примерно в 1969 году запускаются поезда от станции Рязани-1 до Дягилева и Леска - пара рейсов в день, но всё же.'), TestSearch(word='Леске', sentence='Примерно в 1969 году запускаются поезда от станции Рязани-1 до Дягилева и Леска - пара рейсов в день, но всё же.'), TestSearch(word="Дашково-Песочню", sentence="31 маршрутка ходила из Дашково-Песочни в Дягилево."), TestSearch(word='Канищева', sentence='А тут нас извечная проблема, связи Ворошиловки с районом, точнее сказать с Приокским, Канищево, где находятся важные объекты, причем часть расположена в Приокском, часть в Канищево.'), TestSearch(word="Песочни", sentence="31 маршрутка ходила из Дашково-Песочни в Дягилево."), ] # Тесты для лемматизации обычных слов TESTS_LEMMATIZATION = [ TestSearch(word='хорошая', sentence='И там в лучшем случае было 20-23 машины где-то так.'), TestSearch(word='Петли', sentence='И вместо трёх петель осталась одна маленькая в Горроще.') ] # Тесты для обработки Е/Ё TESTS_LETTER_E = [ TestSearch(word='Ленпоселок', sentence='Ленпосёлок — это вообще ныне почти забытый топоним, на мой взгляд, зря.'), TestSearch(word='Шлаковый посёлок', sentence='7 ноября 1977 года наконец-то был открыт путепровод на Куйбышевском шоссе, который позволил сократить время в пути автобусом и троллейбусом из центра в Шлаковый поселок.') ] def lemmas_in_sentence(query: str, sentence: str) -> bool: query_lemmas = set(lemmatizer.tokenize_text(query)) sentence_lemmas = set(lemmatizer.tokenize_text(sentence)) # Есть ли пересечение? return len(query_lemmas & sentence_lemmas) > 0 def run_test_suite(test_set: list[TestSearch]) -> tuple[int, int]: """Запускает ОДИН набор тестов и возвращает (пройдено, провалено)""" passed = 0 failed = 0 for test in test_set: # Проверяем, есть ли леммы слова в предложении success = lemmas_in_sentence( test.word, test.sentence, lemmatizer) status = "PASS" if success else "FAIL" passed += 1 if success else 0 failed += 0 if success else 1 print(status) print(f"РЕЗУЛЬТАТ: {passed} пройдено, {failed} провалено из {len(test_set)}") return passed, failed def test_lemmatization(): """Запускает ВСЕ наборы тестов""" total_passed = 0 total_failed = 0 for test_name, test_set in ( ("ТОПОНИМЫ (падежи и словоформы)", TESTS_TOPONIMS), ("ЛЕММАТИЗАЦИЯ (беглые гласные)", TESTS_LEMMATIZATION), ("ОБРАБОТКА Е/Ё", TESTS_LETTER_E), ): print(f"НАБОР ТЕСТОВ: {test_name}") passed, failed = run_test_suite(test_set) total_passed += passed total_failed += failed print(f"ИТОГО: {total_passed} пройдено, {total_failed} провалено из {total_passed + total_failed}") return total_failed == 0 test_lemmatization()