Add JSON name to input
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import re
|
||||
import os
|
||||
from collections import Counter
|
||||
|
||||
|
||||
@@ -19,6 +20,14 @@ class PromptTagsExtractorNode:
|
||||
# whitelist manuale, es: "nun, veil, latex, ritual"
|
||||
"keep_csv": ("STRING", {"default": ""}),
|
||||
"min_len": ("INT", {"default": 4, "min": 3, "max": 12}),
|
||||
# ✅ nuovo: nome world/json per includere tag “identitari”
|
||||
# esempi:
|
||||
# "PFN_Tokyo_Street_Style_HipHop.json"
|
||||
# "PFN_Tokyo_Dance_Crew_Studio"
|
||||
"json_name": ("STRING", {"default": ""}),
|
||||
# se vuoi controllare quanto “forzare” i token del nome
|
||||
"force_name_tokens": ("BOOLEAN", {"default": True}),
|
||||
"name_tokens_max": ("INT", {"default": 12, "min": 3, "max": 24}),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +48,7 @@ class PromptTagsExtractorNode:
|
||||
|
||||
_PROMPT_GARBAGE = set("""
|
||||
masterpiece best quality amazing 4k ultra detailed absurdres newest scenery depth field volumetric lighting
|
||||
high resolution aesthetic cinematic detailed ultra highres sharp focus
|
||||
high resolution aesthetic cinematic detailed ultra highres sharp focus
|
||||
""".split())
|
||||
|
||||
# -------------------------
|
||||
@@ -56,6 +65,46 @@ class PromptTagsExtractorNode:
|
||||
text = re.sub(r"\s+", " ", text).strip().lower()
|
||||
return text
|
||||
|
||||
def _tokenize_json_name(self, json_name: str, min_len: int, max_tokens: int):
|
||||
if not json_name:
|
||||
return []
|
||||
|
||||
# se arriva un path o un filename, prendiamo solo il basename
|
||||
base = os.path.basename(json_name.strip())
|
||||
|
||||
# togli estensione .json se presente
|
||||
base = re.sub(r"\.json$", "", base, flags=re.IGNORECASE)
|
||||
|
||||
# normalizza separatori: underscore, dash, spazi
|
||||
base = base.replace("-", " ").replace("_", " ")
|
||||
base = re.sub(r"\s+", " ", base).strip().lower()
|
||||
|
||||
# tokenizza
|
||||
raw = base.split()
|
||||
|
||||
out = []
|
||||
for w in raw:
|
||||
if len(w) < min_len:
|
||||
continue
|
||||
# filtra roba troppo “tecnica”
|
||||
if w in {"json"}:
|
||||
continue
|
||||
# se vuoi tenere "pfn" come tag identitario, NON filtrarlo.
|
||||
# Se invece non lo vuoi, aggiungilo qui:
|
||||
# if w == "pfn": continue
|
||||
|
||||
out.append(w)
|
||||
|
||||
# de-dup preservando ordine
|
||||
seen = set()
|
||||
uniq = []
|
||||
for w in out:
|
||||
if w not in seen:
|
||||
seen.add(w)
|
||||
uniq.append(w)
|
||||
|
||||
return uniq[:max_tokens]
|
||||
|
||||
def _extract_tags(self, prompt: str, top_k: int, min_len: int, keep_csv: str):
|
||||
keep_set = set(
|
||||
w.strip().lower()
|
||||
@@ -89,8 +138,24 @@ class PromptTagsExtractorNode:
|
||||
# Nodo
|
||||
# -------------------------
|
||||
|
||||
def run(self, prompt, top_k, keep_csv="", min_len=4):
|
||||
tags = self._extract_tags(prompt, top_k, min_len, keep_csv)
|
||||
def run(self, prompt, top_k, keep_csv="", min_len=4, json_name="", force_name_tokens=True, name_tokens_max=12):
|
||||
base_tags = self._extract_tags(prompt, top_k, min_len, keep_csv)
|
||||
|
||||
name_tokens = self._tokenize_json_name(json_name, min_len=min_len, max_tokens=name_tokens_max)
|
||||
|
||||
if name_tokens:
|
||||
if force_name_tokens:
|
||||
# ✅ forzali in testa (identità sempre presente)
|
||||
tags = name_tokens + [t for t in base_tags if t not in set(name_tokens)]
|
||||
else:
|
||||
# alternativa: aggiungili solo se non ci sono già
|
||||
tags = base_tags[:]
|
||||
for t in name_tokens:
|
||||
if t not in tags:
|
||||
tags.append(t)
|
||||
else:
|
||||
tags = base_tags
|
||||
|
||||
tags_csv = ", ".join(tags)
|
||||
tags_space = " ".join(tags)
|
||||
return (tags_csv, tags_space)
|
||||
|
||||
Reference in New Issue
Block a user