Comments 1
Попробовал JSON-импорт на текущем коммите aa2e733. Нашёл небольшой сбой на грязных данных: одна запись с rating: 1e400 прерывает загрузку всего файла, включая следующий нормальный отзыв. Число при разборе JSON становится inf, а parse_int падает на round(value) с OverflowError. Для NaN, который Python тоже принимает при чтении JSON, получается ValueError.
Проверил поправку через math.isfinite: неконечное значение рейтинга превращается в None, появляется существующее предупреждение, импорт продолжается. Тесты проверяют и проблемную запись, и следующий отзыв с оценкой 5. До патча три случая падали; после проходят все 46 тестов импорта вместе с новыми, Python 3.12. Линтер тоже прошёл. Аналитический pipeline и модель не запускал.
Патч:
diff --git a/src/reviewscope/ingestion/normalize.py b/src/reviewscope/ingestion/normalize.py
index edd51a9..6d1f6ae 100644
--- a/src/reviewscope/ingestion/normalize.py
+++ b/src/reviewscope/ingestion/normalize.py
@@ -17,6 +17,7 @@ rejected and counted as skipped.
from __future__ import annotations
import datetime as _dt
+import math
import re
from typing import Any
@@ -121,6 +122,8 @@ def parse_int(value: Any) -> int | None:
if isinstance(value, int):
return value
if isinstance(value, float):
+ if not math.isfinite(value):
+ return None
return int(round(value))
text = str(value).strip()
if not text:
Тесты — сохранить как tests/test_nonfinite_rating.py:
import pytest
from reviewscope.ingestion.json_adapter import JSONAdapter
@pytest.mark.parametrize("rating", ["1e400", "-1e400", "NaN"])
def test_invalid_numeric_rating_does_not_abort_json_import(tmp_path, rating):
path = tmp_path / "reviews.json"
path.write_text(
'[{"review_id":"bad","place_id":"p","reviewer_id":"u",'
f'"rating":{rating},"text":"bad rating"}},'
'{"review_id":"good","place_id":"p","reviewer_id":"u2",'
'"rating":5,"text":"normal review"}]',
encoding="utf-8",
)
result = JSONAdapter().load(path)
assert [review.review_id for review in result.reviews] == ["bad", "good"]
assert result.reviews[0].rating is None
assert result.reviews[1].rating == 5
assert result.report.valid == 2
assert result.report.warning_count == 1
assert "rating" in result.report.warnings[0]
Из корня проекта, в отдельном виртуальном окружении:
python -m pip install pandas pydantic pytest
PYTHONPATH=src python -m pytest tests/test_nonfinite_rating.py tests/test_ingestion.py
Хотел выбрать булочную по отзывам, а написал анализатор аномалий с embeddings и графами