import math
import re
from collections import Counter


def tokens(text: str) -> list[str]:
    return re.findall(r"[a-z0-9]+|[\u4e00-\u9fff]", text.lower())


def vector(text: str) -> Counter:
    return Counter(tokens(text))


def cosine(left: Counter, right: Counter) -> float:
    dot = sum(value * right.get(key, 0) for key, value in left.items())
    left_norm = math.sqrt(sum(value * value for value in left.values()))
    right_norm = math.sqrt(sum(value * value for value in right.values()))
    return dot / (left_norm * right_norm) if left_norm and right_norm else 0.0


def retrieve(query: str, documents: list[str], threshold: float = 0.1):
    if not documents:
        return None
    query_vector = vector(query)
    ranked = sorted(((cosine(query_vector, vector(document)), index, document) for index, document in enumerate(documents)), reverse=True)
    score, index, document = ranked[0]
    return {"index": index, "document": document, "score": score} if score >= threshold else None
