From 3838770e7a8074d3e7be2933562ba2862c3515ce Mon Sep 17 00:00:00 2001 From: Wang Qi Date: Mon, 11 May 2026 12:59:59 +0800 Subject: [PATCH] GraphRAG feature - Part 1 - add spacy to extract entity and relation (#14670) ### What problem does this PR solve? GraphRAG feature - Part 1 - add spacy to extract entity and relation image ### Type of change - [x] New Feature (non-breaking change which adds functionality) --- api/utils/validation_utils.py | 2 +- pyproject.toml | 2 + rag/graphrag/general/index.py | 25 +- rag/graphrag/ner/__init__.py | 18 + rag/graphrag/ner/graph_extractor.py | 644 ++++++++++++++++++ .../test_create_dataset.py | 4 +- .../test_update_dataset.py | 4 +- .../test_create_dataset.py | 4 +- .../test_update_dataset.py | 4 +- uv.lock | 393 +++++++++++ .../graph-rag-form-fields.tsx | 11 +- web/src/locales/ar.ts | 2 +- web/src/locales/bg.ts | 3 +- web/src/locales/de.ts | 5 +- web/src/locales/en.ts | 3 +- web/src/locales/fr.ts | 3 +- web/src/locales/it.ts | 3 +- web/src/locales/ru.ts | 3 +- web/src/locales/tr.ts | 3 +- web/src/locales/vi.ts | 5 +- web/src/locales/zh-traditional.ts | 3 +- web/src/locales/zh.ts | 3 +- .../pages/dataset/dataset-setting/index.tsx | 1 + 23 files changed, 1118 insertions(+), 30 deletions(-) create mode 100644 rag/graphrag/ner/__init__.py create mode 100644 rag/graphrag/ner/graph_extractor.py diff --git a/api/utils/validation_utils.py b/api/utils/validation_utils.py index 063368a299..eea5ccbce8 100644 --- a/api/utils/validation_utils.py +++ b/api/utils/validation_utils.py @@ -351,7 +351,7 @@ class RaptorConfig(Base): class GraphragConfig(Base): use_graphrag: Annotated[bool, Field(default=False)] entity_types: Annotated[list[str], Field(default_factory=lambda: ["organization", "person", "geo", "event", "category"])] - method: Annotated[Literal["light", "general"], Field(default="light")] + method: Annotated[Literal["light", "general", "ner"], Field(default="light")] community: Annotated[bool, Field(default=False)] resolution: Annotated[bool, Field(default=False)] diff --git a/pyproject.toml b/pyproject.toml index c4672e70e0..c4eeb3aeb0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -101,6 +101,8 @@ dependencies = [ "ruamel-yaml>=0.18.6,<0.19.0", "scholarly==1.7.11", "selenium-wire==5.1.0", + "spacy==3.8.14", + "en-core-web-sm @ https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl", "slack-sdk==3.37.0", "socksio==1.0.0", "agentrun-sdk>=0.0.16,<1.0.0", diff --git a/rag/graphrag/general/index.py b/rag/graphrag/general/index.py index da86fdc48e..9898b19a32 100644 --- a/rag/graphrag/general/index.py +++ b/rag/graphrag/general/index.py @@ -29,6 +29,7 @@ from rag.graphrag.general.community_reports_extractor import CommunityReportsExt from rag.graphrag.general.extractor import Extractor from rag.graphrag.general.graph_extractor import GraphExtractor as GeneralKGExt from rag.graphrag.light.graph_extractor import GraphExtractor as LightKGExt +from rag.graphrag.ner.graph_extractor import GraphExtractor as NerKGExt from rag.graphrag.phase_markers import ( PHASE_COMMUNITY, PHASE_RESOLUTION, @@ -53,6 +54,24 @@ from common import settings from common.doc_store.doc_store_base import OrderByExpr +def _select_extractor(graphrag_config: dict): + """Return the extractor class matching ``graphrag_config["method"]``. + + Supported values: + - ``"general"`` – Microsoft GraphRAG LLM-based extractor (default in + earlier versions). + - ``"light"`` – LightRAG-style LLM-based extractor (the default when + *method* is omitted or unrecognised). + - ``"ner"`` – NER-based extractor using spaCy (no LLM + needed for entity / relation extraction itself). + """ + method = graphrag_config.get("method", "light") + if method == "general": + return GeneralKGExt + if method == "ner": + return NerKGExt + return LightKGExt + async def load_subgraph_from_store(tenant_id: str, kb_id: str, doc_id: str): """Load a previously saved subgraph from the doc store. @@ -123,9 +142,7 @@ async def run_graphrag( try: subgraph = await asyncio.wait_for( generate_subgraph( - LightKGExt if "method" not in row["kb_parser_config"].get("graphrag", {}) - or row["kb_parser_config"]["graphrag"]["method"] != "general" - else GeneralKGExt, + _select_extractor(row["kb_parser_config"].get("graphrag", {})), tenant_id, kb_id, doc_id, @@ -294,7 +311,7 @@ async def run_graphrag_for_kb( callback(msg=f"[GraphRAG] doc:{doc_id} has no available chunks, skip generation.") return - kg_extractor = LightKGExt if ("method" not in kb_parser_config.get("graphrag", {}) or kb_parser_config["graphrag"]["method"] != "general") else GeneralKGExt + kg_extractor = _select_extractor(kb_parser_config.get("graphrag", {})) deadline = max(120, len(chunks) * 60 * 10) if enable_timeout_assertion else 10000000000 diff --git a/rag/graphrag/ner/__init__.py b/rag/graphrag/ner/__init__.py new file mode 100644 index 0000000000..f65b174249 --- /dev/null +++ b/rag/graphrag/ner/__init__.py @@ -0,0 +1,18 @@ +# +# Copyright 2025 The InfiniFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from .graph_extractor import GraphExtractor + +__all__ = ["GraphExtractor"] diff --git a/rag/graphrag/ner/graph_extractor.py b/rag/graphrag/ner/graph_extractor.py new file mode 100644 index 0000000000..67d97346c1 --- /dev/null +++ b/rag/graphrag/ner/graph_extractor.py @@ -0,0 +1,644 @@ +# +# Copyright 2025 The InfiniFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +""" +spaCy-based entity and relationship extractor for GraphRAG. + +Combines techniques from **LinearRAG** and **MGranRAG**: + +* **Entity extraction** uses MGranRAG's multi-pass stacking algorithm + (hyphen/apostrophe merging → capitalised-word merging → continuous + noun/number merging) combined with spaCy NER, then deduplicated via + ``ner_all_keywords``. +* **Relationship inference** follows LinearRAG's *relation-free* approach: + entities co-occurring in the same sentence (or nearby sentences) are + linked by implicit semantic edges whose description is the shared + sentence text (semantic bridging). Edge weights are optionally TF- + normalised. + +No LLM calls are needed for the extraction step itself. The LLM is only +used downstream (inherited from ``Extractor``) for merging / summarising +duplicate entity descriptions when the same entity appears in multiple +chunks. +""" + +import logging +from collections import defaultdict + +from rag.graphrag.general.extractor import Extractor +from rag.llm.chat_model import Base as CompletionLLM + +# --------------------------------------------------------------------------- +# spaCy model loading (lazy, module-level singleton) +# --------------------------------------------------------------------------- +_nlp = None +_nlp_model_name = "" + + +def _load_spacy_model(model_name: str = "en_core_web_sm"): + """Load (or return cached) spaCy language model. + + Automatically downloads the model if it is not yet installed. + """ + global _nlp, _nlp_model_name + if _nlp is not None and _nlp_model_name == model_name: + return _nlp + try: + import spacy + except ImportError: + raise ImportError( + "spaCy is required for the spacy GraphRAG method. " + "Install it with: pip install spacy && python -m spacy download en_core_web_sm" + ) + try: + _nlp = spacy.load(model_name) + logging.info("Loaded spaCy model '%s'", model_name) + except OSError: + logging.warning( + "spaCy model '%s' not found; downloading automatically …", model_name + ) + from spacy.cli import download as spacy_download + spacy_download(model_name) + _nlp = spacy.load(model_name) + logging.info("Downloaded and loaded spaCy model '%s'", model_name) + _nlp_model_name = model_name + return _nlp + + +# --------------------------------------------------------------------------- +# spaCy ↔ application entity-type mapping +# --------------------------------------------------------------------------- +# spaCy's built-in entity labels → the application-level types used by +# ``DEFAULT_ENTITY_TYPES``. Labels not listed here fall through to +# ``"category"``. +SPACY_TO_APP_ENTITY_TYPE: dict[str, str] = { + "PERSON": "person", + "ORG": "organization", + "GPE": "geo", + "LOC": "geo", + "FAC": "geo", + "EVENT": "event", + "PRODUCT": "category", + "WORK_OF_ART": "category", + "LAW": "category", + "LANGUAGE": "category", + "NORP": "category", + "MONEY": "category", + "QUANTITY": "category", + "TIME": "event", + "DATE": "event", +} + +# Labels to skip entirely (from LinearRAG: ordinals / cardinals are rarely +# useful as graph nodes). +_SKIP_SPACY_LABELS = {"ORDINAL", "CARDINAL"} + + +# --------------------------------------------------------------------------- +# MGranRAG-style multi-pass keyword extraction +# --------------------------------------------------------------------------- + +def _has_uppercase(text: str) -> bool: + return any(c.isupper() for c in text) + + +def _replace_word(word: str) -> str: + """Normalise spaces around hyphens and apostrophes (from MGranRAG).""" + return ( + word.replace(" - ", "-") + .replace(" -", "-") + .replace("- ", "-") + .replace(" 's", "'s") + .replace(" 'S", "'S") + ) + + +def extract_keywords(spacy_doc) -> set[str]: + """MGranRAG-style 3-pass stacking keyword extraction. + + Phase 1 — Hyphen / apostrophe merging: + Tokens connected by ``-`` or ``'s`` are merged into a single + phrase labelled ``NP`` (e.g. ``New-York``, ``cat's``). + + Phase 2 — Capitalised-word merging: + Consecutive tokens whose ``shape_`` contains ``X`` (i.e. start + with an uppercase letter) are merged. Function words (ADP, CCONJ, + DET, PART) between them are absorbed as well, producing phrases + like ``King of England``. Merged results are labelled ``NX`` + unless already ``PROPN``. + + Phase 3 — Continuous noun / number merging: + Consecutive tokens with POS in ``[PROPN, NOUN, NUM, NX, NP]`` + are merged and labelled ``NNN`` (unless already ``PROPN``). + + Finally, results with a trailing lowercase non-noun word are + truncated, and coordinating conjunctions (``and``, ``or``) inside a + merged phrase cause it to be split so that each proper noun is + extracted individually (e.g. ``Bob and Lucy`` → ``Bob``, ``Lucy``). + """ + # ── Phase 1: hyphen / apostrophe ────────────────────────────────── + f1_word: list[str] = [] + f1_shape: list[str] = [] + f1_pos: list[str] = [] + f1_pos_list: list[list[str]] = [] + f1_word_list: list[list[str]] = [] + + is_right = False + for token in spacy_doc: + if token.shape_ in ("'x", "-") and token.pos_ in ("PUNCT", "PART"): + if token.shape_ == "-": + is_right = True + if f1_word: + f1_word[-1] += token.text + f1_pos[-1] = "NP" + f1_pos_list[-1].append(token.pos_) + f1_word_list[-1].append(token.text) + elif is_right: + is_right = False + if f1_word: + f1_word[-1] += token.text + f1_pos[-1] = "NP" + f1_pos_list[-1].append(token.pos_) + f1_word_list[-1].append(token.text) + else: + f1_word.append(token.text) + f1_shape.append(token.shape_) + f1_pos.append(token.pos_) + f1_pos_list.append([token.pos_]) + f1_word_list.append([token.text]) + + # ── Phase 2: capitalised-word merging ─────────────────────────── + f2_word: list[str] = [] + f2_shape: list[str] = [] + f2_pos: list[str] = [] + f2_pos_list: list[list[str]] = [] + f2_word_list: list[list[str]] = [] + + for cur in range(len(f1_word)): + cw = f1_word[cur] + cs = f1_shape[cur] + cp = f1_pos[cur] + cpl = f1_pos_list[cur] + cwl = f1_word_list[cur] + + if "X" in cs or cp in ("ADP", "CCONJ", "DET", "PART"): + if f2_word and "X" in f2_shape[-1]: + # Merge with previous capitalised token. + f2_word[-1] += " " + cw + f2_shape[-1] += "X" + if f2_pos[-1] != "PROPN": + f2_pos[-1] = "NX" + f2_pos_list[-1].extend(cpl) + f2_word_list[-1].extend(cwl) + else: + f2_word.append(cw) + f2_shape.append(cs + "Start" if "X" in cs else cs) + f2_pos.append(cp) + f2_pos_list.append(cpl) + f2_word_list.append(cwl) + else: + f2_word.append(cw) + f2_shape.append(cs) + f2_pos.append(cp) + f2_pos_list.append(cpl) + f2_word_list.append(cwl) + + # ── Phase 3: continuous noun / number merging ─────────────────── + f3_word: list[str] = [] + f3_shape: list[str] = [] + f3_pos: list[str] = [] + f3_pos_list: list[list[str]] = [] + f3_word_list: list[list[str]] = [] + + _noun_pos = {"PROPN", "NOUN", "NUM", "NX", "NP"} + _noun_pos_ext = _noun_pos | {"NNN"} + + for cur in range(len(f2_word)): + cw = f2_word[cur] + cs = f2_shape[cur] + cp = f2_pos[cur] + cpl = f2_pos_list[cur] + cwl = f2_word_list[cur] + + if cp in _noun_pos: + if f3_word and f3_pos[-1] in _noun_pos_ext: + f3_word[-1] += " " + cw + f3_shape[-1] += "X" + if f3_pos[-1] != "PROPN": + f3_pos[-1] = "NNN" + f3_pos_list[-1].extend(cpl) + f3_word_list[-1].extend(cwl) + else: + f3_word.append(cw) + f3_shape.append(cs) + f3_pos.append(cp) + f3_pos_list.append(cpl) + f3_word_list.append(cwl) + else: + f3_word.append(cw) + f3_shape.append(cs) + f3_pos.append(cp) + f3_pos_list.append(cpl) + f3_word_list.append(cwl) + + # ── Final keyword collection ──────────────────────────────────── + keywords: set[str] = set() + for cur in range(len(f3_word)): + cw = f3_word[cur] + cp = f3_pos[cur] + cpl = f3_pos_list[cur] + cwl = f3_word_list[cur] + + if cp not in _noun_pos_ext: + continue + + # Truncate trailing lowercase non-noun / non-number words. + if cwl and not _has_uppercase(cwl[-1]) and cpl[-1] not in ( + "PROPN", + "NOUN", + "NUM", + "PART", + ): + for i in range(len(cpl) - 1, 0, -1): + if cpl[i] in ("PROPN", "NOUN", "NUM", "PART") or _has_uppercase( + cwl[i] + ): + break + word = _replace_word(" ".join(cwl[: i + 1])) + keywords.add(word) + else: + word = _replace_word(cw) + keywords.add(word) + + # Split on coordinating conjunctions (and/or) inside merged + # phrases so that individual proper nouns are also extracted + # (e.g. ``Bob and Lucy`` → ``Bob``, ``Lucy``). + if any(p in ("PROPN", "NOUN", "NUM") for p in cpl): + cur_kws: list[str] = [] + for pidx, pos in enumerate(cpl): + if pos == "CCONJ" and cwl[pidx] and cwl[pidx][0].islower(): + if cur_kws: + keywords.add(_replace_word(" ".join(cur_kws))) + cur_kws = [] + else: + cur_kws.append(cwl[pidx]) + if cur_kws: + keywords.add(_replace_word(" ".join(cur_kws))) + + return keywords + + +def get_ner(spacy_doc) -> dict[str, str]: + """Return ``{entity_text: spaCy_label}`` for all NER entities.""" + entities_dict: dict[str, str] = {} + for ent in spacy_doc.ents: + if ent.label_ in _SKIP_SPACY_LABELS: + continue + text = ent.text.strip() + for t in text.split("\n"): + t = t.strip() + if t: + entities_dict[t] = ent.label_ + return entities_dict + + +def ner_all_keywords(spacy_doc) -> set[str]: + """Combine rule-based keyword extraction with spaCy NER (MGranRAG). + + Returns the union of: + - keywords from the 3-pass stacking algorithm (``extract_keywords``) + - entity texts from spaCy NER (``get_ner``) + """ + keywords = extract_keywords(spacy_doc) + ner_dict = get_ner(spacy_doc) + return keywords.union(ner_dict.keys()) + + +# --------------------------------------------------------------------------- +# Main extractor class +# --------------------------------------------------------------------------- + +class GraphExtractor(Extractor): + """Extract entities and relationships using spaCy (no LLM calls). + + Entity extraction + MGranRAG's ``ner_all_keywords`` combines a 3-pass stacking + keyword algorithm with spaCy NER, yielding broader coverage than + NER alone (e.g. it catches compound nouns, hyphenated terms, and + multi-word proper nouns that NER might miss). + + Relationship inference + LinearRAG's *relation-free* semantic bridging: entities + co-occurring in the same sentence (or within + ``max_sentence_distance`` sentences) are linked by an implicit + edge. The edge description is the shared sentence text, which + provides natural language context without requiring an LLM. + + Optionally, edge weights are TF-normalised (LinearRAG): + ``weight = count(entity_in_chunk) / sum(all_entity_counts_in_chunk)``. + + The ``llm_invoker`` is only used downstream for merging / summarising + duplicate descriptions (inherited from ``Extractor``). + + Parameters + ---------- + llm_invoker : CompletionLLM + LLM handle (used only for description summarisation, not extraction). + language : str + Language hint. + entity_types : list[str] | None + Application-level entity types to keep. Entities whose mapped + type is not in this list are discarded. + spacy_model : str + Name of the spaCy model to load (default ``en_core_web_sm``). + max_sentence_distance : int + When inferring relationships, pair entities that co-occur within + the same sentence. If > 1, also pair entities in sentences whose + indices differ by at most this value. + relationship_strength : int + Default weight assigned to every inferred relationship when + ``use_tf_weight`` is ``False``. + use_tf_weight : bool + If ``True``, use TF-normalised weighting (LinearRAG-style) for + edge weights instead of the fixed ``relationship_strength``. + """ + + def __init__( + self, + llm_invoker: CompletionLLM, + language: str | None = "English", + entity_types: list[str] | None = None, + spacy_model: str = "en_core_web_sm", + max_sentence_distance: int = 1, + relationship_strength: int = 1, + use_tf_weight: bool = False, + ): + super().__init__(llm_invoker, language, entity_types) + self._spacy_model_name = spacy_model + self._max_sentence_distance = max_sentence_distance + self._relationship_strength = relationship_strength + self._use_tf_weight = use_tf_weight + # Eagerly load the model so import errors surface early. + self._nlp = _load_spacy_model(spacy_model) + + # ------------------------------------------------------------------ + # Public interface – called by ``Extractor.__call__`` + # ------------------------------------------------------------------ + + async def _process_single_content( + self, + chunk_key_dp: tuple[str, str], + chunk_seq: int, + num_chunks: int, + out_results, + task_id="", + ): + """Process one chunk through spaCy NER + keyword stacking + co-occurrence.""" + chunk_key = chunk_key_dp[0] + content = chunk_key_dp[1] + doc = self._nlp(content) + + # ── 1. Entity extraction (MGranRAG: ner_all_keywords) ──────── + # Build a mapping from keyword text → spaCy label (if available). + ner_label_map: dict[str, str] = get_ner(doc) + all_keywords = ner_all_keywords(doc) + + # For each keyword, determine its app-level entity type. + # - If the keyword matches a NER entity, use that label. + # - Otherwise, infer from POS heuristics. + ent_records: dict[str, dict] = {} # entity_name_upper → record + ent_by_sent: dict[int, list[dict]] = defaultdict(list) + + for kw in all_keywords: + kw_upper = kw.strip().upper() + if not kw_upper: + continue + + # Determine entity type. + spacy_label = ner_label_map.get(kw) + if spacy_label: + app_type = SPACY_TO_APP_ENTITY_TYPE.get(spacy_label, "category") + else: + app_type = self._infer_type_from_pos(doc, kw) + + if app_type not in self._entity_types_set: + continue + + # Determine which sentence this keyword belongs to. + sent_idx = self._keyword_sent_idx(doc, kw) + + # Description: use the containing sentence (LinearRAG semantic bridging). + #sent_text = self._keyword_sent_text(doc, kw) + + ent_record = dict( + entity_name=kw_upper, + entity_type=app_type.upper(), + description="", #sent_text or kw, + source_id=chunk_key, + ) + # A keyword may appear multiple times; keep the first. + if kw_upper not in ent_records: + ent_records[kw_upper] = ent_record + ent_by_sent[sent_idx].append(ent_record) + + maybe_nodes: dict[str, list[dict]] = defaultdict(list) + for name, rec in ent_records.items(): + maybe_nodes[name].append(rec) + + # ── 2. Relationship inference (LinearRAG: sentence co-occurrence) ─ + maybe_edges: dict[tuple, list[dict]] = defaultdict(list) + + # Pre-compute TF weights if needed (LinearRAG). + entity_tf: dict[str, float] = {} + if self._use_tf_weight: + total_count = sum( + content.upper().count(name) for name in ent_records + ) + for name in ent_records: + count = content.upper().count(name) + entity_tf[name] = count / total_count if total_count > 0 else 0.0 + + seen_pairs: set[tuple[str, str]] = set() + for si in sorted(ent_by_sent.keys()): + ents_in_range = list(ent_by_sent[si]) + # Expand with nearby sentences. + for offset in range(1, self._max_sentence_distance + 1): + for nb_si in (si + offset, si - offset): + if nb_si in ent_by_sent: + ents_in_range.extend(ent_by_sent[nb_si]) + # Deduplicate by entity name. + unique: dict[str, dict] = {} + for e in ents_in_range: + unique[e["entity_name"]] = e + ent_list = list(unique.values()) + + for a_idx in range(len(ent_list)): + for b_idx in range(a_idx + 1, len(ent_list)): + ea, eb = ent_list[a_idx], ent_list[b_idx] + pair = tuple(sorted([ea["entity_name"], eb["entity_name"]])) + if pair in seen_pairs: + continue + seen_pairs.add(pair) + + # Relationship description: shared sentence text + # (LinearRAG semantic bridging — the sentence is the + # semantic bridge between entities). + #desc = self._cooccurrence_description(doc, ea["entity_name"], eb["entity_name"]) + + # Edge weight: TF-normalised (LinearRAG) or fixed. + if self._use_tf_weight: + w = (entity_tf.get(ea["entity_name"], 0.0) + + entity_tf.get(eb["entity_name"], 0.0)) + weight = max(w, 0.01) + else: + weight = self._relationship_strength + + # Keywords for the edge: the two entity names. + edge_record = dict( + src_id=pair[0], + tgt_id=pair[1], + weight=weight, + description="", #desc, + keywords=[ea["entity_name"], eb["entity_name"]], + source_id=chunk_key, + ) + maybe_edges[pair].append(edge_record) + + token_count = len(doc) + out_results.append((dict(maybe_nodes), dict(maybe_edges), token_count)) + if self.callback: + self.callback( + 0.5 + 0.1 * len(out_results) / num_chunks, + msg=f"[spacy] Entities extraction of chunk {chunk_seq} " + f"{len(out_results)}/{num_chunks} done, " + f"{len(maybe_nodes)} nodes, {len(maybe_edges)} edges, " + f"{token_count} tokens.", + ) + + # ------------------------------------------------------------------ + # Helpers + # ------------------------------------------------------------------ + + @property + def _entity_types_set(self) -> set[str]: + return {t.lower() for t in self._entity_types} + + @staticmethod + def _infer_type_from_pos(doc, keyword: str) -> str: + """Infer an application-level entity type from POS tags when the + keyword was found by the stacking algorithm but not by NER.""" + kw_upper = keyword.upper() + for token in doc: + if token.text.upper() == kw_upper or token.text.upper().startswith(kw_upper.split()[0]): + if token.pos_ == "PROPN": + return "person" + if token.pos_ == "NOUN": + return "category" + if token.pos_ == "NUM": + return "event" + break + # Fallback: check for uppercase → likely a named entity. + if _has_uppercase(keyword): + return "person" + return "category" + + @staticmethod + def _keyword_sent_idx(doc, keyword: str) -> int: + """Return the sentence index that contains *keyword*.""" + kw_lower = keyword.lower() + for i, sent in enumerate(doc.sents): + if kw_lower in sent.text.lower(): + return i + return 0 + + @staticmethod + def _keyword_sent_text(doc, keyword: str) -> str | None: + """Return the sentence text containing *keyword* (LinearRAG semantic bridging).""" + kw_lower = keyword.lower() + for sent in doc.sents: + if kw_lower in sent.text.lower(): + return sent.text.strip() + return None + + @staticmethod + def _cooccurrence_description(doc, head_name: str, tail_name: str) -> str: + """Derive a relationship description using sentence co-occurrence + (LinearRAG) with dependency-path enhancement as fallback. + + If both entities appear in the same sentence, that sentence is + used as the description (semantic bridging). Otherwise, try to + find a lowest common ancestor in the dependency tree. As a last + resort, return a generic statement. + """ + head_lower = head_name.lower() + tail_lower = tail_name.lower() + + # Primary: shared sentence text (LinearRAG semantic bridging). + for sent in doc.sents: + sent_lower = sent.text.lower() + if head_lower in sent_lower and tail_lower in sent_lower: + return sent.text.strip() + + # Fallback: dependency path via LCA. + head_tok = GraphExtractor._find_token_by_text(doc, head_name) + tail_tok = GraphExtractor._find_token_by_text(doc, tail_name) + if head_tok is not None and tail_tok is not None: + path_head = list(GraphExtractor._ancestor_path(head_tok)) + path_tail = list(GraphExtractor._ancestor_path(tail_tok)) + lca = None + for h in path_head: + for t in path_tail: + if h == t: + lca = h + break + if lca is not None: + break + if lca is not None and lca is not head_tok and lca is not tail_tok: + return f"{head_name} is related to {tail_name} via '{lca.lemma_}'" + + # Final fallback: nearby sentences. + head_sent = GraphExtractor._find_sent_for_text(doc, head_lower) + if head_sent is not None: + return head_sent.text.strip() + + return f"{head_name} is related to {tail_name}" + + @staticmethod + def _find_token_by_text(doc, ent_name: str): + """Return the head token of the first spaCy entity matching *ent_name*.""" + target = ent_name.upper() + for ent in doc.ents: + if ent.text.strip().upper() == target: + return ent.root + # Fallback: token-level match for keywords not in doc.ents. + for token in doc: + if token.text.strip().upper() == target: + return token + return None + + @staticmethod + def _find_sent_for_text(doc, text_lower: str): + """Return the first ``Span`` whose text contains *text_lower*.""" + for sent in doc.sents: + if text_lower in sent.text.lower(): + return sent + return None + + @staticmethod + def _ancestor_path(token): + """Yield *token* then each ancestor up to the root.""" + yield token + for anc in token.ancestors: + yield anc diff --git a/test/testcases/test_http_api/test_dataset_management/test_create_dataset.py b/test/testcases/test_http_api/test_dataset_management/test_create_dataset.py index 5cada305fb..46b6e8891c 100644 --- a/test/testcases/test_http_api/test_dataset_management/test_create_dataset.py +++ b/test/testcases/test_http_api/test_dataset_management/test_create_dataset.py @@ -556,8 +556,8 @@ class TestDatasetCreate: ("graphrag_type_invalid", {"graphrag": {"use_graphrag": "string"}}, "Input should be a valid boolean"), ("graphrag_entity_types_not_list", {"graphrag": {"entity_types": "1,2"}}, "Input should be a valid list"), ("graphrag_entity_types_not_str_in_list", {"graphrag": {"entity_types": [1, 2]}}, "nput should be a valid string"), - ("graphrag_method_unknown", {"graphrag": {"method": "unknown"}}, "Input should be 'light' or 'general'"), - ("graphrag_method_none", {"graphrag": {"method": None}}, "Input should be 'light' or 'general'"), + ("graphrag_method_unknown", {"graphrag": {"method": "unknown"}}, "Input should be 'light', 'general' or 'ner'"), + ("graphrag_method_none", {"graphrag": {"method": None}}, "Input should be 'light', 'general' or 'ner'"), ("graphrag_community_type_invalid", {"graphrag": {"community": "string"}}, "Input should be a valid boolean"), ("graphrag_resolution_type_invalid", {"graphrag": {"resolution": "string"}}, "Input should be a valid boolean"), ("raptor_type_invalid", {"raptor": {"use_raptor": "string"}}, "Input should be a valid boolean"), diff --git a/test/testcases/test_http_api/test_dataset_management/test_update_dataset.py b/test/testcases/test_http_api/test_dataset_management/test_update_dataset.py index 0847a181c1..30d19d4ac0 100644 --- a/test/testcases/test_http_api/test_dataset_management/test_update_dataset.py +++ b/test/testcases/test_http_api/test_dataset_management/test_update_dataset.py @@ -686,8 +686,8 @@ class TestDatasetUpdate: ({"graphrag": {"use_graphrag": "string"}}, "Input should be a valid boolean"), ({"graphrag": {"entity_types": "1,2"}}, "Input should be a valid list"), ({"graphrag": {"entity_types": [1, 2]}}, "nput should be a valid string"), - ({"graphrag": {"method": "unknown"}}, "Input should be 'light' or 'general'"), - ({"graphrag": {"method": None}}, "Input should be 'light' or 'general'"), + ({"graphrag": {"method": "unknown"}}, "Input should be 'light', 'general' or 'ner'"), + ({"graphrag": {"method": None}}, "Input should be 'light', 'general' or 'ner'"), ({"graphrag": {"community": "string"}}, "Input should be a valid boolean"), ({"graphrag": {"resolution": "string"}}, "Input should be a valid boolean"), ({"raptor": {"use_raptor": "string"}}, "Input should be a valid boolean"), diff --git a/test/testcases/test_sdk_api/test_dataset_mangement/test_create_dataset.py b/test/testcases/test_sdk_api/test_dataset_mangement/test_create_dataset.py index 8f8f9bfeb6..92505aec5d 100644 --- a/test/testcases/test_sdk_api/test_dataset_mangement/test_create_dataset.py +++ b/test/testcases/test_sdk_api/test_dataset_mangement/test_create_dataset.py @@ -494,8 +494,8 @@ class TestDatasetCreate: ("graphrag_type_invalid", {"graphrag": {"use_graphrag": "string"}}, "Input should be a valid boolean"), ("graphrag_entity_types_not_list", {"graphrag": {"entity_types": "1,2"}}, "Input should be a valid list"), ("graphrag_entity_types_not_str_in_list", {"graphrag": {"entity_types": [1, 2]}}, "nput should be a valid string"), - ("graphrag_method_unknown", {"graphrag": {"method": "unknown"}}, "Input should be 'light' or 'general'"), - ("graphrag_method_none", {"graphrag": {"method": None}}, "Input should be 'light' or 'general'"), + ("graphrag_method_unknown", {"graphrag": {"method": "unknown"}}, "Input should be 'light', 'general' or 'ner'"), + ("graphrag_method_none", {"graphrag": {"method": None}}, "Input should be 'light', 'general' or 'ner'"), ("graphrag_community_type_invalid", {"graphrag": {"community": "string"}}, "Input should be a valid boolean"), ("graphrag_resolution_type_invalid", {"graphrag": {"resolution": "string"}}, "Input should be a valid boolean"), ("raptor_type_invalid", {"raptor": {"use_raptor": "string"}}, "Input should be a valid boolean"), diff --git a/test/testcases/test_sdk_api/test_dataset_mangement/test_update_dataset.py b/test/testcases/test_sdk_api/test_dataset_mangement/test_update_dataset.py index 6207e31db1..d32d8fd9b3 100644 --- a/test/testcases/test_sdk_api/test_dataset_mangement/test_update_dataset.py +++ b/test/testcases/test_sdk_api/test_dataset_mangement/test_update_dataset.py @@ -550,8 +550,8 @@ class TestDatasetUpdate: ({"graphrag": {"use_graphrag": "string"}}, "Input should be a valid boolean"), ({"graphrag": {"entity_types": "1,2"}}, "Input should be a valid list"), ({"graphrag": {"entity_types": [1, 2]}}, "nput should be a valid string"), - ({"graphrag": {"method": "unknown"}}, "Input should be 'light' or 'general'"), - ({"graphrag": {"method": None}}, "Input should be 'light' or 'general'"), + ({"graphrag": {"method": "unknown"}}, "Input should be 'light', 'general' or 'ner'"), + ({"graphrag": {"method": None}}, "Input should be 'light', 'general' or 'ner'"), ({"graphrag": {"community": "string"}}, "Input should be a valid boolean"), ({"graphrag": {"resolution": "string"}}, "Input should be a valid boolean"), ({"raptor": {"use_raptor": "string"}}, "Input should be a valid boolean"), diff --git a/uv.lock b/uv.lock index a70a37f4ae..44fe6fca92 100644 --- a/uv.lock +++ b/uv.lock @@ -889,6 +889,38 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" }, ] +[[package]] +name = "blis" +version = "1.3.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/d0/d0/d8cc8c9a4488a787e7fa430f6055e5bd1ddb22c340a751d9e901b82e2efe/blis-1.3.3.tar.gz", hash = "sha256:034d4560ff3cc43e8aa37e188451b0440e3261d989bb8a42ceee865607715ecd" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/16/d1/429cf0cf693d4c7dc2efed969bd474e315aab636e4a95f66c4ed7264912d/blis-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a1c74e100665f8e918ebdbae2794576adf1f691680b5cdb8b29578432f623ef" }, + { url = "https://mirrors.aliyun.com/pypi/packages/11/69/363c8df8d98b3cc97be19aad6aabb2c9c53f372490d79316bdee92d476e7/blis-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3f6c595185176ce021316263e1a1d636a3425b6c48366c1fd712d08d0b71849a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/96/2a/fbf65d906d823d839076c5150a6f8eb5ecbc5f9135e0b6510609bda1e6b7/blis-1.3.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d734b19fba0be7944f272dfa7b443b37c61f9476d9ab054a9ac53555ceadd2e0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d5/ad/58deaa3ad856dd3cc96493e40ffd2ed043d18d4d304f85a65cde1ccbf644/blis-1.3.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ef6d6e2b599a3a2788eb6d9b443533961265aa4ec49d574ed4bb846e548dcdb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/78/82/816a7adfe1f7acc8151f01ec86ef64467a3c833932d8f19f8e06613b8a4e/blis-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8c888438ae99c500422d50698e3028b65caa8ebb44e24204d87fda2df64058f7" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1e/e2/0e93b865f648b5519360846669a35f28ee8f4e1d93d054f6850d8afbabde/blis-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8177879fd3590b5eecdd377f9deafb5dc8af6d684f065bd01553302fb3fcf9a7" }, + { url = "https://mirrors.aliyun.com/pypi/packages/20/07/fb43edc2ff0a6a367e4a94fc39eb3b85aa1e55e24cc857af2db145ce9f0d/blis-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f20f7ad69aaffd1ce14fe77de557b6df9b61e0c9e582f75a843715d836b5c8af" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e6/f7/d26e62d9be3d70473a63e0a5d30bae49c2fe138bebac224adddcdef8a7ce/blis-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1e647341f958421a86b028a2efe16ce19c67dba2a05f79e8f7e80b1ff45328aa" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4a/78/750d12da388f714958eb2f2fd177652323bbe7ec528365c37129edd6eb84/blis-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d563160f874abb78a57e346f07312c5323f7ad67b6370052b6b17087ef234a8e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e8/36/eac4199c5b200a5f3e93cad197da8d26d909f218eb444c4f552647c95240/blis-1.3.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:30b8a5b90cb6cb81d1ada9ae05aa55fb8e70d9a0ae9db40d2401bb9c1c8f14c4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bf/51/472e7b36a6bedb5242a9757e7486f702c3619eff76e256735d0c8b1679c6/blis-1.3.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e9f5c53b277f6ac5b3ca30bc12ebab7ea16c8f8c36b14428abb56924213dc127" }, + { url = "https://mirrors.aliyun.com/pypi/packages/84/da/d0dfb6d6e6321ae44df0321384c32c322bd07b15740d7422727a1a49fc5d/blis-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6297e7616c158b305c9a8a4e47ca5fc9b0785194dd96c903b1a1591a7ca21ddf" }, + { url = "https://mirrors.aliyun.com/pypi/packages/20/c5/2b0b5e556fa0364ed671051ea078a6d6d7b979b1cfef78d64ad3ca5f0c7f/blis-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3f966ca74f89f8a33e568b9a1d71992fc9a0d29a423e047f0a212643e21b5458" }, + { url = "https://mirrors.aliyun.com/pypi/packages/31/07/4cdc81a47bf862c0b06d91f1bc6782064e8b69ac9b5d4ff51d97e4ff03da/blis-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:7a0fc4b237a3a453bdc3c7ab48d91439fcd2d013b665c46948d9eaf9c3e45a97" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5f/8a/80f7c68fbc24a76fc9c18522c46d6d69329c320abb18e26a707a5d874083/blis-1.3.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c3e33cfbf22a418373766816343fcfcd0556012aa3ffdf562c29cddec448a415" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e5/52/d1aa3a51a7fc299b0c89dcaa971922714f50b1202769eebbdaadd1b5cff7/blis-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6f165930e8d3a85c606d2003211497e28d528c7416fbfeafb6b15600963f7c9b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/99/4f/badc7bd7f74861b26c10123bba7b9d16f99cd9535ad0128780360713820f/blis-1.3.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:878d4d96d8f2c7a2459024f013f2e4e5f46d708b23437dae970d998e7bff14a0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/72/a6/f62a3bd814ca19ec7e29ac889fd354adea1217df3183e10217de51e2eb8b/blis-1.3.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f36c0ca84a05ee5d3dbaa38056c4423c1fc29948b17a7923dd2fed8967375d74" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d4/6c/671af79ee42bc4c968cae35c091ac89e8721c795bfa4639100670dc59139/blis-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e5a662c48cd4aad5dae1a950345df23957524f071315837a4c6feb7d3b288990" }, + { url = "https://mirrors.aliyun.com/pypi/packages/be/92/7cd7f8490da7c98ee01557f2105885cc597217b0e7fd2eeb9e22cdd4ef23/blis-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9de26fbd72bac900c273b76d46f0b45b77a28eace2e01f6ac6c2239531a413bb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0a/de/acae8e9f9a1f4bb393d41c8265898b0f29772e38eac14e9f69d191e2c006/blis-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:9e5fdf4211b1972400f8ff6dafe87cb689c5d84f046b4a76b207c0bd2270faaf" }, +] + [[package]] name = "boto3" version = "1.42.74" @@ -998,6 +1030,15 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/da/ff/3f0982ecd37c2d6a7266c22e7ea2e47d0773fe449984184c5316459d2776/captcha-0.7.1-py3-none-any.whl", hash = "sha256:8b73b5aba841ad1e5bdb856205bf5f09560b728ee890eb9dae42901219c8c599" }, ] +[[package]] +name = "catalogue" +version = "2.0.10" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/38/b4/244d58127e1cdf04cf2dc7d9566f0d24ef01d5ce21811bab088ecc62b5ea/catalogue-2.0.10.tar.gz", hash = "sha256:4f56daa940913d3f09d589c191c74e5a6d51762b3a9e37dd53b7437afd6cda15" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/9e/96/d32b941a501ab566a16358d68b6eb4e4acc373fab3c3c4d7d9e649f7b4bb/catalogue-2.0.10-py3-none-any.whl", hash = "sha256:58c2de0020aa90f4a2da7dfad161bf7b3b054c86a5f09fcedc0b2b740c109a9f" }, +] + [[package]] name = "cattrs" version = "22.2.0" @@ -1218,6 +1259,15 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/ae/5a/4f025bc751087833686892e17e7564828e409c43b632878afeae554870cd/click_log-0.4.0-py2.py3-none-any.whl", hash = "sha256:a43e394b528d52112af599f2fc9e4b7cf3c15f94e53581f74fa6867e68c91756" }, ] +[[package]] +name = "cloudpathlib" +version = "0.24.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/06/19/58bc6b5d7d0f81c7209b05445af477e147c486552f96665a5912211839b9/cloudpathlib-0.24.0.tar.gz", hash = "sha256:c521a984e77b47e656fe78e20a7e3e260e0ab45fc69e33ac01094227c979e34a" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/c2/5b/ba933f896d9b0b07608d575a8501e2b4e32166b60d84c430a4a7285ebe64/cloudpathlib-0.24.0-py3-none-any.whl", hash = "sha256:b1c51e2d2ec7dc4fed6538991f4aea849d6cf11a7e6b9069f86e461aa1f9b5b4" }, +] + [[package]] name = "cn2an" version = "0.5.22" @@ -1313,6 +1363,15 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/07/1d/62f5bf92e12335eb63517f42671ed78512d48bbc69e02a942dd7b90f03f0/compressed_rtf-1.0.7-py3-none-any.whl", hash = "sha256:b7904921d78c67a0a4b7fff9fb361a00ae2b447b6edca010ce321cd98fa0fcc0" }, ] +[[package]] +name = "confection" +version = "1.3.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ca/65/efd0fe8a936fc8ca2978cb7b82581fb20d901c6039e746a808f746b7647b/confection-1.3.3.tar.gz", hash = "sha256:f0f6810d567ff73993fe74d218ca5e1ffb6a44fb03f391257fc5d033546cbfaa" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/8d/e4/d66708bdf0d92fb4d49b22cdff4b10cec38aca5dcd7e81d909bb55c65cd7/confection-1.3.3-py3-none-any.whl", hash = "sha256:b9fef9ee84b237ef4611ec3eb5797b70e13063e6310ad9f15536373f5e313c82" }, +] + [[package]] name = "contourpy" version = "1.3.3" @@ -1710,6 +1769,54 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30" }, ] +[[package]] +name = "cymem" +version = "2.0.13" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/c0/8f/2f0fbb32535c3731b7c2974c569fb9325e0a38ed5565a08e1139a3b71e82/cymem-2.0.13.tar.gz", hash = "sha256:1c91a92ae8c7104275ac26bd4d29b08ccd3e7faff5893d3858cb6fadf1bc1588" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/c9/52/478a2911ab5028cb710b4900d64aceba6f4f882fcb13fd8d40a456a1b6dc/cymem-2.0.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8afbc5162a0fe14b6463e1c4e45248a1b2fe2cbcecc8a5b9e511117080da0eb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f9/71/f0f8adee945524774b16af326bd314a14a478ed369a728a22834e6785a18/cymem-2.0.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9251d889348fe79a75e9b3e4d1b5fa651fca8a64500820685d73a3acc21b6a8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/62/6d/159780fe162ff715d62b809246e5fc20901cef87ca28b67d255a8d741861/cymem-2.0.13-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:742fc19764467a49ed22e56a4d2134c262d73a6c635409584ae3bf9afa092c33" }, + { url = "https://mirrors.aliyun.com/pypi/packages/eb/12/678d16f7aa1996f947bf17b8cfb917ea9c9674ef5e2bd3690c04123d5680/cymem-2.0.13-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f190a92fe46197ee64d32560eb121c2809bb843341733227f51538ce77b3410d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/31/5d/0dd8c167c08cd85e70d274b7235cfe1e31b3cebc99221178eaf4bbb95c6f/cymem-2.0.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d670329ee8dbbbf241b7c08069fe3f1d3a1a3e2d69c7d05ea008a7010d826298" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b7/c9/d6514a412a1160aa65db539836b3d47f9b59f6675f294ec34ae32f867c82/cymem-2.0.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a84ba3178d9128b9ffb52ce81ebab456e9fe959125b51109f5b73ebdfc6b60d6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/dd/fe/3ee37d02ca4040f2fb22d34eb415198f955862b5dd47eee01df4c8f5454c/cymem-2.0.13-cp312-cp312-win_amd64.whl", hash = "sha256:2ff1c41fd59b789579fdace78aa587c5fc091991fa59458c382b116fc36e30dc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/94/fb/1b681635bfd5f2274d0caa8f934b58435db6c091b97f5593738065ddb786/cymem-2.0.13-cp312-cp312-win_arm64.whl", hash = "sha256:6bbd701338df7bf408648191dff52472a9b334f71bcd31a21a41d83821050f67" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ce/0f/95a4d1e3bebfdfa7829252369357cf9a764f67569328cd9221f21e2c952e/cymem-2.0.13-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:891fd9030293a8b652dc7fb9fdc79a910a6c76fc679cd775e6741b819ffea476" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bf/a0/8fc929cc29ae466b7b4efc23ece99cbd3ea34992ccff319089c624d667fd/cymem-2.0.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:89c4889bd16513ce1644ccfe1e7c473ba7ca150f0621e66feac3a571bde09e7e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4a/b3/deeb01354ebaf384438083ffe0310209ef903db3e7ba5a8f584b06d28387/cymem-2.0.13-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:45dcaba0f48bef9cc3d8b0b92058640244a95a9f12542210b51318da97c2cf28" }, + { url = "https://mirrors.aliyun.com/pypi/packages/36/36/bc980b9a14409f3356309c45a8d88d58797d02002a9d794dd6c84e809d3a/cymem-2.0.13-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e96848faaafccc0abd631f1c5fb194eac0caee4f5a8777fdbb3e349d3a21741c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/fd/dd/a12522952624685bd0f8968e26d2ed6d059c967413ce6eb52292f538f1b0/cymem-2.0.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e02d3e2c3bfeb21185d5a4a70790d9df40629a87d8d7617dc22b4e864f665fa3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/08/11/5dc933ddfeb2dfea747a0b935cb965b9a7580b324d96fc5f5a1b5ff8df29/cymem-2.0.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fece5229fd5ecdcd7a0738affb8c59890e13073ae5626544e13825f26c019d3c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/70/66/d23b06166864fa94e13a98e5922986ce774832936473578febce64448d75/cymem-2.0.13-cp313-cp313-win_amd64.whl", hash = "sha256:38aefeb269597c1a0c2ddf1567dd8605489b661fa0369c6406c1acd433b4c7ba" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2f/9e/c7b21271ab88a21760f3afdec84d2bc09ffa9e6c8d774ad9d4f1afab0416/cymem-2.0.13-cp313-cp313-win_arm64.whl", hash = "sha256:717270dcfd8c8096b479c42708b151002ff98e434a7b6f1f916387a6c791e2ad" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7f/28/d3b03427edc04ae04910edf1c24b993881c3ba93a9729a42bcbb816a1808/cymem-2.0.13-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7e1a863a7f144ffb345397813701509cfc74fc9ed360a4d92799805b4b865dd1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/35/a9/7ed53e481f47ebfb922b0b42e980cec83e98ccb2137dc597ea156642440c/cymem-2.0.13-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c16cb80efc017b054f78998c6b4b013cef509c7b3d802707ce1f85a1d68361bf" }, + { url = "https://mirrors.aliyun.com/pypi/packages/61/39/a3d6ad073cf7f0fbbb8bbf09698c3c8fac11be3f791d710239a4e8dd3438/cymem-2.0.13-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d78a27c88b26c89bd1ece247d1d5939dba05a1dae6305aad8fd8056b17ddb51" }, + { url = "https://mirrors.aliyun.com/pypi/packages/36/0c/20697c8bc19f624a595833e566f37d7bcb9167b0ce69de896eba7cfc9c2d/cymem-2.0.13-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6d36710760f817194dacb09d9fc45cb6a5062ed75e85f0ef7ad7aeeb13d80cc3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/82/d4/9326e3422d1c2d2b4a8fb859bdcce80138f6ab721ddafa4cba328a505c71/cymem-2.0.13-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c8f30971cadd5dcf73bcfbbc5849b1f1e1f40db8cd846c4aa7d3b5e035c7b583" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ed/bc/68da7dd749b72884dc22e898562f335002d70306069d496376e5ff3b6153/cymem-2.0.13-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9d441d0e45798ec1fd330373bf7ffa6b795f229275f64016b6a193e6e2a51522" }, + { url = "https://mirrors.aliyun.com/pypi/packages/50/23/dbf2ad6ecd19b99b3aab6203b1a06608bbd04a09c522d836b854f2f30f73/cymem-2.0.13-cp313-cp313t-win_amd64.whl", hash = "sha256:d1c950eebb9f0f15e3ef3591313482a5a611d16fc12d545e2018cd607f40f472" }, + { url = "https://mirrors.aliyun.com/pypi/packages/54/3f/35701c13e1fc7b0895198c8b20068c569a841e0daf8e0b14d1dc0816b28f/cymem-2.0.13-cp313-cp313t-win_arm64.whl", hash = "sha256:042e8611ef862c34a97b13241f5d0da86d58aca3cecc45c533496678e75c5a1f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a7/2e/f0e1596010a9a57fa9ebd124a678c07c5b2092283781ae51e79edcf5cb98/cymem-2.0.13-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d2a4bf67db76c7b6afc33de44fb1c318207c3224a30da02c70901936b5aafdf1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bc/45/8ccc21df08fcbfa6aa3efeb7efc11a1c81c90e7476e255768bb9c29ba02a/cymem-2.0.13-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:92a2ce50afa5625fb5ce7c9302cee61e23a57ccac52cd0410b4858e572f8614b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/01/8c/fe16531631f051d3d1226fa42e2d76fd2c8d5cfa893ec93baee90c7a9d90/cymem-2.0.13-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bc116a70cc3a5dc3d1684db5268eff9399a0be8603980005e5b889564f1ea42f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/47/4b/39d67b80ffb260457c05fcc545de37d82e9e2dbafc93dd6b64f17e09b933/cymem-2.0.13-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:68489bf0035c4c280614067ab6a82815b01dc9fcd486742a5306fe9f68deb7ef" }, + { url = "https://mirrors.aliyun.com/pypi/packages/53/0e/76f6531f74dfdfe7107899cce93ab063bb7ee086ccd3910522b31f623c08/cymem-2.0.13-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:03cb7bdb55718d5eb6ef0340b1d2430ba1386db30d33e9134d01ba9d6d34d705" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c7/7c/eee56757db81f0aefc2615267677ae145aff74228f529838425057003c0d/cymem-2.0.13-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1710390e7fb2510a8091a1991024d8ae838fd06b02cdfdcd35f006192e3c6b0e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/77/e0/a4b58ec9e53c836dce07ef39837a64a599f4a21a134fc7ca57a3a8f9a4b5/cymem-2.0.13-cp314-cp314-win_amd64.whl", hash = "sha256:ac699c8ec72a3a9de8109bd78821ab22f60b14cf2abccd970b5ff310e14158ed" }, + { url = "https://mirrors.aliyun.com/pypi/packages/61/81/9931d1f83e5aeba175440af0b28f0c2e6f71274a5a7b688bc3e907669388/cymem-2.0.13-cp314-cp314-win_arm64.whl", hash = "sha256:90c2d0c04bcda12cd5cebe9be93ce3af6742ad8da96e1b1907e3f8e00291def1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b7/ef/af447c2184dec6dec973be14614df8ccb4d16d1c74e0784ab4f02538433c/cymem-2.0.13-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ff036bbc1464993552fd1251b0a83fe102af334b301e3896d7aa05a4999ad042" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8c/95/e10f33a8d4fc17f9b933d451038218437f9326c2abb15a3e7f58ce2a06ec/cymem-2.0.13-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fb8291691ba7ff4e6e000224cc97a744a8d9588418535c9454fd8436911df612" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e7/7a/5efeb2d2ea6ebad2745301ad33a4fa9a8f9a33b66623ee4d9185683007a6/cymem-2.0.13-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d8d06ea59006b1251ad5794bcc00121e148434826090ead0073c7b7fedebe431" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0b/28/2a3f65842cc8443c2c0650cf23d525be06c8761ab212e0a095a88627be1b/cymem-2.0.13-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0046a619ecc845ccb4528b37b63426a0cbcb4f14d7940add3391f59f13701e6" }, + { url = "https://mirrors.aliyun.com/pypi/packages/98/73/dd5f9729398f0108c2e71d942253d0d484d299d08b02e474d7cfc43ed0b0/cymem-2.0.13-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:18ad5b116a82fa3674bc8838bd3792891b428971e2123ae8c0fd3ca472157c5e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5a/01/ffe51729a8f961a437920560659073e47f575d4627445216c1177ecd4a41/cymem-2.0.13-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:666ce6146bc61b9318aa70d91ce33f126b6344a25cf0b925621baed0c161e9cc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/fd/ac/c9e7d68607f71ef978c81e334ab2898b426944c71950212b1467186f69f9/cymem-2.0.13-cp314-cp314t-win_amd64.whl", hash = "sha256:84c1168c563d9d1e04546cb65e3e54fde2bf814f7c7faf11fc06436598e386d1" }, + { url = "https://mirrors.aliyun.com/pypi/packages/66/66/150e406a2db5535533aa3c946de58f0371f2e412e23f050c704588023e6e/cymem-2.0.13-cp314-cp314t-win_arm64.whl", hash = "sha256:e9027764dc5f1999fb4b4cabee1d0322c59e330c0a6485b436a68275f614277f" }, +] + [[package]] name = "darabonba-core" version = "1.0.5" @@ -1965,6 +2072,14 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/6b/ee/4699000ef357e476a3984fd1eff236f820e3346c4aef7c7772e580b81b31/elasticsearch_dsl-8.12.0-py3-none-any.whl", hash = "sha256:2ea9e6ded64d21a8f1ef72477a4d116c6fbeea631ac32a2e2490b9c0d09a99a6" }, ] +[[package]] +name = "en-core-web-sm" +version = "3.8.0" +source = { url = "https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl" } +wheels = [ + { url = "https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl", hash = "sha256:1932429db727d4bff3deed6b34cfc05df17794f4a52eeb26cf8928f7c1a0fb85" }, +] + [[package]] name = "et-xmlfile" version = "2.0.0" @@ -4376,6 +4491,54 @@ version = "0.0.12" source = { registry = "https://mirrors.aliyun.com/pypi/simple" } sdist = { url = "https://mirrors.aliyun.com/pypi/packages/17/0d/74f0293dfd7dcc3837746d0138cbedd60b31701ecc75caec7d3f281feba0/multitasking-0.0.12.tar.gz", hash = "sha256:2fba2fa8ed8c4b85e227c5dd7dc41c7d658de3b6f247927316175a57349b84d1" } +[[package]] +name = "murmurhash" +version = "1.0.15" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/23/2e/88c147931ea9725d634840d538622e94122bceaf346233349b7b5c62964b/murmurhash-1.0.15.tar.gz", hash = "sha256:58e2b27b7847f9e2a6edf10b47a8c8dd70a4705f45dccb7bf76aeadacf56ba01" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/b6/46/be8522d3456fdccf1b8b049c6d82e7a3c1114c4fc2cfe14b04cba4b3e701/murmurhash-1.0.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d37e3ae44746bca80b1a917c2ea625cf216913564ed43f69d2888e5df97db0cb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ed/cc/630449bf4f6178d7daf948ce46ad00b25d279065fc30abd8d706be3d87e0/murmurhash-1.0.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0861cb11039409eaf46878456b7d985ef17b6b484103a6fc367b2ecec846891d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ff/30/ea8f601a9bf44db99468696efd59eb9cff1157cd55cb586d67116697583f/murmurhash-1.0.15-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5a301decfaccfec70fe55cb01dde2a012c3014a874542eaa7cc73477bb749616" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c9/de/c40ce8c0877d406691e735b8d6e9c815f36a82b499d358313db5dbe219d7/murmurhash-1.0.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:32c6fde7bd7e9407003370a07b5f4addacabe1556ad3dc2cac246b7a2bba3400" }, + { url = "https://mirrors.aliyun.com/pypi/packages/47/84/bd49963ecd84ebab2fe66595e2d1ed41d5e8b5153af5dc930f0bd827007c/murmurhash-1.0.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d8b43a7011540dc3c7ce66f2134df9732e2bc3bbb4a35f6458bc755e48bde26" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4f/7c/2530769c545074417c862583f05f4245644599f1e9ff619b3dfe2969aafc/murmurhash-1.0.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:43bf4541892ecd95963fcd307bf1c575fc0fee1682f41c93007adee71ca2bb40" }, + { url = "https://mirrors.aliyun.com/pypi/packages/84/a4/b249b042f5afe34d14ada2dc4afc777e883c15863296756179652e081c44/murmurhash-1.0.15-cp312-cp312-win_amd64.whl", hash = "sha256:f4ac15a2089dc42e6eb0966622d42d2521590a12c92480aafecf34c085302cca" }, + { url = "https://mirrors.aliyun.com/pypi/packages/13/bf/028179259aebc18fd4ba5cae2601d1d47517427a537ab44336446431a215/murmurhash-1.0.15-cp312-cp312-win_arm64.whl", hash = "sha256:4a70ca4ae19e600d9be3da64d00710e79dde388a4d162f22078d64844d0ebdda" }, + { url = "https://mirrors.aliyun.com/pypi/packages/29/2f/ba300b5f04dae0409202d6285668b8a9d3ade43a846abee3ef611cb388d5/murmurhash-1.0.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fe50dc70e52786759358fd1471e309b94dddfffb9320d9dfea233c7684c894ba" }, + { url = "https://mirrors.aliyun.com/pypi/packages/34/02/29c19d268e6f4ea1ed2a462c901eed1ed35b454e2cbc57da592fad663ac6/murmurhash-1.0.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1349a7c23f6092e7998ddc5bd28546cc31a595afc61e9fdb3afc423feec3d7ad" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e2/63/58e2de2b5232cd294c64092688c422196e74f9fa8b3958bdf02d33df24b9/murmurhash-1.0.15-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3ba6d05de2613535b5a9227d4ad8ef40a540465f64660d4a8800634ae10e04f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/aa/9a/d13e2e9f8ba1ced06840921a50f7cece0a475453284158a3018b72679761/murmurhash-1.0.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fa1b70b3cc2801ab44179c65827bbd12009c68b34e9d9ce7125b6a0bd35af63c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b2/e1/47994f1813fa205c84977b0ff51ae6709f8539af052c7491a5f863d82bdc/murmurhash-1.0.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:213d710fb6f4ef3bc11abbfad0fa94a75ffb675b7dc158c123471e5de869f9af" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b9/ea/90c1fd00b4aeb704fb5e84cd666b33ffd7f245155048071ffbb51d2bb57d/murmurhash-1.0.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b65a5c4e7f5d71f7ccac2d2b60bdf7092d7976270878cfec59d5a66a533db823" }, + { url = "https://mirrors.aliyun.com/pypi/packages/00/db/da73462dbfa77f6433b128d2120ba7ba300f8c06dc4f4e022c38d240a5f5/murmurhash-1.0.15-cp313-cp313-win_amd64.whl", hash = "sha256:9aba94c5d841e1904cd110e94ceb7f49cfb60a874bbfb27e0373622998fb7c7c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bb/83/032729ef14971b938fbef41ee125fc8800020ee229bd35178b6ede8ee934/murmurhash-1.0.15-cp313-cp313-win_arm64.whl", hash = "sha256:263807eca40d08c7b702413e45cca75ecb5883aa337237dc5addb660f1483378" }, + { url = "https://mirrors.aliyun.com/pypi/packages/10/83/7547d9205e9bd2f8e5dfd0b682cc9277594f98909f228eb359489baec1df/murmurhash-1.0.15-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:694fd42a74b7ce257169d14c24aa616aa6cd4ccf8abe50eca0557e08da99d055" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b7/c7/3afd5de7a5b3ae07fe2d3a3271b327ee1489c58ba2b2f2159bd31a25edb9/murmurhash-1.0.15-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a2ea4546ba426390beff3cd10db8f0152fdc9072c4f2583ec7d8aa9f3e4ac070" }, + { url = "https://mirrors.aliyun.com/pypi/packages/02/69/d6637ee67d78ebb2538c00411f28ea5c154886bbe1db16c49435a8a4ab16/murmurhash-1.0.15-cp313-cp313t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:34e5a91139c40b10f98d0b297907f5d5267b4b1b2e5dd2eb74a021824f751b98" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ab/4c/89e590165b4c7da6bf941441212a721a270195332d3aacfdfdf527d466ca/murmurhash-1.0.15-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:dc35606868a5961cf42e79314ca0bddf5a400ce377b14d83192057928d6252ec" }, + { url = "https://mirrors.aliyun.com/pypi/packages/07/7a/95c42df0c21d2e413b9fcd17317a7587351daeb264dc29c6aec1fdbd26f8/murmurhash-1.0.15-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:43cc6ac3b91ca0f7a5ae9c063ba4d6c26972c97fd7c25280ecc666413e4c5535" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d0/22/9d02c880a88b83bb3ce7d6a38fb727373ab78d82e5f3d8d9fc5612219f90/murmurhash-1.0.15-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:847d712136cb462f0e4bd6229ee2d9eb996d8854eb8312dff3d20c8f5181fda5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9a/e3/750232524e0dc262e8dcede6536dafc766faadd9a52f1d23746b02948ad8/murmurhash-1.0.15-cp313-cp313t-win_amd64.whl", hash = "sha256:2680851af6901dbe66cc4aa7ef8e263de47e6e1b425ae324caa571bdf18f8d58" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ff/89/4ad9d215ef6ade89f27a72dc4e86b98ef1a43534cc3e6a6900a362a0bf0a/murmurhash-1.0.15-cp313-cp313t-win_arm64.whl", hash = "sha256:189a8de4d657b5da9efd66601b0636330b08262b3a55431f2379097c986995d0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1c/69/726df275edf07688146966e15eaaa23168100b933a2e1a29b37eb56c6db8/murmurhash-1.0.15-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7c4280136b738e85ff76b4bdc4341d0b867ee753e73fd8b6994288080c040d0b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/59/8f/24ecf9061bc2b20933df8aba47c73e904274ea8811c8300cab92f6f82372/murmurhash-1.0.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d4d681f474830489e2ec1d912095cfff027fbaf2baa5414c7e9d25b89f0fab68" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ba/26/fff3caba25aa3c0622114e03c69fb66c839b22335b04d7cce91a3a126d44/murmurhash-1.0.15-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d7e47c5746785db6a43b65fac47b9e63dd71dfbd89a8c92693425b9715e68c6e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/df/e4/0f2b9fc533467a27afb4e906c33f32d5f637477de87dd94690e0c44335a6/murmurhash-1.0.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e8e674f02a99828c8a671ba99cd03299381b2f0744e6f25c29cadfc6151dc724" }, + { url = "https://mirrors.aliyun.com/pypi/packages/da/bf/9d1c107989728ec46e25773d503aa54070b32822a18cfa7f9d5f41bc17a5/murmurhash-1.0.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:26fd7c7855ac4850ad8737991d7b0e3e501df93ebaf0cf45aa5954303085fdba" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0d/81/dcf27c71445c0e993b10e33169a098ca60ee702c5c58fcbde205fa6332a6/murmurhash-1.0.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cb8ebafae60d5f892acff533cc599a359954d8c016a829514cb3f6e9ee10f322" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bc/32/e874a14b2d2246bd2d16f80f49fad393a3865d4ee7d66d2cae939a67a29a/murmurhash-1.0.15-cp314-cp314-win_amd64.whl", hash = "sha256:898a629bf111f1aeba4437e533b5b836c0a9d2dd12d6880a9c75f6ca13e30e22" }, + { url = "https://mirrors.aliyun.com/pypi/packages/af/8e/4fca051ed8ae4d23a15aaf0a82b18cb368e8cf84f1e3b474d5749ec46069/murmurhash-1.0.15-cp314-cp314-win_arm64.whl", hash = "sha256:88dc1dd53b7b37c0df1b8b6bce190c12763014492f0269ff7620dc6027f470f4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/38/9c/c72c2a4edd86aac829337ab9f83cf04cdb15e5d503e4c9a3a243f30a261c/murmurhash-1.0.15-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:6cb4e962ec4f928b30c271b2d84e6707eff6d942552765b663743cfa618b294b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ac/d7/72b47ebc86436cd0aa1fd4c6e8779521ec389397ac11389990278d0f7a47/murmurhash-1.0.15-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5678a3ea4fbf0cbaaca2bed9b445f556f294d5f799c67185d05ffcb221a77faf" }, + { url = "https://mirrors.aliyun.com/pypi/packages/64/bb/6d2f09135079c34dc2d26e961c52742d558b320c61503f273eab6ba743d9/murmurhash-1.0.15-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ef19f38c6b858eef83caf710773db98c8f7eb2193b4c324650c74f3d8ba299e0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b9/e2/9c1b462e33f9cb2d632056f07c90b502fc20bd7da50a15d0557343bd2fed/murmurhash-1.0.15-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22aa3ceaedd2e57078b491ed08852d512b84ff4ff9bb2ff3f9bf0eec7f214c9e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e8/73/8694db1408fcdfa73589f7df6c445437ea146986fa1e393ec60d26d6e30c/murmurhash-1.0.15-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bba0e0262c0d08682b028cb963ac477bd9839029486fa1333fc5c01fb6072749" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2d/f9/8e360bdfc3c44e267e7e046f0e0b9922766da92da26959a6963f597e6bb5/murmurhash-1.0.15-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4fd8189ee293a09f30f4931408f40c28ccd42d9de4f66595f8814879339378bc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f9/31/97649680595b1096803d877ababb9a67c07f4378f177ec885eea28b9db6d/murmurhash-1.0.15-cp314-cp314t-win_amd64.whl", hash = "sha256:66395b1388f7daa5103db92debe06842ae3be4c0749ef6db68b444518666cdcc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/76/66/4fce8755f25d77324401886c00017c556be7ca3039575b94037aff905385/murmurhash-1.0.15-cp314-cp314t-win_arm64.whl", hash = "sha256:c22e56c6a0b70598a66e456de5272f76088bc623688da84ef403148a6d41851d" }, +] + [[package]] name = "mygene" version = "3.2.2" @@ -5313,6 +5476,50 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/f7/b1/8ca34418e7c4a2ec666e2204539577287223c4e78ab80b1c746cedb559c3/pot-0.9.6.post1-cp313-cp313-win_amd64.whl", hash = "sha256:a43e2b61389bd32f5b488da2488999ed55867e95fedb25dd64f9f390e40b4fab" }, ] +[[package]] +name = "preshed" +version = "3.0.13" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +dependencies = [ + { name = "cymem" }, + { name = "murmurhash" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/43/75/fe6b7bbd0dea530a001b0e24c331b21a0be2786e402abf3c57f5dce43d4b/preshed-3.0.13.tar.gz", hash = "sha256:d75f718bbfd97e992f7827e0fa7faf6a91bdd9c922d5baa4b50d62731396cb89" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/39/fb/ccff23c44c04088c248539005fcda78b9014512a34d170c5360f02ad908b/preshed-3.0.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5d14eea14bd01291388928991d7df7d60b9fd19ae970e55006eb4d29b0c1e8eb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8e/ce/cad5a8145881a771e6c0d002f2e585fc19b962f120860b54d32af5baa342/preshed-3.0.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f05b08ce92399c0655b5e0eb5a1cc1f9e295703ed3aabdfaf6538dfa8ae23d57" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a7/a2/c5fed4fb3e946699259d11e4036a3cfdd8c89b3e542e3077d46781642425/preshed-3.0.13-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:62cf7f3113132891d6bba70ff547ad81c6fe50a31930bbbb8499f1d47cd122b7" }, + { url = "https://mirrors.aliyun.com/pypi/packages/51/94/8c9bc48a6ea4903f53a1a0031ce8e35687526949f25821762ef21493c007/preshed-3.0.13-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8b8de3f58043070a354477995acdd98626ce43e4193c708ebd0f694e467f5155" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b6/df/ecd2f40055ff52527ca117ffbfafb888c1a3079b59fbabe03c5b8f9b7240/preshed-3.0.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:183b339956a9e1d7a4a00038a3b9587a734db9e8bd915939a49791bd1b372156" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e6/88/bdb244e40284ded3632a9f88c23bc80230bd7b2ae4a8b7f2cc91adead7a8/preshed-3.0.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e77bed56aded7cbe5d28d6bd2178bc5b13eda0e0e464dab205fb578fa915000" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a0/c9/c91ea56342e6c364fc69b444a1ac5432327857199c44032c9cc9dc4c3a23/preshed-3.0.13-cp312-cp312-win_amd64.whl", hash = "sha256:04d8f13f2986e5d11af5ac51f55ce3106c70c41b483d20ea392e6180bdd0f870" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b2/0b/6a99d99619fd83b14c696e2489caed7070647488d4d3ac0b723d35db2de0/preshed-3.0.13-cp312-cp312-win_arm64.whl", hash = "sha256:19318dc1cd8cac6663c6c830bf7e0002d2de853769fb03e056774e97c21bedfd" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0e/2a/401158195d6dc7f6aef0b354d74d0e95c9da124499448c2b3dbb95b71204/preshed-3.0.13-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0d0c14187dc0078d8a63bf190ec045a4d13e7748b6caeb557a7d575e411410b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/88/8f/e20e64573988528785447a6893b2e7ab287ecfd85b3888e978b28812fd20/preshed-3.0.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7770987c2e57497cd26124a9be5f652b5b3ccd0def89859ab0da8bca6144a3de" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b9/72/18168f881359c4482d312f8dc196371bdd61c1583a52b34390da4c88bbea/preshed-3.0.13-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4a7bc48220de579be6bdb0a8715482cf36e2a625a6fd5ad26c9f43485a4a23b5" }, + { url = "https://mirrors.aliyun.com/pypi/packages/fd/3a/3543476091087102775568cea9885dde3453569e9aeee365809108de572f/preshed-3.0.13-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5c8462472f790c16708306aef3a102a762bd19dfe3d2f8ee08bd5e12f51b835" }, + { url = "https://mirrors.aliyun.com/pypi/packages/cf/65/b13f01329decc44ef53cfb6b4601ba85382dcb2a4ec78d9250f03a418066/preshed-3.0.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c046736239cc8d72670749b79b526e4111839a2fc461a58545d212797649129c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d1/c7/f1a996c6832234efd4d543041b582418d41ac480ee55c557ec9e65344637/preshed-3.0.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7c333f18e9a81c8a6de0603fd8781e17115324b117c445ca91abdf7bfb1abe49" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e3/b9/96fb71499049885ce19545903fdd38877bbc2be0da47e37c04d01f3e9f66/preshed-3.0.13-cp313-cp313-win_amd64.whl", hash = "sha256:461327f8dd36520dcf1fd55a671e0c3c2c97a2d95e22fc85faa31173f4785dda" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ef/a7/32a4903019d936a2316fdd330bedddac287ac26326107d24fb76a1fbc60a/preshed-3.0.13-cp313-cp313-win_arm64.whl", hash = "sha256:35d6c5acb3ee3b12b87a551913063f0cec784055c2af16e028c19fe875f079d0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bb/b5/993886c98f5caaa6f07a648cac97a7c62a3093091cad65e1e43a1bd41cc4/preshed-3.0.13-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d2f1efae396cadab5f3890a2fd43d2ee65373ef9096ccbb805e51e8d8bcc563b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c6/86/b7fd137cbf140afd6c45e895946068a15f5b55642916de0075e6eb18581c/preshed-3.0.13-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8d6acc1f5031a535a55a6f7148e2f274554a8343a16309c700cebea0fe7aee8c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8b/ca/21a7e79625614134273dfed32bca5bb4c2ec1313e33fbd12d41657536f1f/preshed-3.0.13-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7da9d931e7660dcdd757e5870269f0c159126d682ed73ed313971d199eb0f334" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8f/3a/2dbd299516461831ae90e0d5b0637137bf28520c4e6dd0b01d6f1886659a/preshed-3.0.13-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d4ae5cfe075bb7a07982e382bca44f41ddf041f4d24cbd358e8cccfc049259b8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7c/d3/af654eba4f6587c4ee02c5043e62c194b0a1c4431ffef0c67b9518f6b61c/preshed-3.0.13-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7557963d0125a3a7bcdb2eb6948f3e45da31b5a7f066b55320de3dea22d7557f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/bf/9b/ebcb2b9e8cb881e40b55b0bf450f8a6b187e2ef3ae0c685cce81d2d85026/preshed-3.0.13-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c4bc60dc994864095d784b7e4d77dba3e64188d169ac88722b699d175561fddb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/97/f7/c6c012779edcaa6e2cd092c554e98dc53e77f41205b07208655ba77e2327/preshed-3.0.13-cp314-cp314-win_amd64.whl", hash = "sha256:208dcebbe294bf1881ce33fb015d56ab2a7587aece85a09147727174207892e4" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f8/82/390ef87d732ef64e673ef6bf9e5d898453986e979efa50fb3a400e2c0766/preshed-3.0.13-cp314-cp314-win_arm64.whl", hash = "sha256:cf8e1a7a1823b2a7765121446c630140ac6e8650c07a6efbf375e168d1fef4f7" }, + { url = "https://mirrors.aliyun.com/pypi/packages/80/3a/a9dde3167bcecb27ae82ce4567b5ab1aa3989113ae6814c092ce223cc4ef/preshed-3.0.13-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9ca43ecbc3783eda4d6ab3416ae2ecd9ef23dca5f53995843f69f7457bcd0677" }, + { url = "https://mirrors.aliyun.com/pypi/packages/74/d4/22d9355b50b6a13b407dcad0a81df83fb1d5602092d1f05834674dde8fda/preshed-3.0.13-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c8596e41a258ff213553a441e0bb3eb388fd8158e84a7bf3aae6d8ede2c166d3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/70/42/a225ee83fdb306d2a503f21a627953b820f4e079c90c8a84338957cb8ff5/preshed-3.0.13-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4f8856ca3d88e9b250630d70abb4f260d8933151ddfb413024784b25b009868e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/40/ba/09a9dfe3d22d7e745483fd5d7f2a82cd4d39c161f7d2daa0faa4bd6402be/preshed-3.0.13-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e5b2865aecbd2e1e10e5d19bb8bfad765863c1307c6c3e51f2a08bd64122409" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6c/5c/e10e2e05133e7fcbd7c40536af1148c82dd24357b8f5726e2c7bc51cfd53/preshed-3.0.13-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:09f96b477c987755b3c945df214ea1c1c80bfb350e9f34e78da89585535b77e8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/37/aa/51e5b4109a4cdfae28c3613eeeb10764a3794ebef8de93ffbb109465bea3/preshed-3.0.13-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:670db59a52e1823b5f088c764df474e65b686592d4093adbeef14581c95ee2cb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0e/6a/1d966f367a14c703dde629d150d996c1b727d442f620300b21c9ec1a24d1/preshed-3.0.13-cp314-cp314t-win_amd64.whl", hash = "sha256:b03e21b0bf95eb56e23973f32cabb930e94f352228652f81c0955dbd6967d904" }, + { url = "https://mirrors.aliyun.com/pypi/packages/22/80/368139067603e590a000122355f9c8576c8ebed4fb0b8849feaa2698489d/preshed-3.0.13-cp314-cp314t-win_arm64.whl", hash = "sha256:b980f3ea9bb74b7f94464bc3d6eb3c9162b6b79b531febd14c6465c24344d2cc" }, +] + [[package]] name = "primp" version = "1.1.3" @@ -6589,6 +6796,7 @@ dependencies = [ { name = "duckduckgo-search" }, { name = "editdistance" }, { name = "elasticsearch-dsl" }, + { name = "en-core-web-sm" }, { name = "exceptiongroup" }, { name = "extract-msg" }, { name = "feedparser" }, @@ -6665,6 +6873,7 @@ dependencies = [ { name = "selenium-wire" }, { name = "slack-sdk" }, { name = "socksio" }, + { name = "spacy" }, { name = "sqlglotrs" }, { name = "strenum" }, { name = "tavily-python" }, @@ -6734,6 +6943,7 @@ requires-dist = [ { name = "duckduckgo-search", specifier = ">=7.2.0,<8.0.0" }, { name = "editdistance", specifier = "==0.8.1" }, { name = "elasticsearch-dsl", specifier = "==8.12.0" }, + { name = "en-core-web-sm", url = "https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl" }, { name = "exceptiongroup", specifier = ">=1.3.0,<2.0.0" }, { name = "extract-msg", specifier = ">=0.39.0" }, { name = "feedparser", specifier = ">=6.0.11,<7.0.0" }, @@ -6810,6 +7020,7 @@ requires-dist = [ { name = "selenium-wire", specifier = "==5.1.0" }, { name = "slack-sdk", specifier = "==3.37.0" }, { name = "socksio", specifier = "==1.0.0" }, + { name = "spacy", specifier = "==3.8.14" }, { name = "sqlglotrs", specifier = "==0.9.0" }, { name = "strenum", specifier = "==0.4.15" }, { name = "tavily-python", specifier = "==0.5.1" }, @@ -7650,6 +7861,67 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95" }, ] +[[package]] +name = "spacy" +version = "3.8.14" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +dependencies = [ + { name = "catalogue" }, + { name = "confection" }, + { name = "cymem" }, + { name = "jinja2" }, + { name = "murmurhash" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "preshed" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "setuptools" }, + { name = "spacy-legacy" }, + { name = "spacy-loggers" }, + { name = "srsly" }, + { name = "thinc" }, + { name = "tqdm" }, + { name = "typer" }, + { name = "wasabi" }, + { name = "weasel" }, +] +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/0c/78/e4f2ae19a791cae756cd0e801204953eaec4e9ab75a60ad39f671dbb8d5a/spacy-3.8.14-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:726f02c60a2c6b0029167370d22d51731172a053d29c7e2ea6190db6de3ab483" }, + { url = "https://mirrors.aliyun.com/pypi/packages/06/df/178bbab47fa209c8baf2f1e609cbddc6b18a985200be1ceee22bd5b89beb/spacy-3.8.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e3ebe50b93f2d40e8ec3451255528bb622ccb12be39fd140bb87668ce8d1075b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ff/e8/048d83b73b28686307bd9a60878a58de7b7b21b562ca4de8b5bd558031e9/spacy-3.8.14-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:daeb64b048f12c059997281aed53eb8776d26416dd313cf17ad6f63124b2b564" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8e/3f/1799af5f4ccc8eb7500e4a20ca301488134429dba08cda5be68ce6ab2992/spacy-3.8.14-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6d45715a24446f23b98ec3f09409a1d4111983d1d64613250ee38c3270e21853" }, + { url = "https://mirrors.aliyun.com/pypi/packages/78/07/81ab9acd0ec64bfdd7339acfc4cf35f5fb74bbbb0b2be7e64d717c416bac/spacy-3.8.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1069a8be34940809f8462eb69f09a3f0ce59bf8b9cb82475f2a8e3580f50ece0" }, + { url = "https://mirrors.aliyun.com/pypi/packages/74/a5/b081b5bd3cedb2634c23eb470b5e24c65c894c57646567f47627291c2b3f/spacy-3.8.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2dfa77aec7fdebac0455d8afd4ce1d92d6f868b03d507ed1976179a63db7b374" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5f/55/4371413a6dfc1fa837282a365498165f828c2f3fe018dfb35336acc869e0/spacy-3.8.14-cp312-cp312-win_amd64.whl", hash = "sha256:9def18c76a4472b326cb91a195623c9ca38a2b86999ad2df9e00b49ba8c63734" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f3/5e/12ac876017da6c1e6b72afcc3c8b309996227fd3aa15382cd3311aee21b8/spacy-3.8.14-cp312-cp312-win_arm64.whl", hash = "sha256:d6257133357e4801c9c5d011925af5439b0a015aacf3c16528aa0009982431c7" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1b/e5/822bbdfa459fee863ef2e9879a34b0ae5db7cd1e3eb76d32c766f19222e9/spacy-3.8.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b4f60fa8b9641a5e93e7a96db0cdd106d05d61756bf1d0ddcd1705ad347909a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7e/de/0e512154113e1f341567f2b9341835775e4180c180221e60faedaebb2f65/spacy-3.8.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0860c57220c633ccb20468bcd64bfb0d28908990c371a8857951d093a148dc8e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0c/4f/29c7e56afc7db07348a9e0efe0243b5eef465d5dc3d56433f164378c3fa6/spacy-3.8.14-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c24620b7dba879c69cebc51ef3b1107d4d4e44a1e0d4baa439372887d00c3fd9" }, + { url = "https://mirrors.aliyun.com/pypi/packages/1e/ce/cae678f664d5467016819253f5d6e52f8e68a12d8e799b651d73ec2a9a4b/spacy-3.8.14-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9699c1248d115d5825987c287a6f6acd66386ef3ebee7994ee67ba093e932c59" }, + { url = "https://mirrors.aliyun.com/pypi/packages/04/d4/419868afd449bdd367df005932537eea66c71e97c899ba278f3124933f3c/spacy-3.8.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:042d799e342fdb6bb5b02a4213a95acc9116c40ed3c849bb0a8296fbe648ec22" }, + { url = "https://mirrors.aliyun.com/pypi/packages/ec/53/df5c1fee45f200b749ba72eeb536fbb2c545fc56230324954263b2f3be00/spacy-3.8.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69b2264294097336e86832e8663f1ab3a7215621184863c96c082ab17ee11937" }, + { url = "https://mirrors.aliyun.com/pypi/packages/12/c2/f1882ec2f5cc9c4e73cf2132997a03c397d7ceeb5ee7f7bb878b51a16365/spacy-3.8.14-cp313-cp313-win_amd64.whl", hash = "sha256:4b6d4f20e291a7c70e37de2f246622b44a0ce82efaa710c9801c6bd599e75177" }, +] + +[[package]] +name = "spacy-legacy" +version = "3.0.12" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/d9/79/91f9d7cc8db5642acad830dcc4b49ba65a7790152832c4eceb305e46d681/spacy-legacy-3.0.12.tar.gz", hash = "sha256:b37d6e0c9b6e1d7ca1cf5bc7152ab64a4c4671f59c85adaf7a3fcb870357a774" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/c3/55/12e842c70ff8828e34e543a2c7176dac4da006ca6901c9e8b43efab8bc6b/spacy_legacy-3.0.12-py2.py3-none-any.whl", hash = "sha256:476e3bd0d05f8c339ed60f40986c07387c0a71479245d6d0f4298dbd52cda55f" }, +] + +[[package]] +name = "spacy-loggers" +version = "1.0.5" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/67/3d/926db774c9c98acf66cb4ed7faf6c377746f3e00b84b700d0868b95d0712/spacy-loggers-1.0.5.tar.gz", hash = "sha256:d60b0bdbf915a60e516cc2e653baeff946f0cfc461b452d11a4d5458c6fe5f24" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/33/78/d1a1a026ef3af911159398c939b1509d5c36fe524c7b644f34a5146c4e16/spacy_loggers-1.0.5-py3-none-any.whl", hash = "sha256:196284c9c446cc0cdb944005384270d775fdeaf4f494d8e269466cfa497ef645" }, +] + [[package]] name = "sphinx" version = "9.1.0" @@ -7856,6 +8128,49 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/ab/e3/5b7b4bb702691630d5b1f72470cdcfd8220bf32bc3ed9514af59904186bd/sqlglotrs-0.9.0-cp314-cp314-win_amd64.whl", hash = "sha256:41c8606a13a7284216dd3649521e0fe402e660f5e48acac6acf0facaa676d0bb" }, ] +[[package]] +name = "srsly" +version = "2.5.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +dependencies = [ + { name = "catalogue" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/2b/db/f794f219a6c788b881252d2536a8c4a97d2bdaadc690391e1cb53d123d71/srsly-2.5.3.tar.gz", hash = "sha256:08f98dbecbff3a31466c4ae7c833131f59d3655a0ad8ac749e6e2c149e2b0680" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/02/cc/e9f7fcec4cc92ad8bad6316c4241638b8cf7380382d4489d94ec6c436452/srsly-2.5.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:71e51c046ccbeefb86524c6b1e17574f579c6ac4dc8ea4a09437d3e8f88342d3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/21/e4/fea4512e9785f58509b2cf67d993323848e583161b5fcfdc7dd9d7c1f3df/srsly-2.5.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f73c0db911552e94fe2016e1759d261d2f47926f68826664cada3723c87006a" }, + { url = "https://mirrors.aliyun.com/pypi/packages/20/b1/53591681b6ff2699a4f97b2d5552ba196eaa6a979b0873605f4c04b5f7ee/srsly-2.5.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c1ac27ae5f4bb9163c7d2c45fc8ec173aac3d92e32086d9472b326c5c6e570e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4e/c9/741e29f534919a944a16da4184924b1d3404c4bf60716ab2b91be771d1e3/srsly-2.5.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:99026bcd9cbd3211cc36517400b04ca0fc5d3e412b14daf84ee6e65f67d9a2d8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/89/57/5554f786eccf78b2750d6ac63be126e1b67badec2cb409dd611cf6f8c52b/srsly-2.5.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:07d682679e639eb46ff7e6da4a92714f4d5ffe351d088ee66f221e9b1f8865bb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/eb/95/9b4f73b1be3692f86d72ccc131c8e50f26f824d5c8830a59390bcc5b60ef/srsly-2.5.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8e0542d85d6b55cf2934050d6ffcb1cd76c768dcf9572e7467002cf087bb366d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/5a/de/89ca640ca1953c4612279ce515d0af35658df3c06cdb324329bc91b4a7e1/srsly-2.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:598f1e494c18cacb978299d77125415a586417081959f8ec3f068b32d97f8933" }, + { url = "https://mirrors.aliyun.com/pypi/packages/6d/4f/7ab6d49e36d9cc72ee15746cabd116eb6f338be8a06c1882968ee9d6c7d7/srsly-2.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:4b1b721cd3ad1a9b2343519aadc786a4d09d5c0666962d49852eb12d6ec3fe26" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9d/5c/12901e3794f4158abc6da750725aad6c2afddb1e4227b300fe7c71f66957/srsly-2.5.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e67b6bbacbfadea5e100266d2797f2d4cec9883ea4dc84a5537673850036a8d8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/04/61/181c26370995f96f56f1b64b801e3ca1e0d703fc36506ae28606d62369fb/srsly-2.5.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:348c231b4477d8fe86603131d0f166d2feac9c372704dfc4398be71cc5b6fb07" }, + { url = "https://mirrors.aliyun.com/pypi/packages/77/c6/35876c78889f8ffe11ed3521644e666c3aef20ea31527b70f47456cf35c2/srsly-2.5.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b0938c2978c91ae1ef9c1f2ba35abb86330e198fb23469e356eba311e02233ee" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3e/da/40b71ca9906c8eb8f8feb6ac11d33dad458c85a56e1de764b96d402168a0/srsly-2.5.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f6a837954429ecbe6dcdd27390d2fb4c7d01a3f99c9ffcf9ce66b2a6dd1b738" }, + { url = "https://mirrors.aliyun.com/pypi/packages/dc/14/c0dd30cc8b93ce8137ff4766f743c882440ce49195fffc5d50eaeef311a6/srsly-2.5.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3576c125c486ce2958c2047e8858fe3cfc9ea877adfa05203b0986f9badee355" }, + { url = "https://mirrors.aliyun.com/pypi/packages/08/f3/34354f183d8faafc631585571224b54d1b4b67e796972c36519c074ca355/srsly-2.5.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5fb59c42922e095d1ea36085c55bc16e2adb06a7bfe57b24d381e0194ae699f2" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a4/d9/5531f8a19492060b4e76e4ab06aca6f096fb5128fe18cc813d1772daf653/srsly-2.5.3-cp313-cp313-win_amd64.whl", hash = "sha256:111805927f05f5db440aeeacb85ce43da0b19ce7b2a09567a9ef8d30f3cc4d83" }, + { url = "https://mirrors.aliyun.com/pypi/packages/8e/8a/62fb7a971eca29e12f03fb9ddacb058548c14d33e5b5675ff0f85839cc7b/srsly-2.5.3-cp313-cp313-win_arm64.whl", hash = "sha256:0f106b0a700ab56e4a7c431b0f1444009ab6cb332edc7bbf6811c2a43f4722cb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/e1/5b/e4ef43c2a381711230af98d4c94a5323df48d6a7899ee652e05bf889290e/srsly-2.5.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:39c13d552a9f9674a12cdcdc66b0c2f02f3430d0cd04c5f9cf598824c2bd3d65" }, + { url = "https://mirrors.aliyun.com/pypi/packages/92/2d/ebce7f3717e52cd0a01f4ec570f388f3b7098526794fcf1ad734e0b8f852/srsly-2.5.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:14c930767cc169611a2dc14e23bc7638cfb616d6f79029700ade033607343540" }, + { url = "https://mirrors.aliyun.com/pypi/packages/22/47/a8f3e9b214be2624c8e8a78d38ca7b1d4e26b92d57018412e4bfc4abe89a/srsly-2.5.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2f2d464f0d0237e32fb53f0ec6f05418652c550e772b50e9918e83a1577cba4d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d6/71/2a89dc3180a51e633a87a079ca064225f4aaf46c7b2a5fc720e28f261d98/srsly-2.5.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d18933248a5bb0ad56a1bae6003a9a7f37daac2ecb0c5bcbfaaf081b317e1c84" }, + { url = "https://mirrors.aliyun.com/pypi/packages/b8/36/72e5ce3153927ca404b6f5bf5280e6ff3399c11557df472b153945468e0a/srsly-2.5.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7ea5412ea229e571ac9738cbe14f845cc06c8e4e956afb5f42061ccd087ef31f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/04/b2/0895de109c28eca0d41a811ab7c076d4e4a505e8466f06bae22f5180a1dd/srsly-2.5.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8d3988970b4cf7d03bdd5b5169302ff84562dd2e1e0f84aeb34df3e5b5dc19bf" }, + { url = "https://mirrors.aliyun.com/pypi/packages/c7/79/a37fa7759797fbdfe0a2e029ab13e78b1e81e191220d2bb8ff57d869aefb/srsly-2.5.3-cp314-cp314-win_amd64.whl", hash = "sha256:6a02d7dcc16126c8fae1c1c09b2072798a1dc482ab5f9c52b12c7114dac47325" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d7/25/0dae019b3b90ad9037f91de4c390555cdaac9460a93ad62b02b03babdff5/srsly-2.5.3-cp314-cp314-win_arm64.whl", hash = "sha256:1c9129c4abe31903ff7996904a51afdd5428060de6c3d12af49a4da5e8df2821" }, + { url = "https://mirrors.aliyun.com/pypi/packages/3a/44/72dd5285b2e05435d98b0797f101d91d9b345d491ddc1fdb9bd09e27ccb8/srsly-2.5.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:29d5d01ba4c2e9c01f936e5e6d5babc4a47b38c9cbd6e1ec23f6d5a49df32605" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d2/ad/002c71b87fc3f648c9bf0ec47de0c3822bf2c95c8896a589dd03e7fd3977/srsly-2.5.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5c8df4039426d99f0148b5743542842ab96b82daded0b342555e15a639927757" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2a/35/2cea3d5e80aeecfc4ece9e7e1783e7792cc3bad7ab85ab585882e1db4e38/srsly-2.5.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:06a43d63bde2e8cccadb953d7fff70b18196ca286b65dd2ad16006d65f3f8166" }, + { url = "https://mirrors.aliyun.com/pypi/packages/aa/38/8a4d7e86dd0370a2e5af251b646000197bb5b7e0f9aa360c71bbfb253d0d/srsly-2.5.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:808cfafc047f0dec507a34c8fa8e4cda5722737fd33577df73452f52f7aca644" }, + { url = "https://mirrors.aliyun.com/pypi/packages/99/05/340129de5ea7b237271b12f8a6962cfa7eb0c5a3056794626d348c5ae7c7/srsly-2.5.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:71d4cbe2b2a1335c76ed0acae2dc862163787d8b01a705e1949796907ed94ccd" }, + { url = "https://mirrors.aliyun.com/pypi/packages/01/cb/d7fee7ab27c6aa2e3f865fb7b50ba18c81a4c763bba12bdf53df246441bc/srsly-2.5.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:565f69083d33cb329cfc74317da937fb3270c0f40fabc1b4488702d8074b4a3e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d8/d1/9bad3a0f2fa7b72f4e0cf1d267b00513092d20ef538c47f72823ae4f7656/srsly-2.5.3-cp314-cp314t-win_amd64.whl", hash = "sha256:8ac016ffaeac35bc010992b71bf8afdd39d458f201c8138d84cf78778a936e6c" }, + { url = "https://mirrors.aliyun.com/pypi/packages/2a/ae/57d1d7af907e20c077e113e0e4976f87b82c0a415403d99284a262229dd0/srsly-2.5.3-cp314-cp314t-win_arm64.whl", hash = "sha256:d822083fe26ec6728bd8c273ac121fc4ab3864a0fdf0cf0ff3efb188fcd209ed" }, +] + [[package]] name = "sse-starlette" version = "3.3.3" @@ -8208,6 +8523,52 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/11/3d/2653f4cf49660bb44eeac8270617cc4c0287d61716f249f55053f0af0724/tf_playwright_stealth-1.2.0-py3-none-any.whl", hash = "sha256:26ee47ee89fa0f43c606fe37c188ea3ccd36f96ea90c01d167b768df457e7886" }, ] +[[package]] +name = "thinc" +version = "8.3.13" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +dependencies = [ + { name = "blis" }, + { name = "catalogue" }, + { name = "confection" }, + { name = "cymem" }, + { name = "murmurhash" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "preshed" }, + { name = "pydantic" }, + { name = "setuptools" }, + { name = "srsly" }, + { name = "wasabi" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/13/46/76df95f2c327f9a9cef30c1523bf285627897097163584dcf5f77b2ebce2/thinc-8.3.13.tar.gz", hash = "sha256:68e658549fc1eb3ff92aed5147fcbb9c15d6e9cc0e623b4d0998d16522ffb4f9" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/3e/af/f7c1ebfe92eb5d27d7f2f3da67a11e2eb57bc30ab1553279af6dc65b65a8/thinc-8.3.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:77a41f66285321d20aaedaea1e87d7cd48dca6d2427bed1867ec7cba7109fc8d" }, + { url = "https://mirrors.aliyun.com/pypi/packages/45/8f/69d7338575d98df85d0b54c0f5fc277dba72587fe9ab846ecdd12a998bcb/thinc-8.3.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3710d318b4e5460cf366a6f7b5ddbefb5d39dbd4cfa408222750fdc6c27c4411" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4b/a5/21d010c81e81e1589e5ccb4950e521804d13726e541e87f644c51815673b/thinc-8.3.13-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5a08c87143a6d20177652dca1ec0dc815d88216d8fc62594a57e8bc45bf5ed49" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f9/ff/6914bf370bd1d604d89e6dfb46b97d10cd9b00d42ff8c036283e92314a8c/thinc-8.3.13-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b5ec9ff313819e7d8667794a3559463fa89ff45aaa73e3fd8d6273b1e0d7a7f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f3/3d/5572b47fa155fb3388c071515b74024fa17a6efd1df9406da378f0aa84ef/thinc-8.3.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5c9a48f2bc1e04f138240ed5f9b815a9141a5de26accd0f08fa0137fcefed258" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f0/f0/a8d77c7bac089697c6df302cc3c936a1ab36a4720deae889e6f1dbcbd0eb/thinc-8.3.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:79a29a44d76bd02f5ac0624268c6e42b3576ae472c791a8ae9c2d813ae789b59" }, + { url = "https://mirrors.aliyun.com/pypi/packages/21/82/5651bb1f904d04220fc7670035ada921bf0638e2cff6444d67c12887a968/thinc-8.3.13-cp312-cp312-win_amd64.whl", hash = "sha256:ed1dc709ac4f2f03b710457889e4e02f05de51bc8456980c241d0b28798bc7cb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/94/8d/683703de021ffbe46833d722b70f49ffbbca8e5bd6876256977555d92d7d/thinc-8.3.13-cp312-cp312-win_arm64.whl", hash = "sha256:c6a049703a6011c8fe26ee41af7e70272145594140d82f79bb23de619c6a6525" }, + { url = "https://mirrors.aliyun.com/pypi/packages/af/b9/7b46942176df459d1804a9e77b0976f7c56f3abf3ec7485d0e5f836a0382/thinc-8.3.13-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c2811dfd8d46d8b5d3b39051b23e64006b2994a5143b1978b436938018792af8" }, + { url = "https://mirrors.aliyun.com/pypi/packages/a7/79/53085a72cd8f4fc4e6e313d05ea5aa98e870684f4a0fb318a9875fc0a964/thinc-8.3.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5593e6300cb1ebe0c0e546e9c9fb49e7c2627a0aa688795cd4f995a8b820d2ec" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9e/3e/d61b462b16da95ac6885f95bb395e672040ee594833e571a6edcffd234f5/thinc-8.3.13-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f697174d3fb474966ce50b430bbafa101a6d2f7ffb559dac4b5c59389ef72d22" }, + { url = "https://mirrors.aliyun.com/pypi/packages/78/4c/898cc654bb123734c71ec5a425c02ca34439517d01ce1c95a6563295580e/thinc-8.3.13-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e9c7c5c104737b414c8c4ec578e67d78b6c859afe25cbc0684402e721415bd7f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/cd/56/1abdbf0a4ad628e8a05d6516fe0745969649d805367a3dccad8ee872981b/thinc-8.3.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a99d0e242d1ccd23f9ae6bea7cd502f8626efa65c156b91d84581d0356696c3" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f1/22/b84dbdc6be5055bbdb2a7352e2c393f67e8593c137f1b83c82bf1e062b6e/thinc-8.3.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e676edd21a747afbe3e6b9f3fca8b962e36d146ded03b070cb0c28e2dfbe9499" }, + { url = "https://mirrors.aliyun.com/pypi/packages/0f/a8/763cd7ba949334c9d2cddc92dadb68b344cb9546dc01b8d4a733dcaa16c1/thinc-8.3.13-cp313-cp313-win_amd64.whl", hash = "sha256:8ad40307f20e83f77af28ff5c6be0b86af7a8b251d1231c545508d2763157d8f" }, + { url = "https://mirrors.aliyun.com/pypi/packages/f5/15/a11f7bb3cbc97dfecf32a90552f5a8f8a5c99316a99c6c17bdabf5baf256/thinc-8.3.13-cp313-cp313-win_arm64.whl", hash = "sha256:723949cab11d1925c15447928513a718276316cec6e0de28337cca0a62be0521" }, + { url = "https://mirrors.aliyun.com/pypi/packages/80/40/f4937d113912c6d669ffe982356ab29dcb6c7fe3be926a15981dbbb6a91c/thinc-8.3.13-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7badb0be4825535e6362c19e8a41872b65409e9da46d3453a391b843a0720865" }, + { url = "https://mirrors.aliyun.com/pypi/packages/d2/00/4d4ed1a11ba2920b85a03a0683b16d97dc5beb2e78078dbf0e13e43bcea7/thinc-8.3.13-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:565300b7e13de799e5abff00d445f537e9256cf7da4dcb0d0f005fc16748a29e" }, + { url = "https://mirrors.aliyun.com/pypi/packages/44/5d/dc33d6932be8721af2ef76b4a3a6e8020648630eabae61fb916d2a861d1d/thinc-8.3.13-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c17cef1900a1aba7e1487493d16b8aa0a8633116f1b2a51c6649a4000697f17b" }, + { url = "https://mirrors.aliyun.com/pypi/packages/af/bc/a6d37d8dadc2c5b524f51192413481160c42c9dd6105e8d5551531623225/thinc-8.3.13-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f4f26d1eec9b2a6a8f2e0298a5515d13eb06d70730d0d9e1040bb329e12bf3fb" }, + { url = "https://mirrors.aliyun.com/pypi/packages/7a/59/ce9c7067f1dfe5985875927de9cf7a79f9dae3e69487fd650dfba558029d/thinc-8.3.13-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a61a31fd0ce3c2771cf4901ba6df70e774ffe32febf1024c5b43d63575cd58fe" }, + { url = "https://mirrors.aliyun.com/pypi/packages/4f/a8/f57819347fc4d8bef2204d15fcbb9d7dff2d6cdd5f83d5ed91456ddacc55/thinc-8.3.13-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ba8119daf84a12259ae4d251d36426417bafa0b34108890b4b7e2b50966bd990" }, + { url = "https://mirrors.aliyun.com/pypi/packages/05/ef/a82214bb7c7c1e2d92b69e1a7654be90cfab180082c6108e45a98af2422c/thinc-8.3.13-cp314-cp314-win_amd64.whl", hash = "sha256:433e3826e018da489f1a8068e6de677f6eff3cc93991a599d90f12cd1bc26cdc" }, + { url = "https://mirrors.aliyun.com/pypi/packages/9f/ef/1648fda54e9689058335ff54f650a7a314db2a42e21af1b83949b2dc748e/thinc-8.3.13-cp314-cp314-win_arm64.whl", hash = "sha256:11754fada9ad5ba2e02d5f3f234f940e24015b82333db58372f4a6aedad9b43f" }, +] + [[package]] name = "threadpoolctl" version = "3.6.0" @@ -8560,6 +8921,18 @@ version = "0.2.5" source = { registry = "https://mirrors.aliyun.com/pypi/simple" } sdist = { url = "https://mirrors.aliyun.com/pypi/packages/9f/c1/dd817bf57e0274dacb10e0ac868cb6cd70876950cf361c41879c030a2b8b/warc3-wet-clueweb09-0.2.5.tar.gz", hash = "sha256:3054bfc07da525d5967df8ca3175f78fa3f78514c82643f8c81fbca96300b836" } +[[package]] +name = "wasabi" +version = "1.1.3" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ac/f9/054e6e2f1071e963b5e746b48d1e3727470b2a490834d18ad92364929db3/wasabi-1.1.3.tar.gz", hash = "sha256:4bb3008f003809db0c3e28b4daf20906ea871a2bb43f9914197d540f4f2e0878" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/06/7c/34330a89da55610daa5f245ddce5aab81244321101614751e7537f125133/wasabi-1.1.3-py3-none-any.whl", hash = "sha256:f76e16e8f7e79f8c4c8be49b4024ac725713ab10cd7f19350ad18a8e3f71728c" }, +] + [[package]] name = "wcwidth" version = "0.6.0" @@ -8569,6 +8942,26 @@ wheels = [ { url = "https://mirrors.aliyun.com/pypi/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad" }, ] +[[package]] +name = "weasel" +version = "1.0.0" +source = { registry = "https://mirrors.aliyun.com/pypi/simple" } +dependencies = [ + { name = "cloudpathlib" }, + { name = "confection" }, + { name = "httpx" }, + { name = "packaging" }, + { name = "pydantic" }, + { name = "smart-open" }, + { name = "srsly" }, + { name = "typer" }, + { name = "wasabi" }, +] +sdist = { url = "https://mirrors.aliyun.com/pypi/packages/ce/e5/e272bb9a045105a1fdf4b798d8086f5932a178f4d738f17a74f5c9e0ae9a/weasel-1.0.0.tar.gz", hash = "sha256:7b129b44c90cc543b760532974ca1e4eb30dad2aa2026f57bdce66354ae610fc" } +wheels = [ + { url = "https://mirrors.aliyun.com/pypi/packages/0a/07/57ebf7a6798b016c064bd0ca81b4c6a99daa4dc377b898bc7b41eb6b5af0/weasel-1.0.0-py3-none-any.whl", hash = "sha256:89518acee027f49d743126c3502d35e6dd14f5768be5c37c9af47c171b6005cc" }, +] + [[package]] name = "webdav4" version = "0.10.0" diff --git a/web/src/components/parse-configuration/graph-rag-form-fields.tsx b/web/src/components/parse-configuration/graph-rag-form-fields.tsx index 1c41877392..d85c883648 100644 --- a/web/src/components/parse-configuration/graph-rag-form-fields.tsx +++ b/web/src/components/parse-configuration/graph-rag-form-fields.tsx @@ -35,6 +35,7 @@ export const showTagItems = (parserId: DocumentParserType) => { const enum MethodValue { General = 'general', Light = 'light', + NER = 'ner', } export const excludedParseMethods = [ @@ -122,10 +123,12 @@ const GraphRagItems = ({ }); const methodOptions = useMemo(() => { - return [MethodValue.Light, MethodValue.General].map((x) => ({ - value: x, - label: upperFirst(x), - })); + return [MethodValue.Light, MethodValue.General /*, MethodValue.NER*/].map( + (x) => ({ + value: x, + label: x === MethodValue.NER ? 'NER' : upperFirst(x), + }), + ); }, []); const renderWideTooltip = useCallback( diff --git a/web/src/locales/ar.ts b/web/src/locales/ar.ts index 4cdbaffc9b..49b156b66f 100644 --- a/web/src/locales/ar.ts +++ b/web/src/locales/ar.ts @@ -606,7 +606,7 @@ export default { 'قم بإنشاء رسم بياني معرفي على أجزاء ملف من قاعدة المعرفة الحالية لتحسين الإجابة على الأسئلة متعددة القفزات التي تتضمن منطقًا متداخلاً. راجع https://ragflow.io/docs/dev/construct_knowledge_graph للحصول على التفاصيل.', graphRagMethod: 'طريقة', graphRagMethodTip: - 'Light: (افتراضي) استخدم المطالبات المقدمة من github.com/HKUDS/LightRAG لاستخراج الكيانات والعلاقات. يستهلك هذا الخيار عددًا أقل من الرموز المميزة، وذاكرة أقل، وموارد حسابية أقل.
\n عام: استخدم المطالبات المقدمة من github.com/microsoft/graphrag لاستخراج الكيانات والعلاقات', + 'Light: (افتراضي) استخدم المطالبات المقدمة من github.com/HKUDS/LightRAG لاستخراج الكيانات والعلاقات. يستهلك هذا الخيار عددًا أقل من الرموز المميزة، وذاكرة أقل، وموارد حسابية أقل.
\n عام: استخدم المطالبات المقدمة من github.com/microsoft/graphrag لاستخراج الكيانات والعلاقات.
\n NER: استخدم spaCy NER واستخراج الكلمات المفتاحية القائم على القواعد لاستخراج الكيانات والعلاقات. لا حاجة إلى LLM للاستخراج نفسه، مما يجعله سريعًا وفعالاً في الموارد.', resolution: 'قرار الكيان', resolutionTip: 'مفتاح إلغاء البيانات المكررة للكيان. عند التمكين، سيجمع LLM بين الكيانات المتشابهة - على سبيل المثال، "2025" و"عام 2025"، أو "تكنولوجيا المعلومات" و"تكنولوجيا المعلومات" - لإنشاء رسم بياني أكثر دقة', diff --git a/web/src/locales/bg.ts b/web/src/locales/bg.ts index c70b37c383..3c9a3695f1 100644 --- a/web/src/locales/bg.ts +++ b/web/src/locales/bg.ts @@ -680,7 +680,8 @@ The above is the content you need to summarize.`, graphRagMethod: 'Метод', graphRagMethodTip: ` Light: (По подразбиране) Използва подсказки от github.com/HKUDS/LightRAG за извличане на обекти и връзки. Тази опция консумира по-малко токени, памет и изчислителни ресурси.
- General: Използва подсказки от github.com/microsoft/graphrag за извличане на обекти и връзки`, + General: Използва подсказки от github.com/microsoft/graphrag за извличане на обекти и връзки.
+ NER: Използва spaCy NER и извличане на ключови думи на базата на правила за извличане на обекти и връзки. Не се изисква LLM за самото извличане, което го прави бързо и ефективно.`, resolution: 'Разрешаване на обекти', resolutionTip: `Превключвател за дедупликация на обекти. Когато е активиран, LLM ще комбинира подобни обекти — напр. '2025' и 'годината 2025', или 'ИТ' и 'Информационни технологии' — за изграждане на по-точен граф`, community: 'Отчети на общности', diff --git a/web/src/locales/de.ts b/web/src/locales/de.ts index 39b6f5a07a..44fc62613e 100644 --- a/web/src/locales/de.ts +++ b/web/src/locales/de.ts @@ -687,8 +687,9 @@ Diese Auto-Tag-Funktion verbessert den Abruf, indem sie eine weitere Schicht dom 'Erstellen Sie einen Wissensgraph über Dateiabschnitte der aktuellen Wissensbasis, um die Beantwortung von Fragen mit mehreren Schritten und verschachtelter Logik zu verbessern. Weitere Informationen finden Sie unter https://ragflow.io/docs/dev/construct_knowledge_graph.', graphRagMethod: 'Methode', graphRagMethodTip: ` - Light: (Standard) Verwendet von github.com/HKUDS/LightRAG bereitgestellte Prompts, um Entitäten und Beziehungen zu extrahieren. Diese Option verbraucht weniger Tokens, weniger Speicher und weniger Rechenressourcen.
- General: Verwendet von github.com/microsoft/graphrag bereitgestellte Prompts, um Entitäten und Beziehungen zu extrahieren`, + Light: (Standard) Verwendet von github.com/HKUDS/LightRAG bereitgestellte Prompts, um Entitäten und Beziehierungen zu extrahieren. Diese Option verbraucht weniger Tokens, weniger Speicher und weniger Rechenressourcen.
+ General: Verwendet von github.com/microsoft/graphrag bereitgestellte Prompts, um Entitäten und Beziehierungen zu extrahieren.
+ NER: Verwendet spaCy NER und regelbasierte Schlüsselwortextraktion, um Entitäten und Beziehungen zu extrahieren. Für die Extraktion selbst ist kein LLM erforderlich, was es schnell und ressourceneffizient macht.`, resolution: 'Entitätsauflösung', resolutionTip: `Ein Entitäts-Deduplizierungsschalter. Wenn aktiviert, wird das LLM ähnliche Entitäten kombinieren - z.B. '2025' und 'das Jahr 2025' oder 'IT' und 'Informationstechnologie' - um einen genaueren Graphen zu konstruieren`, community: 'Generierung von Gemeinschaftsberichten', diff --git a/web/src/locales/en.ts b/web/src/locales/en.ts index a13ff2263b..5c729d7739 100644 --- a/web/src/locales/en.ts +++ b/web/src/locales/en.ts @@ -896,7 +896,8 @@ This auto-tagging feature enhances retrieval by adding another layer of domain-s graphRagMethod: 'Method', graphRagMethodTip: ` Light: (Default) Use prompts provided by github.com/HKUDS/LightRAG to extract entities and relationships. This option consumes fewer tokens, less memory, and fewer computational resources.
- General: Use prompts provided by github.com/microsoft/graphrag to extract entities and relationships`, + General: Use prompts provided by github.com/microsoft/graphrag to extract entities and relationships.
+ NER: Use spaCy NER and rule-based keyword extraction to extract entities and relationships. No LLM is required for extraction itself, making it fast and resource-efficient.`, resolution: 'Entity resolution', resolutionTip: `An entity deduplication switch. When enabled, the LLM will combine similar entities - e.g., '2025' and 'the year of 2025', or 'IT' and 'Information Technology' - to construct a more accurate graph`, community: 'Community reports', diff --git a/web/src/locales/fr.ts b/web/src/locales/fr.ts index 623dec6dd7..21258b9847 100644 --- a/web/src/locales/fr.ts +++ b/web/src/locales/fr.ts @@ -288,7 +288,8 @@ export default { 'Construit un graphe basé sur les segments de cette base pour répondre à des questions complexes. Voir documentation.', graphRagMethod: 'Méthode', graphRagMethodTip: `Light : (Par défaut) utilise les prompts de github.com/HKUDS/LightRAG. Moins de consommation. - General : utilise ceux de github.com/microsoft/graphrag.`, + General : utilise ceux de github.com/microsoft/graphrag. + NER : utilise spaCy NER et l'extraction de mots-clés basée sur des règles pour extraire les entités et les relations. Aucun LLM n'est requis pour l'extraction, ce qui la rend rapide et économe en ressources.`, resolution: 'Résolution d’entités', resolutionTip: 'Fusionne des entités similaires comme "2025" et "l’année 2025".', diff --git a/web/src/locales/it.ts b/web/src/locales/it.ts index 086d4bd14a..1856fefbae 100644 --- a/web/src/locales/it.ts +++ b/web/src/locales/it.ts @@ -483,7 +483,8 @@ Quanto sopra è il contenuto che devi riassumere.`, graphRagMethod: 'Metodo', graphRagMethodTip: ` Light: (Predefinito) Usa prompt forniti da github.com/HKUDS/LightRAG per estrarre entità e relazioni. Questa opzione consuma meno token, meno memoria e meno risorse computazionali.
- General: Usa prompt forniti da github.com/microsoft/graphrag per estrarre entità e relazioni`, + General: Usa prompt forniti da github.com/microsoft/graphrag per estrarre entità e relazioni.
+ NER: Usa spaCy NER e l'estrazione di parole chiave basata su regole per estrarre entità e relazioni. Non è necessario un LLM per l'estrazione, rendendola veloce ed efficiente nelle risorse.`, resolution: 'Risoluzione entità', resolutionTip: `Un interruttore di deduplicazione entità. Quando abilitato, il LLM combinerà entità simili per costruire un grafo più accurato`, community: 'Report comunità', diff --git a/web/src/locales/ru.ts b/web/src/locales/ru.ts index 6916b51635..b18abd64ff 100644 --- a/web/src/locales/ru.ts +++ b/web/src/locales/ru.ts @@ -719,7 +719,8 @@ export default { graphRagMethod: 'Метод', graphRagMethodTip: ` Light: (по умолчанию) Промпты github.com/HKUDS/LightRAG для извлечения сущностей и связей. Меньше токенов, памяти и вычислений.
- General: Промпты github.com/microsoft/graphrag`, + General: Промпты github.com/microsoft/graphrag.
+ NER: Использует spaCy NER и извлечение ключевых слов на основе правил для извлечения сущностей и связей. LLM не требуется для самого извлечения, что делает его быстрым и эффективным.`, resolution: 'Разрешение сущностей', resolutionTip: `Переключатель дедубликации сущностей. Когда включен, LLM объединяет похожие сущности (например «2025» и «год 2025») для более точного графа`, community: 'Отчёты сообществ', diff --git a/web/src/locales/tr.ts b/web/src/locales/tr.ts index ca55cf96ec..93b1b16b27 100644 --- a/web/src/locales/tr.ts +++ b/web/src/locales/tr.ts @@ -875,7 +875,8 @@ Bu otomatik etiketleme özelliği, mevcut datasete alanına özgü bilgi katman graphRagMethod: 'Yöntem', graphRagMethodTip: ` Hafif: (Varsayılan) Varlıkları ve ilişkileri çıkarmak için github.com/HKUDS/LightRAG tarafından sağlanan istemler kullanılır.
- Genel: Varlıkları ve ilişkileri çıkarmak için github.com/microsoft/graphrag tarafından sağlanan istemler kullanılır`, + Genel: Varlıkları ve ilişkileri çıkarmak için github.com/microsoft/graphrag tarafından sağlanan istemler kullanılır.
+ NER: Varlıkları ve ilişkileri çıkarmak için spaCy NER ve kural tabanlı anahtar kelime çıkarma kullanılır. Çıkarma işlemi için LLM gerekmez, bu da onu hızlı ve kaynak verimli yapar.`, resolution: 'Varlık çözünürlüğü', resolutionTip: `Varlık tekilleştirme anahtarı. Etkinleştirildiğinde LLM benzer varlıkları birleştirir - örneğin '2025' ve '2025 yılı' veya 'BT' ve 'Bilgi Teknolojisi' - daha doğru bir grafik oluşturmak için`, community: 'Topluluk raporları', diff --git a/web/src/locales/vi.ts b/web/src/locales/vi.ts index 32552f49e7..1fc63b044b 100644 --- a/web/src/locales/vi.ts +++ b/web/src/locales/vi.ts @@ -348,7 +348,8 @@ export default { tagCloud: 'Đám mây', graphRagMethod: 'Phương pháp', graphRagMethodTip: `Light: Câu lệnh trích xuất thực thể và quan hệ này được lấy từ GitHub - HKUDS/LightRAG: "LightRAG: Tạo sinh tăng cường truy xuất đơn giản và nhanh chóng". - General: Câu lệnh trích xuất thực thể và quan hệ này được lấy từ GitHub - microsoft/graphrag: Một hệ thống Tạo sinh tăng cường truy xuất (RAG) dựa trên đồ thị theo mô-đun.`, + General: Câu lệnh trích xuất thực thể và quan hệ này được lấy từ GitHub - microsoft/graphrag: Một hệ thống Tạo sinh tăng cường truy xuất (RAG) dựa trên đồ thị theo mô-đun. + NER: Sử dụng spaCy NER và trích xuất từ khóa dựa trên quy tắc để trích xuất thực thể và quan hệ. Không cần LLM cho việc trích xuất, giúp nhanh chóng và tiết kiệm tài nguyên.`, useGraphRagTip: 'Xây dựng một biểu đồ tri thức trên các đoạn tệp của cơ sở tri thức hiện tại để tăng cường khả năng trả lời câu hỏi đa bước liên quan đến logic lồng nhau. Xem https://ragflow.io/docs/dev/construct_knowledge_graph để biết thêm chi tiết.', resolution: 'Hợp nhất thực thể', @@ -414,7 +415,7 @@ export default { assistantAvatar: 'Avatar trợ lý', language: 'Ngôn ngữ', emptyResponse: 'Phản hồi trống', - emptyResponseTip: `Nếu không tìm thấy gì với câu hỏi của người dùng trong cơ sở kiến thức, nó sẽ sử dụng điều này làm câu trả lời. Nếu bạn muốn LLM đưa ra ý kiến ​​riêng của mình khi không tìm thấy gì, hãy để trống.`, + emptyResponseTip: `Nếu không tìm thấy gì với câu hỏi của người dùng trong cơ sở kiến thức, nó sẽ sử dụng điều này làm câu trả lời. Nếu bạn muốn LLM đưa ra ý kiến riêng của mình khi không tìm thấy gì, hãy để trống.`, setAnOpener: 'Đặt lời mở đầu', setAnOpenerInitial: `Xin chào! Tôi là trợ lý của bạn, tôi có thể giúp gì cho bạn?`, setAnOpenerTip: 'Bạn muốn chào đón khách hàng của mình như thế nào?', diff --git a/web/src/locales/zh-traditional.ts b/web/src/locales/zh-traditional.ts index 1cc913828e..b4f6b0a1f8 100644 --- a/web/src/locales/zh-traditional.ts +++ b/web/src/locales/zh-traditional.ts @@ -390,7 +390,8 @@ export default { '基於知識庫內所有切好的文本塊構建知識圖譜,用以提升多跳和複雜問題回答的正確率。請注意:構建知識圖譜將消耗大量 token 和時間。詳見 https://ragflow.io/docs/dev/construct_knowledge_graph。', graphRagMethod: '方法', graphRagMethodTip: `Light:實體和關係提取提示來自 GitHub - HKUDS/LightRAG:“LightRAG:簡單快速的檢索增強生成”
- 一般:實體和關係擷取提示來自 GitHub - microsoft/graphrag:基於模組化圖形的檢索增強生成 (RAG) 系統,`, + 一般:實體和關係擷取提示來自 GitHub - microsoft/graphrag:基於模組化圖形的檢索增強生成 (RAG) 系統,
+ NER:使用 spaCy NER 和基於規則的關鍵詞提取來抽取實體和關係,無需 LLM 參與提取過程,速度快且資源消耗低`, resolution: '實體歸一化', resolutionTip: `解析過程會將具有相同意義的實體合併在一起,使知識圖譜更簡潔、更準確。應合併以下實體:川普總統、唐納德·川普、唐納德·J·川普、唐納德·約翰·川普`, community: '社群報告生成', diff --git a/web/src/locales/zh.ts b/web/src/locales/zh.ts index 97ebb5d7c3..9de73326f4 100644 --- a/web/src/locales/zh.ts +++ b/web/src/locales/zh.ts @@ -811,7 +811,8 @@ export default { '基于知识库内所有切好的文本块构建知识图谱,用以提升多跳和复杂问题回答的正确率。请注意:构建知识图谱将消耗大量 token 和时间。详见 https://ragflow.io/docs/dev/construct_knowledge_graph。', graphRagMethod: '方法', graphRagMethodTip: `Light:实体和关系提取提示来自 GitHub - HKUDS/LightRAG:“LightRAG:简单快速的检索增强生成”
-General:实体和关系提取提示来自 GitHub - microsoft/graphrag:基于图的模块化检索增强生成 (RAG) 系统`, +General:实体和关系提取提示来自 GitHub - microsoft/graphrag:基于图的模块化检索增强生成 (RAG) 系统
+NER:使用 spaCy NER 和基于规则的关键词提取来抽取实体和关系,无需 LLM 参与提取过程,速度快且资源消耗低`, resolution: '实体归一化', resolutionTip: `解析过程会将具有相同含义的实体合并在一起,从而使知识图谱更简洁、更准确。应合并以下实体:特朗普总统、唐纳德·特朗普、唐纳德·J·特朗普、唐纳德·约翰·特朗普`, community: '社区报告生成', diff --git a/web/src/pages/dataset/dataset-setting/index.tsx b/web/src/pages/dataset/dataset-setting/index.tsx index afe4c1bea6..36a0c3f89f 100644 --- a/web/src/pages/dataset/dataset-setting/index.tsx +++ b/web/src/pages/dataset/dataset-setting/index.tsx @@ -57,6 +57,7 @@ const initialEntityTypes = [ const enum MethodValue { General = 'general', Light = 'light', + NER = 'ner', } export default function DatasetSettings() {