ai-seo-analyzer / highlighter.py
lsdf's picture
Improve Semantic Core UX and add competitor document analysis
345c2dc
from typing import Dict, List, Any
def generate_markup_for_frontend(
sentences_data: List[Dict[str, Any]],
word_weights: Dict[str, int],
threshold: int = 50,
) -> List[Dict[str, Any]]:
"""
Генерирует разметку текста для фронтенда.
Возвращает массив предложений, где каждое предложение состоит из блоков:
- обычный текст
- кликабельное понятие (is_link = True)
"""
output: List[Dict[str, Any]] = []
for sent in sentences_data:
blocks: List[Dict[str, Any]] = []
buffer_text = ""
for tok in sent.get("tokens", []):
text_piece = f"{tok.get('text', '')}{tok.get('whitespace', '')}"
lemma = tok.get("lemma", "")
is_link = bool(tok.get("is_significant")) and word_weights.get(lemma, 0) >= threshold
if is_link:
if buffer_text:
blocks.append({"text": buffer_text, "is_link": False})
buffer_text = ""
# Склеиваем подряд идущие значимые токены в одну "понятийную" фразу,
# чтобы подсветка выглядела как словосочетание, а не набор одиночных слов.
if blocks and blocks[-1].get("is_link"):
blocks[-1]["text"] += text_piece
blocks[-1]["lemmas"].append(lemma)
blocks[-1]["weight"] = max(
int(blocks[-1].get("weight", 0)),
int(word_weights.get(lemma, 0)),
)
else:
blocks.append(
{
"text": text_piece,
"is_link": True,
"lemmas": [lemma],
"weight": int(word_weights.get(lemma, 0)),
}
)
else:
buffer_text += text_piece
if buffer_text:
blocks.append({"text": buffer_text, "is_link": False})
output.append(
{
"index": sent.get("index", 0),
"raw_text": sent.get("raw_text", ""),
"blocks": blocks,
"lemmas_clean": sent.get("lemmas_clean", []),
}
)
return output