diff --git a/scripts/parsers/cyberleninka.py b/scripts/parsers/cyberleninka.py index 10cf6b1..822ec0d 100644 --- a/scripts/parsers/cyberleninka.py +++ b/scripts/parsers/cyberleninka.py @@ -137,6 +137,13 @@ class CyberLeninkaParser(BaseParser): link = raw.get("link", "") url = f"{BASE_URL}{link}" if link.startswith("/") else link or None + # OCR-фрагменты текста статьи — приходят прямо в ответе поиска (список + # кусков, обычно начало статьи + фрагмент с ключевыми словами), без + # доп. запроса. Не полный текст всей статьи, но заметно богаче аннотации — + # используем как full_text для более точных Winnowing-отпечатков (L1). + ocr = raw.get("ocr") + full_text = _clean(" ".join(ocr)) if isinstance(ocr, list) and ocr else None + return { "source": self.source_name, "ext_id": ext_id, @@ -151,7 +158,7 @@ class CyberLeninkaParser(BaseParser): "pages": raw.get("pages") or None, "abstract": _clean(raw.get("annotation")) or None, "url": url, - "full_text": None, + "full_text": full_text, } def fetch_article_details(self, url: str) -> dict[str, Any]: diff --git a/scripts/parsers/tests/test_cyberleninka.py b/scripts/parsers/tests/test_cyberleninka.py index ade586a..09effaa 100644 --- a/scripts/parsers/tests/test_cyberleninka.py +++ b/scripts/parsers/tests/test_cyberleninka.py @@ -51,3 +51,14 @@ def test_transform_handles_string_authors(): def test_transform_empty_without_id_or_link(): assert CyberLeninkaParser().transform({"name": "x"}) == {} + + +def test_transform_uses_ocr_as_full_text(): + raw = dict(SAMPLE, ocr=["Первый фрагмент статьи.", "Второй & фрагмент."]) + t = CyberLeninkaParser().transform(raw) + assert t["full_text"] == "Первый фрагмент статьи. Второй & фрагмент." + + +def test_transform_full_text_none_without_ocr(): + assert CyberLeninkaParser().transform(SAMPLE)["full_text"] is None + assert CyberLeninkaParser().transform(dict(SAMPLE, ocr=[]))["full_text"] is None