From 3e0a0ee4038dc804eef6fdfc69107d53ec8e2007 Mon Sep 17 00:00:00 2001 From: "podiukov.iv" Date: Thu, 23 Apr 2026 15:35:34 +0500 Subject: [PATCH] add paraGenerator --- .gitignore | 2 ++ NER.py | 32 +++++++++++++++++++++++++------- README.md | 5 ++++- main.py | 26 ++++++++++++++++++++++++++ paraGenerator.py | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 8 deletions(-) create mode 100644 main.py create mode 100644 paraGenerator.py diff --git a/.gitignore b/.gitignore index b0546ec..854140d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .venv/ llama.cpp/ datasets/ +__pycache__/ +models/ diff --git a/NER.py b/NER.py index 5ba6734..1b0ea37 100644 --- a/NER.py +++ b/NER.py @@ -1,9 +1,27 @@ +# 1 модуль - Распознавание именованных сущностей (NER) + import spacy -nlp = spacy.load("ru_core_news_lg") -text = "Добрый день, я, Сидоров Иван Иванович. Прошу перевести сто тысяч рублей Якову Петру Игнатьевичу." -doc = nlp(text) - -for ent in doc.ents: - print(f"{ent.text} -> {ent.label_}") - +class NER: + """ + Класс для выделения именованных сущностей из текста с помощью библиотеки spaCy. + """ + def __init__(self): + self.nlp = spacy.load("ru_core_news_lg") + + def extract_entities(self, text): + """ + Выделение именованных сущностей из текста + Использование: text (<текст>) + Возвращает: List[Dict[text, type]] - список словарей, каждый из которых содержит информацию об одной сущности + """ + doc = self.nlp(text) + entities = [] + for ent in doc.ents: + entities.append({ + 'text': ent.text, # Текст сущности + 'type': ent.label_, # Тип сущности (PER, LOC, ORG, DATE и т.д.) + 'start': ent.start_char, # Начальная позиция в тексте + 'end': ent.end_char # Конечная позиция в тексте + }) + return entities diff --git a/README.md b/README.md index 849fe35..7f40112 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,7 @@ pip install spacy python -m spacy download ru_core_news_lg ``` - +#### для paraGenerator +``` +CMAKE_ARGS="-DGGML_CUDA=on -DLLAMA_OPENSSL=ON" pip install llama-cpp-python +``` diff --git a/main.py b/main.py new file mode 100644 index 0000000..02a092a --- /dev/null +++ b/main.py @@ -0,0 +1,26 @@ +# Точка входа программы + +from NER import NER +from paraGenerator import ParaphraseGenerator + +## Запуск рабочих инструментов +ner = NER() +pg = ParaphraseGenerator() +### + +srcText = 'Добрый день, я, Сидоров Иван Иванович. Прошу перевести сто тысяч рублей Якову Петру Игнатьевичу в Москву.' + +entities1 = ner.extract_entities(srcText) +print(entities1) + +#paraphrase1 = pg.generate(srcText, entities1) +#print(paraphrase1) + +#entities2 = ner.extract_entities(paraphrase1) +#print(entities2) + +gg = () +gg.append(1) +gg.append(2) +gg.append(1) +print(gg) \ No newline at end of file diff --git a/paraGenerator.py b/paraGenerator.py new file mode 100644 index 0000000..f5111c6 --- /dev/null +++ b/paraGenerator.py @@ -0,0 +1,33 @@ +# 2 модуль - Генератор парафраза на основе llama.cpp + +from openai import OpenAI + +class ParaphraseGenerator: + """ + Класс для использования генеративной модели на базе llama.cpp + """ + def __init__(self): + self.client = OpenAI(base_url="http://127.0.0.1:8080", api_key="") + + def generate(self, srcText, entities): + """ + Генерация парафраза по промпту. + Использование: generate(<исходный текст>, <сущности>) + """ + entityList = ', '.join(entity['text'] for entity in entities) # генерация списка выделенных сущностей + prompt = 'Перефразируй следующий текст, сохранив все именованные сущности "' + entityList + '" в точности такими же, как в оригинале. ' \ + 'Не изменяй эти фрагменты текста, не заменяй их синонимами, не переставляй слова внутри них. ' \ + 'Можешь изменять грамматическую структуру предложения, порядок слов, использовать синонимы для' \ + 'остальных частей текста, но именованные сущности должны остаться неизменными. Исходный текст: "' + srcText + '"' + try: + response = self.client.chat.completions.create( + model = "", + messages = [{"role": "user", "content": prompt}], + temperature = 0.8, + top_p = 0.95, + max_tokens = 200 + ) + return response.choices[0].message.content + except Exception as e: + print(f"Ошибка генерации: {e}") + return None