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