orbitkit 0.9.22__tar.gz → 0.9.23__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. {orbitkit-0.9.22/orbitkit.egg-info → orbitkit-0.9.23}/PKG-INFO +2 -3
  2. orbitkit-0.9.23/orbitkit/VERSION +1 -0
  3. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_validator/filters/repeated_text.py +61 -6
  4. {orbitkit-0.9.22 → orbitkit-0.9.23/orbitkit.egg-info}/PKG-INFO +2 -3
  5. orbitkit-0.9.22/orbitkit/VERSION +0 -1
  6. {orbitkit-0.9.22 → orbitkit-0.9.23}/LICENSE +0 -0
  7. {orbitkit-0.9.22 → orbitkit-0.9.23}/MANIFEST.in +0 -0
  8. {orbitkit-0.9.22 → orbitkit-0.9.23}/README.md +0 -0
  9. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/__init__.py +0 -0
  10. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/airflow_handler/__init__.py +0 -0
  11. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/airflow_handler/data_preprocessing.py +0 -0
  12. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/airflow_handler/file_flow_entry.py +0 -0
  13. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/airflow_handler/file_flow_entry_process.py +0 -0
  14. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/airflow_handler/file_flow_exit_process.py +0 -0
  15. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/airflow_handler/file_handler.py +0 -0
  16. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/airflow_handler/file_handler_v2.py +0 -0
  17. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/audio_transcoder/__init__.py +0 -0
  18. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/audio_transcoder/netmind_extract_v1.py +0 -0
  19. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/constant/__init__.py +0 -0
  20. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/constant/report_schema.py +0 -0
  21. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/id_srv/__init__.py +0 -0
  22. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/id_srv/id_gen.py +0 -0
  23. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/id_srv/id_perm_like.py +0 -0
  24. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/lark_send/__init__.py +0 -0
  25. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/lark_send/lark.py +0 -0
  26. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/llm_tools/__init__.py +0 -0
  27. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/llm_tools/quick_rag_chat.py +0 -0
  28. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/orbit_type/__init__.py +0 -0
  29. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/orbit_type/doc_4_compile_rule.py +0 -0
  30. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/orbit_type/orbit_type_simple.py +0 -0
  31. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/orbit_type/tools.py +0 -0
  32. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_chunking/__init__.py +0 -0
  33. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_chunking/chunk_fallback.py +0 -0
  34. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_chunking/chunk_plan.py +0 -0
  35. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_chunking/page_limit.py +0 -0
  36. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_chunking/pdf_metadata.py +0 -0
  37. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_embedding/__init__.py +0 -0
  38. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_embedding/pdf_txt_embedding.py +0 -0
  39. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_embedding/pdf_txt_embedding_v2.py +0 -0
  40. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/__init__.py +0 -0
  41. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/a_stock_extractor_v1.py +0 -0
  42. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/exceptions.py +0 -0
  43. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/mineru_demo.py +0 -0
  44. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/pdf_block_extractor_base.py +0 -0
  45. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/pdf_block_extractor_v1.py +0 -0
  46. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/pdf_block_extractor_v2.py +0 -0
  47. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/pdf_extractor_azure.py +0 -0
  48. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/pdf_extractor_minerU_v1.py +0 -0
  49. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/pdf_extractor_netmind_v1.py +0 -0
  50. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/pdf_extractor_netmind_v2.py +0 -0
  51. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/pdf_extractor_netmind_v3.py +0 -0
  52. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor/pdf_extractor_orbit.py +0 -0
  53. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor_simple/__init__.py +0 -0
  54. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor_simple/base.py +0 -0
  55. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor_simple/cloud_provider.py +0 -0
  56. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor_simple/core.py +0 -0
  57. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor_simple/exceptions.py +0 -0
  58. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor_simple/extractors.py +0 -0
  59. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_extractor_simple/utils.py +0 -0
  60. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_pipeline_io/__init__.py +0 -0
  61. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_pipeline_io/cdn.py +0 -0
  62. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_pipeline_io/pg_task_store.py +0 -0
  63. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_quality/__init__.py +0 -0
  64. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_quality/failure_codes.py +0 -0
  65. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_quality/ocr_lang.py +0 -0
  66. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_quality/parse_record.py +0 -0
  67. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_quality/verdict.py +0 -0
  68. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_transformer/__init__.py +0 -0
  69. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_transformer/mineru/__init__.py +0 -0
  70. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_transformer/mineru/backends.py +0 -0
  71. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_transformer/mineru/bbox_rotation.py +0 -0
  72. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_transformer/mineru/result_transformer.py +0 -0
  73. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_validator/__init__.py +0 -0
  74. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_validator/filters/__init__.py +0 -0
  75. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_validator/filters/drop_invalid_bbox.py +0 -0
  76. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_validator/filters/drop_non_text.py +0 -0
  77. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_validator/filters/drop_vlm_artifacts.py +0 -0
  78. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_validator/pipeline.py +0 -0
  79. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_validator/registry.py +0 -0
  80. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_validator/validate.py +0 -0
  81. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_writer/__init__.py +0 -0
  82. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/pdf_writer/pdf_writer_simple.py +0 -0
  83. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/__init__.py +0 -0
  84. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/cache_asset_downloader.py +0 -0
  85. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/common.py +0 -0
  86. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/customize_regix_manager.py +0 -0
  87. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/is_xbrl_structure.py +0 -0
  88. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/secret_manager.py +0 -0
  89. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/universal_extractor.py +0 -0
  90. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_aliyun.py +0 -0
  91. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_aliyun_oss_simple.py +0 -0
  92. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_aws.py +0 -0
  93. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_aws_s3_wrapper.py +0 -0
  94. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_date.py +0 -0
  95. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_html.py +0 -0
  96. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_kafka.py +0 -0
  97. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_md5.py +0 -0
  98. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_selenium.py +0 -0
  99. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_simple_timer.py +0 -0
  100. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_str.py +0 -0
  101. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_type_mapping.py +0 -0
  102. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit/util/util_url.py +0 -0
  103. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit.egg-info/SOURCES.txt +0 -0
  104. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit.egg-info/dependency_links.txt +0 -0
  105. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit.egg-info/not-zip-safe +0 -0
  106. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit.egg-info/requires.txt +0 -0
  107. {orbitkit-0.9.22 → orbitkit-0.9.23}/orbitkit.egg-info/top_level.txt +0 -0
  108. {orbitkit-0.9.22 → orbitkit-0.9.23}/setup.cfg +0 -0
  109. {orbitkit-0.9.22 → orbitkit-0.9.23}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.2
