| """Keyword / vocabulary extraction.""" |
| from __future__ import annotations |
|
|
| from typing import Tuple, List, Dict, Any |
|
|
| from src.config import KEYWORD_SYSTEM_PROMPT |
| from src.model_loader import get_model_and_tokenizer |
| from src.generation import chat_generate |
|
|
|
|
| def extract_keywords(text: str) -> Tuple[List[Dict[str, Any]], str]: |
| """Extract important vocabulary from Japanese text.""" |
| if not text or not text.strip(): |
| return [], "" |
|
|
| model, tokenizer = get_model_and_tokenizer() |
| messages = [ |
| {"role": "system", "content": KEYWORD_SYSTEM_PROMPT}, |
| {"role": "user", "content": text.strip()}, |
| ] |
| raw = chat_generate(model, tokenizer, messages, max_new_tokens=768, do_sample=False) |
| items = [] |
| for line in raw.strip().splitlines(): |
| line = line.strip() |
| if not line: |
| continue |
| if " — " in line: |
| head, meaning = line.split(" — ", 1) |
| if head.endswith(")") and " (" in head: |
| word, reading = head.rsplit(" (", 1) |
| reading = reading[:-1] |
| items.append({"word": word.strip(), "reading": reading.strip(), "meaning": meaning.strip()}) |
| else: |
| items.append({"word": head.strip(), "reading": "", "meaning": meaning.strip()}) |
| else: |
| items.append({"word": line, "reading": "", "meaning": ""}) |
| return items, "" |
|
|