Files
VKR_2026/modules/validator.py
podiukov.iv d38b9337c9 fix errors
2026-04-24 17:57:35 +05:00

86 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 3 модуль - Валидация и восстановление сущностей
from modules.NER import NER
from modules.paraGenerator import ParaphraseGenerator
from pymorphy3 import MorphAnalyzer
ner = NER()
pg = ParaphraseGenerator()
morph = MorphAnalyzer()
def compare_entities(original, generated):
"""
Сравнивает два списка сущностей. Новые сущности допускаются.
Использование: compare_entities(<сущности исходного текста>, <сущности сгенерированного текста>)
Возвращает:
- True - всё на месте
- False - что то потерялось
"""
def normalize(text):
"""
Приводит слово к нормальной форме. Пример: Ивану --> Иван
Возвращает:
- Совпадают или нет сущности (bool)
- Какие сущности потерялись (set)
"""
return morph.parse(text)[0].normal_form
if original.issubset(generated): # если original является подмножеством множества generated
return True, set()
# если нет, проверяем дополнительно, вдруг кейс по типу "Иван" - "Ивану"
orig_norm = {normalize(e) for e in original} # нормализуем списки
gen_norm = {normalize(e) for e in generated}
if orig_norm.issubset(gen_norm):
return True, set()
# если по прежнему false, то ищем потерянные сущности
lost = set()
for o in original:
if (normalize(o) not in gen_norm):
lost.add(o)
return False, lost
def validator(srcText, paraphrase, srcEntities, paraEntities):
"""
Использование: validator(<исходный текст>, <парафразированный текст> <сущности исходного текста>, <сущности перефразированного текста>)
Возвращает:
- Исходный текст если сущности сохранены
- Изменённый текст, если сущности не сохранены и были восстановлены
- None, если сущности не удалось восстановить с трёх раз
"""
ce = compare_entities(srcEntities, paraEntities)
if ce[0]:
return paraphrase # если всё нормально, возвращаем текст в неизменном виде
print(f'Произошла потеря сущностей!')
print(f'Исходные сущности: {srcEntities}')
print(f'Сгенерируемые сущности: {paraEntities}')
print(f'Потеря сущностей: {ce[1]}')
# даём 5 попыток на восстановление
for i in range(5):
regen_prompt = (
f'При перефразировании текста "{srcText}" из списка элементов "{', '.join(entity for entity in srcEntities)}"'
f'были утеряны или изменены следующие важные элементы: "{', '.join(e for e in ce[1])}". '
'Перефразируй исходный текст заново, обратив особое внимание на сохранение этих элементов. Выведи только текст.'
)
newParaphrase = pg.generateByPrompt(regen_prompt)
paraEntities = ner.extract_entities(newParaphrase)
ce = compare_entities(srcEntities, paraEntities)
print(f'Попытка восстановления: {i+1}')
print(f'Исходные сущности: {srcEntities}')
print(f'Сгенерируемые сущности: {paraEntities}')
print(f'Потеря сущностей: {ce[1]}')
if (ce[0]): # если сравнение дало True, выходим из цикла
return newParaphrase
return None
# a = set(['a','b', 'c', 'd'])
# b = set(['a','b'])
# validator('123', '123', a, b)