RAG2 / tests /test_lemmatization.py
antimoda1
add TODO
0aa6d2c
# -*- 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()