81 lines
3.7 KiB
Python
81 lines
3.7 KiB
Python
import json
|
||
import os
|
||
import re
|
||
|
||
import requests
|
||
|
||
# Основные настройки
|
||
OLLAMA_URL = "http://localhost:11434/api/generate"
|
||
MODEL_NAME = "qwen3:30b-a3b" # Имя модели в Ollama
|
||
pattern = re.compile(r"<think>.*?<\/think>", flags=re.DOTALL | re.IGNORECASE)
|
||
|
||
|
||
def analyze_dog_breed(file_path):
|
||
with open(file_path, encoding="utf-8") as file:
|
||
text = file.read()
|
||
"""Генерирует описание породы с помощью Ollama"""
|
||
prompt = f"""/no_think
|
||
Проанализируй текст ниже и определи ТОЛЬКО указанные ниже признаки породы собаки. Если признак не упомянут в тексте - дополни на основе своих знаний
|
||
|
||
Признаки для анализа (булевые значения, если не указано иное):
|
||
- people_friendly (дружелюбность к взрослым)
|
||
- child_friendly (дружелюбность к детям)
|
||
- animal_friendly (дружелюбность к другим животным)
|
||
- active (уровень активности)
|
||
- big (крупный размер)
|
||
- small (мелкий размер)
|
||
- medium (средний размер)
|
||
- smart (высокий интеллект)
|
||
- colors (массив возможных окрасов на аглийском строки)
|
||
- need_attentions (потребность во внимании)
|
||
- need_big_place (необходимость большого пространства)
|
||
- good_health (крепкое здоровье)
|
||
- tolerates_loneliness (переносимость одиночества)
|
||
- hypoallergenic (вызывает аллергию или нет)
|
||
|
||
Требования:
|
||
1. Анализируй ТОЛЬКО явно указанную информацию из текста
|
||
2. Если параметр не упомянут - полностью исключи его из JSON
|
||
3. Строго соблюдай типы данных: boolean для всех параметров кроме colors (массив строк)
|
||
4. Запрещено добавлять любые другие поля, кроме указанных выше
|
||
5. Если размер не указан явно - не включай big/small/medium
|
||
|
||
Верни ответ ТОЛЬКО в виде валидного JSON без комментариев и пояснений.
|
||
|
||
Текст для анализа:
|
||
{text}
|
||
"""
|
||
response = requests.post(OLLAMA_URL, json={"model": MODEL_NAME, "prompt": prompt, "stream": False})
|
||
|
||
if response.status_code == 200:
|
||
return response.json().get("response", "Не удалось получить описание")
|
||
else:
|
||
return f"Ошибка при генерации описания для {file_path}"
|
||
|
||
|
||
def save_description(breed, description):
|
||
"""Сохраняет описание в файл"""
|
||
os.makedirs("breed_signs", exist_ok=True)
|
||
filename = f"breed_signs/{breed}.txt"
|
||
|
||
with open(filename, "w", encoding="utf-8") as f:
|
||
f.write(pattern.sub("", description))
|
||
print(f"Сохранено: {filename}")
|
||
|
||
|
||
def main():
|
||
with open("../../labels_dogs.json") as f:
|
||
beers = json.load(f)
|
||
for key in beers:
|
||
name = beers[key].replace("_", " ")
|
||
print(f"Генерация признаков для {name}...")
|
||
if os.path.isfile(f"breed_signs/{beers[key]}.txt"):
|
||
print(f"Описание уже существует: {beers[key]}.")
|
||
continue
|
||
description = analyze_dog_breed(f"breed_descriptions/{beers[key]}.txt")
|
||
save_description(beers[key], description)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|