From d86521e7f19a1bfd55937fc1c0760a898a14b5d5 Mon Sep 17 00:00:00 2001 From: Marco Perini Date: Fri, 13 Sep 2024 03:19:23 +0200 Subject: [PATCH 1/2] feat: added renderers, fixed temp file and update entities bugs, enhanced prompts --- canvas_to_use_the lib.py | 14 -- examples/example_renderer.py | 43 ++++ .../extract_entities_json_schema_from_pdf.py | 11 +- .../extract_entities_relations_from_pdf.py | 32 ++- pyproject.toml | 18 +- requirements-dev.lock | 184 ++---------------- requirements.lock | 3 - scrapeschema/extractor.py | 2 +- scrapeschema/parsers/pdf_parser.py | 60 ++++-- scrapeschema/parsers/prompts.py | 9 +- scrapeschema/renderers/__init__.py | 5 + scrapeschema/renderers/base.py | 10 + scrapeschema/renderers/pyecharts_renderer.py | 154 +++++++++++++++ 13 files changed, 316 insertions(+), 229 deletions(-) delete mode 100644 canvas_to_use_the lib.py create mode 100644 examples/example_renderer.py create mode 100644 scrapeschema/renderers/__init__.py create mode 100644 scrapeschema/renderers/base.py create mode 100644 scrapeschema/renderers/pyecharts_renderer.py diff --git a/canvas_to_use_the lib.py b/canvas_to_use_the lib.py deleted file mode 100644 index e3539f5..0000000 --- a/canvas_to_use_the lib.py +++ /dev/null @@ -1,14 +0,0 @@ -from scrapeschema # import what you need from the library -import os -from dotenv import load_dotenv - -def main(): - load_dotenv() # Load environment variables from .env file - api_key = os.getenv("OPENAI_API_KEY") - - # Path to your file - file_path = "path/to/your/file" - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/examples/example_renderer.py b/examples/example_renderer.py new file mode 100644 index 0000000..5a78a80 --- /dev/null +++ b/examples/example_renderer.py @@ -0,0 +1,43 @@ +from scrapeschema import Entity, Relation +from scrapeschema.renderers import PyechartsRenderer + +# Define entities with nested attributes +entities = [ + Entity(id="1", type="Person", attributes={ + "name": "Alice", + "age": 30, + "address": { + "city": "New York", + "zip": "10001" + } + }), + Entity(id="2", type="Person", attributes={ + "name": "Bob", + "age": 40, + "address": { + "city": "Los Angeles", + "zip": "90001" + } + }), + Entity(id="3", type="Company", attributes={ + "name": "Acme Corp", + "industry": "Tech", + "headquarters": { + "city": "San Francisco", + "zip": "94105" + } + }) +] + +# Define relations between the entities +relations = [ + Relation(id="r1", source="1", target="2", name="Friend"), + Relation(id="r2", source="1", target="3", name="Employee"), + Relation(id="r3", source="2", target="3", name="Employer"), +] + +# Initialize the PyechartsRenderer +renderer = PyechartsRenderer(repulsion=2000, title="Graph Example with Nested Entities") + +# Render the graph using the provided nodes and links +graph = renderer.render(entities, relations, output_path="graph_nested.html") diff --git a/examples/extract_entities_json_schema_from_pdf.py b/examples/extract_entities_json_schema_from_pdf.py index 634c6c8..2380f28 100644 --- a/examples/extract_entities_json_schema_from_pdf.py +++ b/examples/extract_entities_json_schema_from_pdf.py @@ -6,11 +6,16 @@ def main(): load_dotenv() # Load environment variables from .env file api_key = os.getenv("OPENAI_API_KEY") - # Path to your PDF file - pdf_path = "./test.pdf" + # get current directory + curr_dirr = os.path.dirname(os.path.abspath(__file__)) + pdf_name = "test.pdf" + pdf_path = os.path.join(curr_dirr, pdf_name) # Create a PDFParser instance with the API key - pdf_parser = PDFParser(api_key) + pdf_parser = PDFParser( + api_key=api_key, + model="gpt-4o-mini" + ) # Create a FileExtraxctor instance with the PDF parser pdf_extractor = FileExtractor(pdf_path, pdf_parser) diff --git a/examples/extract_entities_relations_from_pdf.py b/examples/extract_entities_relations_from_pdf.py index e1eec5c..3f00ffc 100644 --- a/examples/extract_entities_relations_from_pdf.py +++ b/examples/extract_entities_relations_from_pdf.py @@ -1,13 +1,19 @@ from scrapeschema import FileExtractor, PDFParser +from scrapeschema.renderers import PyechartsRenderer import os from dotenv import load_dotenv +load_dotenv() # Load environment variables from .env file -def main(): - load_dotenv() # Load environment variables from .env file - api_key = os.getenv("OPENAI_API_KEY") +# Get the OpenAI API key from the environment variables +api_key = os.getenv("OPENAI_API_KEY") + +# get current directory +curr_dirr = os.path.dirname(os.path.abspath(__file__)) - # Path to your PDF file - pdf_path = "./test.pdf" +def main(): + # Path to the PDF file + pdf_name = "test.pdf" + pdf_path = os.path.join(curr_dirr, pdf_name) # Create a PDFParser instance with the API key pdf_parser = PDFParser(api_key) @@ -17,12 +23,18 @@ def main(): # Extract entities from the PDF entities = pdf_extractor.extract_entities() + relations = pdf_extractor.extract_relations() - print(entities) + # Initialize the PyechartsRenderer + renderer = PyechartsRenderer(repulsion=2000, title="Entity-Relationship Graph") - relations = pdf_extractor.extract_relations() - print(relations) - + # Render the graph using the provided nodes and links + graph = renderer.render(entities, relations, output_path="graph.html") + + print(graph) if __name__ == "__main__": - main() \ No newline at end of file + main() + + + \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index e4e2783..4d17971 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,7 @@ [project] - name = "scrapeschema" version = "0.0.1" -description = "library for creating ontologies from documents" +description = "Library for creating ontologies from documents using LLM" authors = [ { name = "Marco Vinciguerra", email = "mvincig11@gmail.com" }, { name = "Marco Perini", email = "perinim.98@gmail.com" }, @@ -13,7 +12,6 @@ dependencies = [ "certifi==2024.7.4", "charset-normalizer==3.3.2", "idna==3.8", - "pdf2image==1.17.0", "pillow==10.4.0", "python-dotenv==1.0.1", "requests==2.32.3", @@ -26,6 +24,10 @@ homepage = "https://scrapegraphai.com/" repository = "https://github.com/ScrapeGraphAI/ScrapeSchema" documentation = "" keywords = [ + "scrapeschema", + "ontologies", + "documents", + "knowledge graph", "scrapegraph", "scrapegraphai", "langchain", @@ -53,7 +55,7 @@ classifiers = [ requires-python = ">=3.9,<4.0" [project.optional-dependencies] -burr = ["burr[start]==0.22.1"] +renderers = ["pyecharts==2.0.6"] docs = ["sphinx==6.0", "furo==2024.5.6"] [build-system] @@ -65,12 +67,12 @@ managed = true dev-dependencies = [ "pytest==8.0.0", "pytest-mock==3.14.0", - "-e file:.[burr]", + "-e file:.[renderers]", "-e file:.[docs]", "pylint>=3.2.5", ] + [tool.rye.scripts] -pylint-local = "pylint scrapegraphai/**/*.py" -pylint-ci = "pylint --disable=C0114,C0115,C0116 --exit-zero scrapegraphai/**/*.py" +pylint-local = "pylint scrapeschema/**/*.py" +pylint-ci = "pylint --disable=C0114,C0115,C0116 --exit-zero scrapeschema/**/*.py" update-requirements = "python 'manual deployment/autorequirements.py'" - diff --git a/requirements-dev.lock b/requirements-dev.lock index 1630533..fbcc51d 100644 --- a/requirements-dev.lock +++ b/requirements-dev.lock @@ -8,206 +8,77 @@ # with-sources: false -e file:. -aiofiles==24.1.0 - # via burr alabaster==0.7.16 # via sphinx -altair==5.4.1 - # via streamlit -annotated-types==0.7.0 - # via pydantic -anyio==4.4.0 - # via httpx - # via openai - # via starlette astroid==3.2.4 # via pylint -attrs==24.2.0 - # via jsonschema - # via referencing babel==2.16.0 # via sphinx beautifulsoup4==4.12.3 # via furo -blinker==1.8.2 - # via streamlit -burr==0.22.1 - # via scrapeschema -cachetools==5.5.0 - # via streamlit certifi==2024.7.4 - # via httpcore - # via httpx # via requests # via scrapeschema charset-normalizer==3.3.2 # via requests # via scrapeschema -click==8.1.7 - # via burr - # via streamlit - # via uvicorn -contourpy==1.3.0 - # via matplotlib -cycler==0.12.1 - # via matplotlib +colorama==0.4.6 + # via pylint + # via pytest + # via sphinx dill==0.3.8 # via pylint -distro==1.9.0 - # via openai docutils==0.19 # via sphinx exceptiongroup==1.2.2 - # via anyio # via pytest -fastapi==0.114.1 - # via burr -fastapi-pagination==0.12.27 - # via burr -fonttools==4.53.1 - # via matplotlib furo==2024.5.6 # via scrapeschema -gitdb==4.0.11 - # via gitpython -gitpython==3.1.43 - # via streamlit -graphviz==0.20.3 - # via burr -h11==0.14.0 - # via httpcore - # via uvicorn -httpcore==1.0.5 - # via httpx -httpx==0.27.2 - # via openai idna==3.8 - # via anyio - # via httpx # via requests # via scrapeschema imagesize==1.4.1 # via sphinx importlib-metadata==8.5.0 # via sphinx -importlib-resources==6.4.5 - # via matplotlib iniconfig==2.0.0 # via pytest isort==5.13.2 # via pylint jinja2==3.1.4 - # via altair - # via burr - # via pydeck + # via pyecharts # via sphinx -jiter==0.5.0 - # via openai -jsonschema==4.23.0 - # via altair -jsonschema-specifications==2023.12.1 - # via jsonschema -kiwisolver==1.4.7 - # via matplotlib -loguru==0.7.2 - # via burr -markdown-it-py==3.0.0 - # via rich markupsafe==2.1.5 # via jinja2 -matplotlib==3.9.2 - # via burr mccabe==0.7.0 # via pylint -mdurl==0.1.2 - # via markdown-it-py -mypy-extensions==1.0.0 - # via typing-inspect -narwhals==1.7.0 - # via altair -numpy==2.0.2 - # via contourpy - # via matplotlib - # via pandas - # via pyarrow - # via pydeck - # via sf-hamilton - # via streamlit -openai==1.44.1 - # via burr packaging==24.1 - # via altair - # via matplotlib # via pytest # via sphinx - # via streamlit -pandas==2.2.2 - # via sf-hamilton - # via streamlit -pdf2image==1.17.0 - # via scrapeschema pillow==10.4.0 - # via matplotlib - # via pdf2image # via scrapeschema - # via streamlit platformdirs==4.3.2 # via pylint pluggy==1.5.0 # via pytest -protobuf==5.28.1 - # via streamlit -pyarrow==17.0.0 - # via streamlit -pydantic==2.9.1 - # via burr - # via fastapi - # via fastapi-pagination - # via openai -pydantic-core==2.23.3 - # via pydantic -pydeck==0.9.1 - # via streamlit +prettytable==3.11.0 + # via pyecharts +pyecharts==2.0.6 + # via scrapeschema pygments==2.18.0 # via furo - # via rich # via sphinx pylint==3.2.7 -pyparsing==3.1.4 - # via matplotlib pytest==8.0.0 # via pytest-mock pytest-mock==3.14.0 -python-dateutil==2.9.0.post0 - # via matplotlib - # via pandas python-dotenv==1.0.1 # via scrapeschema -pytz==2024.2 - # via pandas -referencing==0.35.1 - # via jsonschema - # via jsonschema-specifications requests==2.32.3 - # via burr # via scrapeschema # via sphinx - # via streamlit -rich==13.8.1 - # via streamlit -rpds-py==0.20.0 - # via jsonschema - # via referencing -sf-hamilton==1.76.0 - # via burr -six==1.16.0 - # via python-dateutil -smmap==5.0.1 - # via gitdb -sniffio==1.3.1 - # via anyio - # via httpx - # via openai +simplejson==3.19.3 + # via pyecharts snowballstemmer==2.2.0 # via sphinx soupsieve==2.6 @@ -230,47 +101,18 @@ sphinxcontrib-qthelp==2.0.0 # via sphinx sphinxcontrib-serializinghtml==2.0.0 # via sphinx -starlette==0.38.5 - # via fastapi -streamlit==1.38.0 - # via burr -tenacity==8.5.0 - # via streamlit -toml==0.10.2 - # via streamlit tomli==2.0.1 # via pylint # via pytest tomlkit==0.13.2 # via pylint -tornado==6.4.1 - # via streamlit -tqdm==4.66.5 - # via openai typing-extensions==4.12.2 - # via altair - # via anyio # via astroid - # via fastapi - # via fastapi-pagination - # via openai - # via pydantic - # via pydantic-core # via pylint - # via sf-hamilton - # via starlette - # via streamlit - # via typing-inspect - # via uvicorn -typing-inspect==0.9.0 - # via sf-hamilton -tzdata==2024.1 - # via pandas urllib3==2.2.2 # via requests # via scrapeschema -uvicorn==0.30.6 - # via burr +wcwidth==0.2.13 + # via prettytable zipp==3.20.1 # via importlib-metadata - # via importlib-resources diff --git a/requirements.lock b/requirements.lock index bb1930e..8062277 100644 --- a/requirements.lock +++ b/requirements.lock @@ -17,10 +17,7 @@ charset-normalizer==3.3.2 idna==3.8 # via requests # via scrapeschema -pdf2image==1.17.0 - # via scrapeschema pillow==10.4.0 - # via pdf2image # via scrapeschema python-dotenv==1.0.1 # via scrapeschema diff --git a/scrapeschema/extractor.py b/scrapeschema/extractor.py index 42808e4..971b1eb 100644 --- a/scrapeschema/extractor.py +++ b/scrapeschema/extractor.py @@ -30,7 +30,7 @@ def __init__(self, file_path: str, parser: BaseParser): def extract_entities(self) -> List[Entity]: new_entities = self.parser.extract_entities(self.file_path) - return self.update_entities(new_entities) + return new_entities def extract_relations(self) -> List[Relation]: return self.parser.extract_relations(self.file_path) diff --git a/scrapeschema/parsers/pdf_parser.py b/scrapeschema/parsers/pdf_parser.py index 38e36fc..c7536d2 100644 --- a/scrapeschema/parsers/pdf_parser.py +++ b/scrapeschema/parsers/pdf_parser.py @@ -4,8 +4,6 @@ import base64 import os import tempfile -from pdf2image import convert_from_path -from pdf2image.exceptions import PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError import requests import json from .prompts import DIGRAPH_EXAMPLE_PROMPT, JSON_SCHEMA_PROMPT, RELATIONS_PROMPT, UPDATE_ENTITIES_PROMPT @@ -13,6 +11,7 @@ import inspect import subprocess import logging +import re # Set up logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') @@ -88,10 +87,13 @@ def load_pdf_as_images(pdf_path: str) -> Optional[List[Image.Image]]: if not os.path.exists(image_path): break logging.info(f"Loading image: {image_path}") - images.append(Image.open(image_path)) + + # Using context manager to ensure the file is closed properly after use + with Image.open(image_path) as img: + # Append a copy of the image to the list, closing the original image + images.append(img.copy()) page_num += 1 - logging.info(f"Total pages processed: {page_num - 1}") return images except subprocess.CalledProcessError as e: @@ -100,9 +102,6 @@ def load_pdf_as_images(pdf_path: str) -> Optional[List[Image.Image]]: logging.error(f"Command error: {e.stderr}") return None - # The temporary directory and its contents are automatically cleaned up - # when exiting the 'with' block - def save_image_to_temp(image: Image.Image) -> str: """ Saves an image to a temporary file. @@ -117,7 +116,7 @@ def save_image_to_temp(image: Image.Image) -> str: image.save(temp_file.name, 'JPEG') return temp_file.name -def process_pdf(pdf_path: str) -> List[str] or None: # type: ignore +def process_pdf(pdf_path: str) -> Optional[List[str]]: """ Processes a PDF file and converts each page to a base64 encoded image. @@ -130,17 +129,29 @@ def process_pdf(pdf_path: str) -> List[str] or None: # type: ignore if not os.path.exists(pdf_path): raise FileNotFoundError(f"PDF file not found: {pdf_path}") + # Load PDF as images images = load_pdf_as_images(pdf_path) if not images: return None base64_images = [] + for page_num, image in enumerate(images, start=1): - temp_image_path = save_image_to_temp(image) - base64_image = encode_image(temp_image_path) - base64_images.append(base64_image) - os.unlink(temp_image_path) - print(f"Processed page {page_num}") + temp_image_path = None + try: + # Save image to temporary file + temp_image_path = save_image_to_temp(image) + + # Convert image to base64 + base64_image = encode_image(temp_image_path) + base64_images.append(base64_image) + + except Exception as e: + logging.error(f"Error processing page {page_num}: {e}") + finally: + # Ensure temp file is deleted even in case of an error + if temp_image_path and os.path.exists(temp_image_path): + os.unlink(temp_image_path) return base64_images @@ -178,6 +189,20 @@ def traverse_schema(schema: Dict[str, Any], parent_id: str = None): traverse_schema(entities_json_schema) return entities + def _extract_json_content(self, input_string: str) -> str: + # Use regex to match content between ```json and ``` + match = re.search(r"```json\s*(.*?)\s*```", input_string, re.DOTALL) + if match: + return match.group(1).strip() + return "" + + def _extract_python_content(self, input_string: str) -> str: + # Use regex to match content between ```python and ``` + match = re.search(r"```python\s*(.*?)\s*```", input_string, re.DOTALL) + if match: + return match.group(1).strip() + return "" + def update_entities(self, new_entities: List[Entity]) -> List[Entity]: existing_entities = self._entities @@ -189,7 +214,8 @@ def update_entities(self, new_entities: List[Entity]) -> List[Entity]: # Use _get_llm_response instead of direct API call response = self._get_llm_response(prompt) - response = response[8:-3] # Remove ```json and ``` if present + # parse the response which is inside ```json and ```, use regex to extract the json + response = self._extract_json_content(response) try: updated_entities_data = json.loads(response) @@ -225,6 +251,7 @@ def extract_relations(self, file_path: str) -> List[Relation]: # Use _get_llm_response instead of direct API call relations_answer_code = self._get_llm_response(relations_prompt) + relations_answer_code = self._extract_python_content(relations_answer_code) # Create a new dictionary to store the local variables local_vars = {} @@ -285,7 +312,7 @@ def entities_json_schema(self, file_path: str) -> Dict[str, Any]: if base64_images: page_answers = self._generate_json_schema(base64_images) json_schema = self._merge_json_schemas(page_answers) - json_schema = json_schema[8:-3] + json_schema = self._extract_json_content(json_schema) print("\n PDF JSON Schema:") print(json_schema) @@ -329,6 +356,7 @@ def _generate_json_schema(self, base64_images: List[str]) -> List[str]: # Use _get_llm_response with image answer = self._get_llm_response(prompt, image_url=f"data:image/jpeg;base64,{base64_image}") + answer = self._extract_json_content(answer) page_answers.append(f"Page {page_num}: {answer}") print(f"Processed page {page_num}") @@ -337,7 +365,7 @@ def _generate_json_schema(self, base64_images: List[str]) -> List[str]: def _merge_json_schemas(self, page_answers: List[str]) -> str: digraph_prompt = "Generate a unique json schema starting from the following \ \n\n" + "\n\n".join(page_answers) + "\n\n \ - Remember to provide only the json schema, without any comments before or after the json schema" + Remember to provide only the json schema without any comments, wrapped in backticks (`) like ```json ... ``` and nothing else." # Use _get_llm_response instead of direct API call digraph_code = self._get_llm_response(digraph_prompt) diff --git a/scrapeschema/parsers/prompts.py b/scrapeschema/parsers/prompts.py index dea88f9..be819d3 100644 --- a/scrapeschema/parsers/prompts.py +++ b/scrapeschema/parsers/prompts.py @@ -38,7 +38,8 @@ """ JSON_SCHEMA_PROMPT = """ -Extract the schema of the meaningful entities in this document, I want something like: +Extract the schema of the meaningful entities in this document, I want something like:\n +```json { "$schema": "http://json-schema.org/schema#", "title": "Payslip", @@ -151,6 +152,7 @@ "payslip" ] } +``` """ RELATIONS_PROMPT = """ @@ -159,7 +161,8 @@ Find meaningfull relations among this entities, give the relations with the following structure: {relation_class} Remember to give only and exclusively the Python code for generating the relations, nothing else. -No intro, no code block, no nothing, just the code and remember to insert the following imports: +You must wrap the code in triple backticks (```) like ```python ... ``` and nothing else. +You must insert the following imports in the code:\n from dataclasses import dataclass from typing import Any, Dict, List """ @@ -198,5 +201,5 @@ {new_entities} Please provide the updated list of entities as a JSON array. Each entity should be a JSON object with 'id', 'type', and 'attributes' fields. -provide only the JSON, nothing else, nothing before or after the JSON. +Provide only the JSON array, wrapped in backticks (`) like ```json ... ``` and nothing else. """ \ No newline at end of file diff --git a/scrapeschema/renderers/__init__.py b/scrapeschema/renderers/__init__.py new file mode 100644 index 0000000..ca5a59d --- /dev/null +++ b/scrapeschema/renderers/__init__.py @@ -0,0 +1,5 @@ +from .pyecharts_renderer import PyechartsRenderer + +__all__ = [ + "PyechartsRenderer", +] \ No newline at end of file diff --git a/scrapeschema/renderers/base.py b/scrapeschema/renderers/base.py new file mode 100644 index 0000000..3fe2e10 --- /dev/null +++ b/scrapeschema/renderers/base.py @@ -0,0 +1,10 @@ +from ..primitives import Entity, Relation + +from abc import ABC, abstractmethod +from typing import List + + +class BaseRenderer(ABC): + @abstractmethod + def render(self, entities: List[Entity], relations: List[Relation]) -> None: + pass diff --git a/scrapeschema/renderers/pyecharts_renderer.py b/scrapeschema/renderers/pyecharts_renderer.py new file mode 100644 index 0000000..e217916 --- /dev/null +++ b/scrapeschema/renderers/pyecharts_renderer.py @@ -0,0 +1,154 @@ +from .base import BaseRenderer +from ..primitives import Entity, Relation + +from itertools import cycle +from pyecharts import options as opts +from pyecharts.charts import Graph +import json + + +class PyechartsRenderer(BaseRenderer): + """ + PyechartsRenderer is a renderer that uses Pyecharts to visualize the entity-relationship graph. + + Args: + repulsion (int): The repulsion force between nodes. Defaults to 2000. + title (str): The title of the graph. Defaults to "Entity-Relationship Graph". + + Returns: + Graph: A Pyecharts Graph object representing the entity-relationship graph. + """ + + def __init__(self, repulsion: int = 2000, title: str = "Entity-Relationship Graph"): + self.repulsion = repulsion + self.title = title + self.color_palette = [ + "#1f77b4", "#ff7f0e", "#2ca02c", "#d62728", "#9467bd", + "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" + ] # List of colors + self.color_cycle = cycle(self.color_palette) # Create a cycle of colors for reuse + + def assign_colors(self, entities: list[Entity]) -> dict: + """Assign colors to each unique entity type dynamically.""" + type_to_color = {} + for entity in entities: + if entity.type not in type_to_color: + type_to_color[entity.type] = next(self.color_cycle) # Assign a new color + return type_to_color + + def extract_tooltip_info(self, attributes: dict) -> str: + """Extract information for the tooltip. Convert nested attributes to a readable JSON format.""" + return json.dumps(attributes, indent=2) # Formats attributes as a pretty JSON string + + def render(self, entities: list[Entity], relations: list[Relation], output_path: str = None) -> Graph: + # Assign colors dynamically based on the entity type + type_to_color = self.assign_colors(entities) + + # Prepare nodes as dictionaries, with labels showing only the entity ID and tooltips showing detailed info + nodes = [ + { + "name": entity.id, + "symbolSize": 50, # Adjust node size + "label": { + "formatter": f"{entity.id}" # Show only the entity id on the node + }, + "value": entity.type, # Use entity type as the value + "tooltip": { + "formatter": f"Type: {entity.type}\n{self.extract_tooltip_info(entity.attributes)}" + }, # Tooltip shows detailed attributes (nested data as JSON) + "itemStyle": {"color": type_to_color[entity.type]}, # Use dynamically assigned color + } + for entity in entities + ] + + # Prepare links based only on actual relations, with tooltips disabled + links = [ + {"source": relation.source, "target": relation.target, "tooltip": {"show": False}} + for relation in relations + ] + + # Create the graph + graph = ( + Graph() + .add( + "", + nodes, + links, + layout="force", # Use force-directed layout to allow drag-and-drop + repulsion=self.repulsion, # Controls the repulsion force between nodes + is_roam=True, # Allow zooming and panning + is_draggable=True, # Enable dragging of nodes + edge_symbol=["none", "arrow"], # Add arrows to the links + edge_symbol_size=[10, 10], # Size of the arrow + linestyle_opts=opts.LineStyleOpts(width=1, curve=0.2, opacity=0.7), # Customize the lines + label_opts=opts.LabelOpts(is_show=True, position="right"), # Show labels for the nodes + ) + .set_global_opts( + title_opts=opts.TitleOpts(title=self.title), + toolbox_opts=opts.ToolboxOpts( + is_show=True, + feature=opts.ToolBoxFeatureOpts( + save_as_image=opts.ToolBoxFeatureSaveAsImageOpts( + title="Save as Image", # Set label to English + name="graph_image", + ), + restore=opts.ToolBoxFeatureRestoreOpts( + title="Restore", # Set label to English + ), + data_view=opts.ToolBoxFeatureDataViewOpts( + title="Data View", + lang=["Data View", "Close", "Refresh"], # Set language to English + ), + magic_type=None, # Remove the magic type icons (the graph switching icons) + data_zoom=None, # Remove the zoom icon + brush=None, # Remove brush icon + ), + ), + ) + .set_series_opts( + label_opts=opts.LabelOpts(is_show=True), + ) + ) + + # Set the chart to fill the screen + graph.width = "100%" + graph.height = "100%" + + # Save the graph to the output path + if output_path: + graph.render(output_path) + + # Add the full-screen CSS after rendering + with open(output_path, "r") as file: + html_content = file.read() + + full_screen_css = """ + + """ + + # Insert the CSS before closing the head tag + html_content = html_content.replace("", full_screen_css + "") + + # Write the updated content back to the file + with open(output_path, "w") as file: + file.write(html_content) + + return graph \ No newline at end of file From c50c31c789a90bc1aa549baea9d2f8f01b5bffa0 Mon Sep 17 00:00:00 2001 From: Marco Perini Date: Fri, 13 Sep 2024 03:23:03 +0200 Subject: [PATCH 2/2] docs: added screenshot --- README.md | 3 ++- docs/assets/graph_pyecharts.png | Bin 0 -> 85863 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 docs/assets/graph_pyecharts.png diff --git a/README.md b/README.md index 6d32729..7a0d4c6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # ScrapeSchema -ScrapeSchema is a Python-based library designed to extract entities and relationship from files. +![graph](docs/assets/graph_pyecharts.png) + The generate schemas can be used to infer from document to use for tables in a database or for generating knowledge graph. ## Features diff --git a/docs/assets/graph_pyecharts.png b/docs/assets/graph_pyecharts.png new file mode 100644 index 0000000000000000000000000000000000000000..1189d6811be0bcf40314d729b74cfdd416fddf38 GIT binary patch literal 85863 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 x%nvDztR7%~aFP7q57;j#$Nc{P+=9v5