461bf6fd40
CI / lint (3.11) (push) Has been cancelled
CI / lint (3.12) (push) Has been cancelled
CI / lint (3.13) (push) Has been cancelled
CI / shellcheck (push) Has been cancelled
CI / shfmt (push) Has been cancelled
CI / setup (3.11) (push) Has been cancelled
CI / setup (3.12) (push) Has been cancelled
CI / setup (3.13) (push) Has been cancelled
CI / check-licenses (3.12) (push) Has been cancelled
CI / test_unit (3.11) (push) Has been cancelled
CI / test_unit (3.12) (push) Has been cancelled
CI / test_unit (3.13) (push) Has been cancelled
CI / test_unit_no_extras (3.11) (push) Has been cancelled
CI / test_unit_no_extras (3.12) (push) Has been cancelled
CI / test_json_to_html (3.12) (push) Has been cancelled
CI / test_unit_no_extras (3.13) (push) Has been cancelled
CI / test_unit_dependency_extras (csv, 3.12, --extra csv) (push) Has been cancelled
CI / test_unit_dependency_extras (xlsx, 3.11, --extra xlsx) (push) Has been cancelled
CI / test_unit_dependency_extras (xlsx, 3.12, --extra xlsx) (push) Has been cancelled
CI / test_unit_dependency_extras (csv, 3.11, --extra csv) (push) Has been cancelled
CI / test_unit_dependency_extras (csv, 3.13, --extra csv) (push) Has been cancelled
CI / test_unit_dependency_extras (docx, 3.11, --extra docx) (push) Has been cancelled
CI / test_unit_dependency_extras (docx, 3.12, --extra docx) (push) Has been cancelled
CI / test_unit_dependency_extras (docx, 3.13, --extra docx) (push) Has been cancelled
CI / test_unit_dependency_extras (markdown, 3.11, --extra md) (push) Has been cancelled
CI / test_unit_dependency_extras (markdown, 3.12, --extra md) (push) Has been cancelled
CI / test_unit_dependency_extras (markdown, 3.13, --extra md) (push) Has been cancelled
CI / test_unit_dependency_extras (odt, 3.11, --extra odt) (push) Has been cancelled
CI / test_unit_dependency_extras (odt, 3.12, --extra odt) (push) Has been cancelled
CI / test_unit_dependency_extras (odt, 3.13, --extra odt) (push) Has been cancelled
CI / test_unit_dependency_extras (pdf-image, 3.11, --extra pdf --extra image --extra paddleocr) (push) Has been cancelled
CI / test_unit_dependency_extras (pdf-image, 3.12, --extra pdf --extra image --extra paddleocr) (push) Has been cancelled
CI / test_unit_dependency_extras (pdf-image, 3.13, --extra pdf --extra image --extra paddleocr) (push) Has been cancelled
CI / test_unit_dependency_extras (pptx, 3.11, --extra pptx) (push) Has been cancelled
CI / test_unit_dependency_extras (pptx, 3.12, --extra pptx) (push) Has been cancelled
CI / test_unit_dependency_extras (pptx, 3.13, --extra pptx) (push) Has been cancelled
CI / test_unit_dependency_extras (pypandoc, 3.11, --extra epub --extra org --extra rtf --extra rst) (push) Has been cancelled
CI / test_unit_dependency_extras (pypandoc, 3.12, --extra epub --extra org --extra rtf --extra rst) (push) Has been cancelled
CI / test_unit_dependency_extras (pypandoc, 3.13, --extra epub --extra org --extra rtf --extra rst) (push) Has been cancelled
Build And Push Docker Image / set-short-sha (push) Has been cancelled
Partition Benchmark / setup (push) Has been cancelled
Partition Benchmark / Measure and compare partition() runtime (push) Has been cancelled
CI / test_unit_dependency_extras (xlsx, 3.13, --extra xlsx) (push) Has been cancelled
CI / test_ingest_src (3.12) (push) Has been cancelled
CI / test_json_to_markdown (3.12) (push) Has been cancelled
CI / changelog (push) Has been cancelled
CI / test_dockerfile (push) Has been cancelled
CodeQL / Analyze (python) (push) Has been cancelled
Build And Push Docker Image / build-images (linux/amd64, opensource-linux-8core) (push) Has been cancelled
Build And Push Docker Image / build-images (linux/arm64, ubuntu-24.04-arm) (push) Has been cancelled
Build And Push Docker Image / publish-images (push) Has been cancelled
91 lines
3.1 KiB
Python
91 lines
3.1 KiB
Python
import csv
|
|
import io
|
|
from typing import Dict, Generator, Iterable, List, Optional, Union
|
|
|
|
from unstructured.documents.elements import Text
|
|
|
|
PRODIGY_TYPE = List[Dict[str, Union[str, Dict[str, str]]]]
|
|
|
|
|
|
def _validate_prodigy_metadata(
|
|
elements: List[Text],
|
|
metadata: Optional[List[Dict[str, str]]] = None,
|
|
) -> Iterable[Dict[str, str]]:
|
|
"""
|
|
Returns validated metadata list for Prodigy bricks.
|
|
Raises ValueError with error message if metadata is not valid.
|
|
"""
|
|
validated_metadata: Iterable[Dict[str, str]]
|
|
if metadata:
|
|
if len(metadata) != len(elements):
|
|
raise ValueError(
|
|
"The length of the metadata parameter does not match with"
|
|
" the length of the elements parameter.",
|
|
)
|
|
id_error_index: Optional[int] = next(
|
|
(index for index, metadatum in enumerate(metadata) if "id" in metadatum),
|
|
None,
|
|
)
|
|
if isinstance(id_error_index, int):
|
|
raise ValueError(
|
|
f'The key "id" is not allowed with metadata parameter at index: {id_error_index}',
|
|
)
|
|
validated_metadata = metadata
|
|
else:
|
|
validated_metadata = [{} for _ in elements]
|
|
return validated_metadata
|
|
|
|
|
|
def stage_for_prodigy(
|
|
elements: List[Text],
|
|
metadata: Optional[List[Dict[str, str]]] = None,
|
|
) -> PRODIGY_TYPE:
|
|
"""
|
|
Converts the document to the JSON format required for use with Prodigy.
|
|
ref: https://prodi.gy/docs/api-loaders#input
|
|
"""
|
|
|
|
validated_metadata: Iterable[Dict[str, str]] = _validate_prodigy_metadata(elements, metadata)
|
|
|
|
prodigy_data: PRODIGY_TYPE = []
|
|
for element, metadatum in zip(elements, validated_metadata):
|
|
if isinstance(element.id, str):
|
|
metadatum["id"] = element.id
|
|
data: Dict[str, Union[str, Dict[str, str]]] = {"text": element.text, "meta": metadatum}
|
|
prodigy_data.append(data)
|
|
|
|
return prodigy_data
|
|
|
|
|
|
def stage_csv_for_prodigy(
|
|
elements: List[Text],
|
|
metadata: Optional[List[Dict[str, str]]] = None,
|
|
) -> str:
|
|
"""
|
|
Converts the document to the CSV format required for use with Prodigy.
|
|
ref: https://prodi.gy/docs/api-loaders#input
|
|
"""
|
|
validated_metadata: Iterable[Dict[str, str]] = _validate_prodigy_metadata(elements, metadata)
|
|
|
|
csv_fieldnames = ["text", "id"]
|
|
csv_fieldnames += list(
|
|
set().union(
|
|
*((key.lower() for key in metadata_item) for metadata_item in validated_metadata),
|
|
),
|
|
)
|
|
|
|
def _get_rows() -> Generator[Dict[str, str], None, None]:
|
|
for element, metadatum in zip(elements, validated_metadata):
|
|
metadatum = {key.lower(): value for key, value in metadatum.items()}
|
|
row_data = dict(text=element.text, **metadatum)
|
|
if isinstance(element.id, str):
|
|
row_data["id"] = element.id
|
|
yield row_data
|
|
|
|
with io.StringIO() as buffer:
|
|
csv_writer = csv.DictWriter(buffer, fieldnames=csv_fieldnames)
|
|
csv_writer.writeheader()
|
|
csv_rows = _get_rows()
|
|
csv_writer.writerows(csv_rows)
|
|
return buffer.getvalue()
|