itext2kg

AuvaLabApache-2.0活跃维护

用大模型从文本中自动抽取实体与关系,构建带时间维度的知识图谱,适合做 RAG 检索和结构化知识沉淀。

We build KGs the way nature builds matter

v1.1.0发布于 2026-09-04 16:26 UTC979star106fork同步于 2026-11-07 07:31 UTC

怎么上手

由 README 提炼,执行前请确认
pip install --upgrade itext2kg
硬件要求按 README 说明

README 未说明

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

用 LLM 从文本增量构建静态、时序与动态时序知识图谱,并检测弱信号

用大模型从文本中自动抽取实体与关系,构建带时间维度的知识图谱,适合做 RAG 检索和结构化知识沉淀。

核心能力

  • 将文本拆成原子事实,缓解长上下文遗忘
  • 并行抽取五元组并做双时间建模
  • 用余弦相似度并行合并实体与关系
  • 把弱信号定义为跨快照持续出现的稀有子图
  • 将稀有与弱信号标签写回图谱便于检查

容易踩的坑

需自行安装所选 LangChain 聊天与嵌入模型对应的包;建议在独立 Python 脚本而非 Jupyter notebook 中运行,避免并行处理受事件循环争用拖慢;README 标注项目状态为 Work in Progress

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v1.1.0
  1. v1.1.0C-Unseen最新正式版2026-09-04 · 2026-09-04 16:26 UTC

    C-Unseen

    • Weak-signal detection on dynamic temporal knowledge graphs via LLM reasoning
    • Rare Subgraphs Extractor + Weak Signal Alerter
    • Paper: arXiv:2608.26870

    ATOM

    • End-to-end builders under useful_scripts/:
      • build_atom_kg_from_json.py — temporal / dynamic KG from dated texts
      • build_atom_kg_from_pdf.py — static KG from a PDF
    • Optional domains on atomic facts for noise filtering (default unchanged)
  2. v1.0.0ATOM2025-10-28 · 2025-10-28 09:28 UTC
    查看更新说明
    • Complete Architectural Redesign: ATOM now employs a three-module parallel pipeline for DTKG construction and updates.
    • Atomic Fact Decomposition: A new first module splits text into minimal "atomic facts," addressing the "forgetting effect" where LLMs omit facts in longer contexts.
    • Enhanced Exhaustivity and Stability: The new architecture achieves significant gains: ~31% in factual exhaustivity, ~18% in temporal exhaustivity, and ~17% in stability.
    • Dual-Time Modeling: Implemented dual-time modeling (t_obs vs. t_start/t_end) to prevent temporal misattribution in dynamic KGs.
    • Parallel 5-Tuple Extraction: Module-2 now directly extracts 5-tuples (subject, predicate, object, t_start, t_end) in parallel from atomic facts.
    • Parallel Atomic Merge Architecture: Module-3 uses an efficient, parallel pairwise merge algorithm, achieving 93.8% latency reduction vs. Graphiti and 95.3% vs. iText2KG.
    • LLM-Independent Resolution: Replaced slow LLM-based resolution with distance metrics (cosine similarity) for scalable, parallel merging.
  3. v0.0.9iText2KG v0.0.92025-09-01 · 2025-09-01 10:38 UTC
    查看更新说明

    Improvements

    • We correct the bug #38 in neo4j storage.
  4. v0.0.8iText2KG v0.0.82025-07-29 · 2025-07-29 10:12 UTC
    查看更新说明

    New Features

    • iText2KG_Star
      • Direct relationship extraction (faster)
      • Eliminates separate entity extraction step
      • No isolated/invented entity handling
    • Dynamic Knowledge Graphs
      • Dynamic KGs with temporal tracking
      • Incremental updates with existing graphs
    • Facts-Based Construction
      • Structured fact extraction via Document Distiller
      • More exhaustive knowledge graphs

    Improvements

    • Async Migration: All methods now async/await
    • Enhanced Logging: Structured logging system
    • Universal LangChain Support: All chat/embedding models
    • Better Error Handling: Production-ready reliability

    Technical

    • Enhanced relationship extraction
    • Python 3.10+ compatibility
    • Comprehensive examples

    We corrected the following issues: #34, #33, #29, #28, #26, #22

  5. v0.0.7Refactoring the iText2KG code2024-10-09 · 2024-10-09 13:45 UTC
    查看更新说明

    -The entire iText2KG code has been refactored by adding data models that describe an Entity, a Relationship, and a Knowledge Graph.

    • Each entity is embedded using both its name and label to avoid merging concepts with similar names but different labels, such as Python: Language and Python: Snake.
    • The weights for entity name embedding and entity label are configurable, with defaults set to 0.4 for the entity label and 0.6 for the entity name.
    • A max_tries parameter has been added to the iText2KG.build_graph function for entity and relation extraction to prevent hallucinatory effects in structuring the output. A max_tries_isolated_entities parameter has been added to the same method to handle hallucinatory effects when processing isolated entities.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Construct your knowledge graph (static, temporal, or temporal-dynamic) and detect weak signals

    This repository brings together three complementary lines of work from Yassir Lairgi's PhD:

    1. iText2KG — Incremental Knowledge Graphs Construction Using Large Language Models (WISE 2024)
    2. ATOM — AdapTive and OptiMized dynamic temporal knowledge graph construction using LLMs (Findings of EACL 2026)
    3. C-Unseen — Weak Signal Detection in Dynamic Temporal Knowledge Graphs via LLM Reasoning (WISE 2026)

    Legacy iText2KG documentation remains in README_itext2kg.md.

    GitHub stars GitHub forks PyPI Total Downloads ATOM Paper iText2KG Paper C-Unseen Paper PyPI Demo Status

    🔥 News

    • [04/09/2026] C-Unseen — Weak Signal Detection in DTKGs:

      • Paper released: C-Unseen: Weak Signal Detection in Dynamic Temporal Knowledge Graphs via LLM Reasoning (arXiv:2608.26870).
      • First definition of weak signals in DTKGs: a rare, semantically coherent subgraph that proliferates across consecutive TKG snapshots.
      • Two-module pipeline: Rare Subgraphs Extractor (LLM CoT identifies subgraphs in tension with the dominant snapshot narrative) + Weak Signal Alerter (tracks persistence / corroboration across time).
      • Self-interpretable: rare and weak-signal labels are written back onto the DTKG for inspection.
      • Outperforms keyword-, topic-, and graph-based weak-signal baselines.
    • [04/09/2026] ATOM — End-to-end scripts & optional domains:

      • End-to-end builders: ready-to-run scripts under useful_scripts/ — build_atom_kg_from_json.py (temporal / dynamic KG from dated texts) and build_atom_kg_from_pdf.py (static KG from a PDF).
      • Optional domains on atomic facts: extract_atomic_facts / build_graph accept a domains list for noise filtering (facts can be labeled and filtered by domain). Default remains empty — behavior is unchanged vs. classic ATOM when domains are not provided.
    • [20/10/2025] ATOM - Major Enhancements:

      • Complete Architectural Redesign: ATOM now employs a three-module parallel pipeline for DTKG construction and updates.
      • Atomic Fact Decomposition: A new first module splits text into minimal "atomic facts," addressing the "forgetting effect" where LLMs omit facts in longer contexts.
      • Enhanced Exhaustivity and Stability: The new architecture achieves significant gains: ~31% in factual exhaustivity, ~18% in temporal exhaustivity, and ~17% in stability.
      • Dual-Time Modeling: Implemented dual-time modeling (t_obs vs. t_start/t_end) to prevent temporal misattribution in dynamic KGs.
      • Parallel 5-Tuple Extraction: Module-2 now directly extracts 5-tuples (subject, predicate, object, t_start, t_end) in parallel from atomic facts.
      • Parallel Atomic Merge Architecture: Module-3 uses an efficient, parallel pairwise merge algorithm, achieving 93.8% latency reduction vs. Graphiti and 95.3% vs. iText2KG.
      • LLM-Independent Resolution: Replaced slow LLM-based resolution with distance metrics (cosine similarity) for scalable, parallel merging.
    • [29/07/2025] iText2KG - New Features and Enhanced Capabilities:

      • iText2KG_Star: Introduced a simpler version that directly extracts relationships, eliminating the separate entity extraction step and reducing token consumption.
      • Facts-Based KG Construction: Enhanced the framework with facts-based KG construction using a Document Distiller.
      • Dynamic Knowledge Graphs: Added support for building dynamic KGs that evolve over time. See example: Dynamic KG Construction. NB: Temporal/logical conflicts resolution is not handled in this version.
    • [19/07/2025] iText2KG - Major Performance and Reliability Updates:

      • Asynchronous Architecture: Migrated core methods to async/await for non-blocking I/O with LLM APIs.
      • Logging System: Implemented comprehensive logging to replace print statements.
      • Enhanced Batch Processing: Improved efficiency for handling multiple documents and LLM calls.
      • Better Error Handling: Added enhanced error handling and retry mechanisms.
    • [07/10/2024] iText2KG - Latest features:

      • Refactored code with data models for Entity, Relation, and KnowledgeGraph.
      • Entities are embedded using both name (0.6 weight) and label (0.4 weight) to differentiate concepts (e.g., Python:Language vs. Python:Snake).
      • Added max_tries parameters to build_graph to handle LLM hallucinations.
    • [17/09/2024] iText2KG - Latest features:

      • Compatibility with all LangChain chat and embedding models.
      • The build_graph function can now expand existing graphs.
      • Compatible with Python 3.9+.
    • [16/07/2024] iText2KG - Addressed two major LLM hallucination issues:

      • Handled invented entities by replacing them with the most similar entity from the provided list.
      • Handled the "forgetting effect" (failing to assign relations) by re-prompting the LLM for missing entities.

    ATOM

    ATOM is a few-shot and scalable approach for building and continuously updating Temporal Knowledge Graphs (TKGs) from unstructured texts. It can also build static KGs (fix a single observation time) and dynamic temporal KGs (multiple observation times with dual-time modeling).

    Overview

    Traditional static KG construction often overlooks the dynamic and time-sensitive nature of real-world data, limiting adaptability to continuous changes. Moreover, recent zero- or few-shot approaches that avoid domain-specific fine-tuning or reliance on prebuilt ontologies often suffer from instability across multiple runs, as well as incomplete coverage of key facts.

    ATOM splits input documents into minimal, self-contained “atomic” facts, improving extraction exhaustivity and stability. From these atomic facts, atomic KGs are derived and then merged in parallel.

    In a nutshell, ATOM addresses these limitations by:

    • ✅ Improving exhaustivity: Capturing comprehensive fact coverage from longer texts (~31% gain on factual exhaustivity, ~18% improvement in temporal exhaustivity)
    • ✅ Ensuring stability: Producing consistent TKGs across multiple runs (~17% improvement)
    • ✅ Enabling scalability: Supporting large-scale dynamic temporal updates through parallel architecture.

    Architecture

    ATOM employs a three-module parallel pipeline that constructs and continuously updates DTKGs from unstructured text.

    Module-1 (Atomic Fact Decomposition) splits input documents D_t observed at time t into temporal atomic facts {f_{t,1}, ..., f_{t,m_t}} using LLM-based prompting with an optimal chunk size of <400 tokens, where each temporal atomic fact is a short, self-contained snippet that conveys exactly one piece of information.

    Module-2 (Atomic TKGs Construction) extracts 5-tuples (quintuples) in parallel from each atomic fact f_{t,i} to construct atomic temporal KGs G^t_i, while embedding nodes and relations and addressing temporal resolution during extraction by transforming end validity facts into affirmative counterparts while modifying only the t_end time (e.g., "John Doe is no longer CEO of X on 01-01-2026" → (John_Doe, is_ceo, X, [.], [01-01-2026])).

    Module-3 (Parallel Atomic Merge) employs a binary merge algorithm to merge pairs of atomic TKGs through iterative pairwise merging in parallel until convergence, with three resolution phases: (1) entity resolution using exact match or cosine similarity threshold θ_E = 0.8, (2) relation resolution merging relation names regardless of endpoints and timestamps using threshold θ_R = 0.7, and (3) temporal resolution that merges observation and validity time sets for relations with similar (e_s, r_p, e_o).

    The resulting TKG snapshot G^t_s is then merged with the previous DTKG G^{t-1} to yield the updated DTKG: G^t.


    Example of the ATOM Workflow

    On observation date 09-01-2007, ATOM processes the fact "Steve Jobs was the CEO of Apple Inc. on January 9, 2007" to create the 5-tuple (Steve Jobs, is_ceo, Apple Inc., [09-01-2007], [.]) where t_start = [09-01-2007] and t_end = [.] (empty/unknown).

    Later, on observation date 05-10-2011, ATOM processes the update "Steve Jobs is no longer the CEO of Apple Inc. on 05-10-2011". As described in Module-2, this end validity fact is transformed into its affirmative counterpart by modifying only the t_end time, producing (Steve Jobs, is_ceo, Apple Inc., [.], [05-10-2011]).

    During Module-3's temporal resolution phase, ATOM detects that both 5-tuples share the same (e_s, r_p, e_o) triple and merges their time lists to produce the final 5-tuple: (Steve Jobs, is_ceo, Apple Inc., [09-01-2007], [05-10-2011]). This correctly represents that Steve Jobs was CEO from January 9, 2007 to October 5, 2011, while maintaining dual-time modeling with t_obs = [09-01-2007, 05-10-2011] to track when each piece of information was observed.

    For more technical details, see:


    Latency & Scalability

    ATOM achieves significant latency reduction (93.8% vs. Graphiti, 95.3% vs. iText2KG) by replacing serial bottlenecks with a fully parallel architecture.

    Key architectural advantages include:

    1. Parallel 5-Tuple Extraction: ATOM extracts 5-tuples in a single, parallelized step. This avoids the separate entity and relation extraction steps used by iText2KG and Graphiti, which double LLM calls and increase latency.
    2. LLM-Independent Merging: The framework uses efficient distance metrics (cosine similarity) for entity/relation resolution. This avoids the computational bottlenecks of LLM-based resolution (used by Graphiti) and allows true parallelization as the graph scales.
    3. Parallel Atomic Merge: Atomic TKGs are merged using an iterative pairwise algorithm, which runs in parallel (e.g., 8 threads with a batch size of 40).
    4. Early Temporal Resolution: Temporal logic is handled during the extraction phase (Module-2), not during the merge phase.

    As a result, the parallel merge process (Module-3) accounts for only 13% of ATOM's total latency. The remainder is attributed to API calls, which can be further minimized by increasing the batch size or scaling local LLM hardware.


    Installation

    pip install --upgrade itext2kg
    

    LLM Compatibility

    ATOM is compatible with all language models supported by LangChain. To use ATOM, you will need both a chat model and an embeddings model. For available chat models, refer to the options listed at: https://python.langchain.com/docs/integrations/chat/. For embedding models, explore the choices at: https://python.langchain.com/docs/integrations/text_embedding/

    Please ensure that you install the necessary package for each chat model before use.

    ATOM Arguments

    Initialization:

    • llm_model: A LangChain chat model instance for extraction
    • embeddings_model: A LangChain embeddings model instance for entity/relation matching
    • kg_store_dir (Path | str, optional): If set, each build_graph call persists {obs_timestamp}.json (+ .npz for embeddings); multi-obs merges also write merged.json / merged.npz

    extract_atomic_facts function:

    • texts (List[str]): Input texts (chunks / paragraphs) to decompose
    • observation_timestamp (str): Observation date used to ground relative temporal expressions
    • domains (List[str], optional): Allowed domain labels. Empty / omitted → no domain classification (DomainedFact.domain stays empty). Non-empty → each fact is labeled with one of the allowed domains

    build_graph function: (This function can also build static KGs: fix a single observation time and pass your atomic facts.)

    • atomic_facts (List[str]): A list of atomic facts (short, self-contained text snippets) to process
    • obs_timestamp (str): The observation timestamp when the atomic facts were collected
    • existing_knowledge_graph (KnowledgeGraph, optional): An existing knowledge graph to merge with the new one
    • domains (List[str], optional): Per-fact domain labels; if provided, length must match atomic_facts. Non-empty domains are written onto relationships
    • ent_threshold (float, default=0.8): Similarity threshold for entity resolution during merging
    • rel_threshold (float, default=0.7): Similarity threshold for relationship resolution during merging
    • entity_name_weight (float, default=0.8): Weight for entity name in similarity calculations
    • entity_label_weight (float, default=0.2): Weight for entity label in similarity calculations
    • max_workers (int, default=8): Maximum number of parallel workers for processing

    build_graph_from_different_obs_times function:

    • atomic_facts_with_obs_timestamps (dict): Keys are observation timestamps (str); values are lists of atomic facts for each timestamp
    • existing_knowledge_graph (KnowledgeGraph, optional): An existing knowledge graph to merge with the new ones
    • domains_with_obs_timestamps (dict, optional): Same keys as atomic_facts_with_obs_timestamps; values are per-fact domain lists passed through to build_graph
    • ent_threshold (float, default=0.8): Similarity threshold for entity resolution during merging
    • rel_threshold (float, default=0.7): Similarity threshold for relationship resolution during merging
    • entity_name_weight (float, default=0.8): Weight for entity name in similarity calculations
    • entity_label_weight (float, default=0.2): Weight for entity label in similarity calculations
    • max_workers (int, default=8): Maximum number of parallel workers for processing

    Examples: Building KGs with ATOM

    ⚠️ Performance note: For optimal performance, run ATOM in dedicated Python scripts rather than Jupyter notebooks. ATOM's parallel processing can slow down under notebook event-loop / thread contention.

    Ready-to-run utility scripts

    End-to-end builders live under useful_scripts/:

    ScriptWhat it builds
    build_atom_kg_from_json.pyDynamic / temporal KG from a JSON list of dated texts (atomic facts → per-row snapshots → merged KG as JSON + NPZ)
    build_atom_kg_from_pdf.pyStatic KG from a PDF (PyMuPDF extract → token gate / semantic chunking → atomic facts → one build_graph at a single observation time)

    Edit the globals at the top of each script (paths, model names, thresholds, Neo4j toggle), then:

    python useful_scripts/build_atom_kg_from_json.py
    python useful_scripts/build_atom_kg_from_pdf.py
    

    Minimal example (dynamic TKG)

    The following builds a dynamic TKG from atomic facts of the 2020-COVID-NYT dataset.

    import pandas as pd
    import asyncio
    import ast
    
    from langchain_openai import ChatOpenAI, OpenAIEmbeddings
    from itext2kg.atom import Atom
    from itext2kg.graph_integration import Neo4jStorage
    
    openai_api_key = "#"
    openai_llm_model = ChatOpenAI(
        api_key=openai_api_key,
        model="gpt-4.1-2025-04-14",
        temperature=0,
        max_tokens=None,
        timeout=None,
        max_retries=2,
    )
    
    openai_embeddings_model = OpenAIEmbeddings(
        api_key=openai_api_key,
        model="text-embedding-3-large",
    )
    
    news_covid = pd.read_pickle("./datasets/atom/nyt_news/2020_nyt_COVID_last_version_ready.pkl")
    
    def to_dictionary(df: pd.DataFrame, max_elements: int | None = 20):
        if isinstance(df["factoids_g_truth"][0], str):
            df["factoids_g_truth"] = df["factoids_g_truth"].apply(lambda x: ast.literal_eval(x))
        grouped_df = df.groupby("date")["factoids_g_truth"].sum().reset_index()[:max_elements]
        return {
            str(date): factoids
            for date, factoids in grouped_df.set_index("date")["factoids_g_truth"].to_dict().items()
        }
    
    news_covid_dict = to_dictionary(news_covid)
    
    atom = Atom(llm_model=openai_llm_model, embeddings_model=openai_embeddings_model)
    
    kg = await atom.build_graph_from_different_obs_times(
        atomic_facts_with_obs_timestamps=news_covid_dict,
    )
    
    URI = "bolt://localhost:7687"
    USERNAME = "neo4j"
    PASSWORD = "##"
    Neo4jStorage(uri=URI, username=USERNAME, password=PASSWORD).visualize_graph(knowledge_graph=kg)
    

    Evaluation Scripts, Dataset and Prompts


    C-Unseen

    C-Unseen is a self-interpretable framework for weak signal detection in Dynamic Temporal Knowledge Graphs (DTKGs). A weak signal is defined as a rare, semantically coherent subgraph that proliferates across consecutive TKG snapshots.

    Overview

    Keyword-, topic-, and untyped-graph methods miss the semantic and relational structure through which weak signals appear. C-Unseen operates on DTKGs (e.g. those built with ATOM) through two modules:

    1. Rare Subgraphs Extractor — an LLM with chain-of-thought reasoning identifies subgraphs whose content is in tension with the dominant snapshot narrative.
    2. Weak Signal Alerter — tracks those rare subgraphs across time steps to isolate true weak signals via corroboration.

    Experimental results show that C-Unseen outperforms keyword-, topic-, and graph-based baselines. Paper: arXiv:2608.26870.

    Package entry points

    from itext2kg.c_unseen import CUnseen
    from itext2kg.c_unseen.models import SignalKnowledgeGraph
    
    c_unseen = CUnseen(llm_model=openai_llm_model, embeddings_model=openai_embeddings_model)
    
    # kg: SignalKnowledgeGraph snapshot; previous_kgs: prior snapshots for corroboration
    await c_unseen.process_snapshot(
        kg=kg,
        previous_kgs=previous_kgs,
        snapshot_label="2024-01-16",
        central_entity_name="OpenAI",
    )
    

    Public Collaboration

    We welcome contributions from the community to improve ATOM, C-Unseen, and iText2KG.

    Citation

    If you use this work, please cite the relevant paper(s):

    @inproceedings{lairgi2024itext2kg,
      title={itext2kg: Incremental knowledge graphs construction using large language models},
      author={Lairgi, Yassir and Moncla, Ludovic and Cazabet, R{\'e}my and Benabdeslem, Khalid and Cl{\'e}au, Pierre},
      booktitle={International Conference on Web Information Systems Engineering},
      pages={214--229},
      year={2024},
      organization={Springer}
    }
    
    @inproceedings{lairgi2026atom,
      title={ATOM: AdapTive and OptiMized dynamic temporal knowledge graph construction using LLMs},
      author={Lairgi, Yassir and Moncla, Ludovic and Benabdeslem, Khalid and Cazabet, R{\'e}my and Cl{\'e}au, Pierre},
      booktitle={Findings of the Association for Computational Linguistics: EACL 2026},
      pages={950--966},
      year={2026}
    }
    
    @article{lairgi2026c,
      title={C-Unseen: Weak Signal Detection in Dynamic Temporal Knowledge Graphs via LLM Reasoning},
      author={Lairgi, Yassir and Moncla, Ludovic and Benabdeslem, Khalid and Cazabet, R{\'e}my and Cl{\'e}au, Pierre},
      journal={arXiv preprint arXiv:2608.26870},
      year={2026}
    }