mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-09-09 04:00:52 +00:00
13 KiB
13 KiB
In [ ]:
%pip install semantica
# spaCy models are distributed separately from the spaCy library. This lesson
# relies on the English model to recognize standalone places such as Cupertino.
import sys
import subprocess
import spacy
try:
spacy.load("en_core_web_sm")
except OSError:
subprocess.check_call([sys.executable, "-m", "spacy", "download", "en_core_web_sm"])
In [ ]:
from pathlib import Path
from semantica.ingest import FileIngestor
sample_text = """Apple Inc. is headquartered in Cupertino, California.
In 1976, Steve Jobs founded Apple Inc.
Tim Cook is the CEO of Apple Inc.
"""
sample_file = Path("sample_document.txt")
sample_file.write_text(sample_text)
print(f"File: {sample_file}")
print(f"Content length: {len(sample_text)} characters")
ingestor = FileIngestor()
file_object = ingestor.ingest_file(sample_file, read_content=True)
print(f" File name: {file_object.name}")
print(f" File type: {file_object.file_type}")
print(f" Content available: {file_object.content is not None}")In [ ]:
from semantica.parse import DocumentParser
parser = DocumentParser()
parsed_document = parser.parse_document(str(sample_file))
parsed_content = parsed_document.get("text", "")
assert parsed_content.strip(), "Parsing produced no text — check the input file"
print(f"Parsed content length: {len(parsed_content)} characters")
print(f"Preview: {parsed_content[:120]}...")In [ ]:
from semantica.semantic_extract import NERExtractor, RelationExtractor
ner_extractor = NERExtractor()
relation_extractor = RelationExtractor()
mentions = ner_extractor.extract(parsed_content)
relations = relation_extractor.extract(parsed_content, mentions)
print("Entity mentions:")
for mention in mentions:
print(f" {mention.text!r:<13} {mention.label:<7} span=[{mention.start_char}:{mention.end_char}]")
print("\nExtracted relations:")
for rel in relations:
print(f" {rel.subject.text!r} --{rel.predicate}--> {rel.object.text!r}")In [ ]:
from semantica.kg import GraphBuilder
entities = []
span_to_id = {}
for i, mention in enumerate(mentions, 1):
graph_id = f"e{i}"
span_to_id[(mention.start_char, mention.end_char)] = graph_id
entities.append({
"id": graph_id,
"type": mention.label,
"name": mention.text,
"properties": {},
})
relationships = []
for rel in relations:
source_id = span_to_id.get((rel.subject.start_char, rel.subject.end_char))
target_id = span_to_id.get((rel.object.start_char, rel.object.end_char))
if source_id is None or target_id is None:
print(f"Skipping relation with unmapped endpoint: "
f"{rel.subject.text!r} --{rel.predicate}--> {rel.object.text!r}")
continue
relationships.append({
"source": source_id,
"target": target_id,
"type": rel.predicate,
"properties": {},
})
builder = GraphBuilder()
knowledge_graph = builder.build({"entities": entities, "relationships": relationships})
id_to_name = {entity["id"]: entity["name"] for entity in entities}
print(f"Nodes (entities): {len(knowledge_graph['entities'])}")
for entity in knowledge_graph["entities"]:
print(f" {entity['id']}: {entity['name']} ({entity['type']})")
print(f"\nEdges (relationships): {len(knowledge_graph['relationships'])}")
for relationship in knowledge_graph["relationships"]:
print(f" {id_to_name[relationship['source']]} "
f"--{relationship['type']}--> {id_to_name[relationship['target']]}")
edges = {
(id_to_name[r["source"]], r["type"], id_to_name[r["target"]])
for r in knowledge_graph["relationships"]
}
assert ("Apple Inc.", "located_in", "Cupertino") in edges
assert ("Tim Cook", "works_for", "Apple Inc.") in edgesIn [ ]:
from semantica.visualization import KGVisualizer
visualizer = KGVisualizer()
fig = visualizer.visualize_network(
knowledge_graph, output="html", file_path="knowledge_graph.html"
)
print("Saved interactive visualization to knowledge_graph.html")
entity_types = {}
for entity in knowledge_graph["entities"]:
entity_types[entity["type"]] = entity_types.get(entity["type"], 0) + 1
print("\nEntities by type:")
for entity_type, count in sorted(entity_types.items()):
print(f" - {entity_type}: {count}")
relationship_types = {}
for relationship in knowledge_graph["relationships"]:
relationship_types[relationship["type"]] = (
relationship_types.get(relationship["type"], 0) + 1
)
print("\nRelationships by type:")
for relationship_type, count in sorted(relationship_types.items()):
print(f" - {relationship_type}: {count}")
figIn [ ]:
for path in [sample_file, Path("knowledge_graph.html")]:
if path.exists():
path.unlink()
print(f"Removed {path}")