2
2
  Name: orbitkit
3
- Version: 0.9.22
3
+ Version: 0.9.23
4
4
  Summary: This project is only for Orbit Tech internal use.
5
5
  Home-page: https://github.com/clown-0726/orbitkit
6
6
  Author: Lilu Cao
@@ -45,7 +45,6 @@ Dynamic: description
45
45
  Dynamic: description-content-type
46
46
  Dynamic: home-page
47
47
  Dynamic: license
48
- Dynamic: license-file
49
48
  Dynamic: maintainer
50
49
  Dynamic: maintainer-email
51
50
  Dynamic: platform
@@ -0,0 +1 @@
1
+ 0.9.23
@@ -32,6 +32,14 @@ VLM/OCR 偶发在一个 block 里把某个短语连续复读很多次,例如::
32
32
  filter**,因此质量闸门的复读退化率始终反映真实情况。它同时给出每个退化块的
33
33
  **命中详情**(复读短语 / 重复次数 / 文本片段),进 ``x_parse_record`` 后
34
34
  「退化率 0.054 该不该判死」才成为可复核的判断,而不是只有一个数字。
35
+
36
+ **不算复读的重复**(表格 / 图表 markdown 里成行出现是常态,不是模型退化):
37
+
38
+ 1. markdown 表格分隔行 ``| --- | --- | --- |``——语法而非内容,整行不参与判定;
39
+ 2. 占位符 / 空值 token(``-`` ``—`` ``na`` ``N/A`` ``none`` ``|`` 纯标点等)
40
+ 对检测**透明**:既不计入短语,也不打断短语;
41
+ 3. 复读短语必须含至少一个**实词**(≥2 个字母 / 汉字),纯数字、纯符号的
42
+ 重复(``0 0 0 0``、``... ... ...``)不算。
35
43
  """
36
44
 
37
45
  from __future__ import annotations
@@ -57,6 +65,21 @@ _MIN_BLOCK_WORDS = 4
57
65
 
58
66
  _WORD_RE = re.compile(r"\S+")
59
67
 
68
+ # markdown 表格分隔行:| --- | :---: | ---: |(也允许无首尾竖线)
69
+ _MD_SEPARATOR_LINE_RE = re.compile(r"^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)*\|?\s*$")
70
+
71
+ # 占位符 / 空值 token(小写比较):表格里成行出现是常态,对复读检测透明
72
+ _PLACEHOLDER_TOKENS = frozenset(
73
+ {
74
+ "na", "n/a", "n.a.", "n.a", "nan", "none", "non", "null", "nil",
75
+ "nm", "n.m.", "tbd", "tba", "n/d", "nd", "无", "暂无", "不适用",
76
+ "0", "0.0", "0.00", "0%", "0.0%", "0.00%",
77
+ }
78
+ )
79
+
80
+ # 实词:至少 2 个字母 / 汉字(含带重音的拉丁字母、日文、韩文等)
81
+ _REAL_WORD_RE = re.compile(r"[^\W\d_]{2,}")
82
+
60
83
  # 样本片段截断长度:只为让人判断「是真复读还是页眉/表头」,不做内容留存
61
84
  _SAMPLE_CHARS = 160
62
85
 
@@ -78,6 +101,38 @@ def _tokenize(text: str) -> Tuple[List[str], List[Tuple[int, int]]]:
78
101
  return words, spans
79
102
 
80
103
 
104
+ def _is_placeholder(word: str) -> bool:
105
+ """占位符 / 空值 / 纯标点 token:对复读检测透明。"""
106
+ if not any(ch.isalnum() for ch in word):
107
+ return True # 纯符号:| - — … / * ○ √ × ...
108
+ return word.lower() in _PLACEHOLDER_TOKENS
109
+
110
+
111
+ def _content_tokens(text: str) -> Tuple[List[str], List[Tuple[int, int]]]:
112
+ """复读检测用的词序列:剔除 markdown 分隔行与占位符 token。
113
+
114
+ 返回的 spans 仍是**原串**字符区间,trim 据此在原串上挖段;被剔除的 token
115
+ 不出现在序列里,因此既不计入短语也不打断短语。
116
+ """
117
+ words: List[str] = []
118
+ spans: List[Tuple[int, int]] = []
119
+ offset = 0
120
+ for line in text.splitlines(keepends=True):
121
+ if not _MD_SEPARATOR_LINE_RE.match(line):
122
+ for m in _WORD_RE.finditer(line):
123
+ word = m.group(0)
124
+ if _is_placeholder(word):
125
+ continue
126
+ words.append(word)
127
+ spans.append((offset + m.start(), offset + m.end()))
128
+ offset += len(line)
129
+ return words, spans
130
+
131
+
132
+ def _has_real_word(phrase: Sequence[str]) -> bool:
133
+ return any(_REAL_WORD_RE.search(w) for w in phrase)
134
+
135
+
81
136
  def _find_runaway_repeats(
82
137
  words: List[str], *, max_n: int, min_reps: int
83
138
  ) -> List[Tuple[int, int, int]]:
@@ -99,7 +154,7 @@ def _find_runaway_repeats(
99
154
  while j + n <= n_words and words[j : j + n] == words[i : i + n]:
100
155
  reps += 1
101
156
  j += n
102
- if reps >= min_reps:
157
+ if reps >= min_reps and _has_real_word(words[i : i + n]):
103
158
  candidates.append((reps * n, i, n))
104
159
  reps_of[(i, n)] = reps
105
160
  i = j # 跳过整段,避免重复检测子段
@@ -139,7 +194,7 @@ def has_runaway_repetition(
139
194
  只判定、不改文本,供统计「退化块占比」用。短于 ``min_words`` 的文本一律
140
195
  返回 ``False``(真实短句可能有正常重复)。
141
196
  """
