| |
| """ |
| Простой тест лемматизации для русского языка. |
| Проверяет, что слово (после лемматизации) находится в предложении. |
| """ |
| 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() |
|
|