Spaces:
Running
Running
| 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 | |