142
- words, _ = _tokenize(text or "")
197
+ words, _ = _content_tokens(text or "")
143
198
  if len(words) < min_words:
144
199
  return False
145
200
  return bool(_find_runaway_repeats(words, max_n=max_n, min_reps=min_reps))
@@ -215,7 +270,7 @@ def find_degenerate_blocks(blocks: Sequence[dict]) -> Dict[int, Sample]:
215
270
  found: Dict[int, Sample] = {}
216
271
  for i, b in enumerate(blocks):
217
272
  text = b.get("sentence") or ""
218
- words, spans = _tokenize(text)
273
+ words, spans = _content_tokens(text)
219
274
  if len(words) < _MIN_WORDS:
220
275
  continue
221
276
  run = _find_runaway_repeat(words, max_n=_MAX_N, min_reps=_MIN_REPS)
@@ -297,7 +352,7 @@ def trim_repeated_text(block: dict) -> Optional[dict]:
297
352
  (可能是合法用词),删掉其余重复。
298
353
  """
299
354
  text = block.get("sentence") or ""
300
- words, spans = _tokenize(text)
355
+ words, spans = _content_tokens(text)
301
356
  if len(words) < _MIN_WORDS:
302
357
  return block
303
358
 
@@ -321,7 +376,7 @@ def trim_repeated_text(block: dict) -> Optional[dict]:
321
376
  def drop_repeated_text(block: dict) -> Optional[dict]:
322
377
  """复读段主导整块(覆盖词数占比 ≥ 阈值)时整块丢弃,否则保留。"""
323
378
  text = block.get("sentence") or ""
324
- words, _spans = _tokenize(text)
379
+ words, _spans = _content_tokens(text)
325
380
  if len(words) < _MIN_WORDS:
326
381
  return block
327
382
 
@@ -332,4 +387,4 @@ def drop_repeated_text(block: dict) -> Optional[dict]:
332
387
  covered = sum(n * reps for _start, n, reps in runs)
333
388
  if covered / len(words) >= _DROP_COVER_FRACTION:
334
389
  return None
335
- return block
390
+ return block
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.2
2
2
  Name: orbitkit
3
- Version: 0.9.22
3
+ Version: 0.9.23
4
4
  Summary: This project is only for Orbit Tech internal use.
5
5
  Home-page: https://github.com/clown-0726/orbitkit
6
6
  Author: Lilu Cao
@@ -45,7 +45,6 @@ Dynamic: description
45
45
  Dynamic: description-content-type
46
46
  Dynamic: home-page
47
47
  Dynamic: license
48
- Dynamic: license-file
49
48
  Dynamic: maintainer
50
49
  Dynamic: maintainer-email
51
50
  Dynamic: platform
@@ -1 +0,0 @@
1
- 0.9.22
File without changes
File without changes
File without changes
File without changes
File without changes