feat: add notion-corpus-loader hldp_parser.py
This commit is contained in:
parent
6fefe416a5
commit
5fda7593de
163
tools/notion-corpus-loader/src/hldp_parser.py
Normal file
163
tools/notion-corpus-loader/src/hldp_parser.py
Normal file
@ -0,0 +1,163 @@
|
||||
# HLDP解析器 · 识别光湖语言结构标记
|
||||
# HLDP://tools/notion-corpus-loader/hldp-parser
|
||||
|
||||
import re
|
||||
from dataclasses import dataclass, field
|
||||
from typing import List, Optional
|
||||
|
||||
@dataclass
|
||||
class HLDPBlock:
|
||||
"""一个HLDP结构块"""
|
||||
path: str = ""
|
||||
block_type: str = ""
|
||||
content: str = ""
|
||||
cognitive_jump: Optional[str] = None
|
||||
causal_chain: Optional[str] = None
|
||||
persona: Optional[str] = None
|
||||
quality_tag: Optional[str] = None
|
||||
metadata: dict = field(default_factory=dict)
|
||||
|
||||
class HLDPParser:
|
||||
"""解析HLDP格式的Markdown/HTML内容"""
|
||||
|
||||
HLDP_PATH_PATTERN = re.compile(r'HLDP://([\w/-]+)')
|
||||
|
||||
COGNITIVE_JUMP_PATTERNS = [
|
||||
re.compile(r'【认知[跃迁升]*[级点]*】'),
|
||||
re.compile(r'⚠️\s*([^·\n]{3,30})'),
|
||||
re.compile(r'核心[认知跃迁]*[::]\s*(.+)'),
|
||||
re.compile(r'_why[::]\s*(.+)'),
|
||||
]
|
||||
|
||||
CAUSAL_PATTERNS = [
|
||||
re.compile(r'(起点|推导链|终点)[::]\s*(.+)'),
|
||||
re.compile(r'(.+?)\s*→\s*(.+?)\s*→\s*(.+)'),
|
||||
]
|
||||
|
||||
PERSONA_PATTERNS = [
|
||||
re.compile(r'主权者[::]\s*冰朔.*TCS-0002'),
|
||||
re.compile(r'人格体[::]\s*(铸渊|霜砚|晨星|舒舒|曜冥|知秋)'),
|
||||
re.compile(r'(冰朔|霜砚|铸渊|晨星|舒舒)\s*(口述|整理|创建|记录|签发)'),
|
||||
]
|
||||
|
||||
QUALITY_PATTERNS = [
|
||||
re.compile(r'CORPUS-ID[::]\s*(\S+)'),
|
||||
re.compile(r'语料类型[::]\s*(.+)'),
|
||||
re.compile(r'(极高|高|中|低)\s*(?:权重|质量)'),
|
||||
]
|
||||
|
||||
def parse_markdown(self, text: str) -> List[HLDPBlock]:
|
||||
"""解析Markdown文本为HLDP结构块"""
|
||||
blocks = []
|
||||
lines = text.split('\n')
|
||||
i = 0
|
||||
while i < len(lines):
|
||||
line = lines[i].strip()
|
||||
if not line:
|
||||
i += 1
|
||||
continue
|
||||
block = HLDPBlock()
|
||||
heading_match = re.match(r'^(#{1,4})\s+(.+)', line)
|
||||
if heading_match:
|
||||
block.block_type = f'heading_{len(heading_match.group(1))}'
|
||||
block.content = heading_match.group(2)
|
||||
blocks.append(block)
|
||||
i += 1
|
||||
continue
|
||||
if line.startswith('```'):
|
||||
code_lines = []
|
||||
i += 1
|
||||
while i < len(lines) and not lines[i].strip().startswith('```'):
|
||||
code_lines.append(lines[i])
|
||||
i += 1
|
||||
block.block_type = 'code_block'
|
||||
block.content = '\n'.join(code_lines)
|
||||
blocks.append(block)
|
||||
i += 1
|
||||
continue
|
||||
if line.startswith('> '):
|
||||
block.block_type = 'quote'
|
||||
block.content = line[2:]
|
||||
blocks.append(block)
|
||||
i += 1
|
||||
continue
|
||||
for emoji in ['📢', '💡', '⚠️']:
|
||||
if line.startswith(emoji):
|
||||
block.block_type = 'callout'
|
||||
block.content = line
|
||||
blocks.append(block)
|
||||
i += 1
|
||||
continue
|
||||
if '[子页面]' in line:
|
||||
block.block_type = 'child_page'
|
||||
block.content = line
|
||||
blocks.append(block)
|
||||
i += 1
|
||||
continue
|
||||
if re.match(r'^[-*]\s', line):
|
||||
block.block_type = 'list_item'
|
||||
block.content = line
|
||||
blocks.append(block)
|
||||
i += 1
|
||||
continue
|
||||
if line == '---':
|
||||
block.block_type = 'divider'
|
||||
blocks.append(block)
|
||||
i += 1
|
||||
continue
|
||||
block.block_type = 'paragraph'
|
||||
block.content = line
|
||||
blocks.append(block)
|
||||
i += 1
|
||||
for block in blocks:
|
||||
self._extract_hldp_annotations(block)
|
||||
return blocks
|
||||
|
||||
def _extract_hldp_annotations(self, block: HLDPBlock):
|
||||
text = block.content
|
||||
path_match = self.HLDP_PATH_PATTERN.search(text)
|
||||
if path_match:
|
||||
block.path = path_match.group(0)
|
||||
for pattern in self.COGNITIVE_JUMP_PATTERNS:
|
||||
match = pattern.search(text)
|
||||
if match:
|
||||
block.cognitive_jump = match.group(1) if match.lastindex else match.group(0)
|
||||
break
|
||||
for pattern in self.CAUSAL_PATTERNS:
|
||||
match = pattern.search(text)
|
||||
if match:
|
||||
block.causal_chain = match.group(0)
|
||||
break
|
||||
for pattern in self.PERSONA_PATTERNS:
|
||||
match = pattern.search(text)
|
||||
if match:
|
||||
block.persona = match.group(0)
|
||||
break
|
||||
for pattern in self.QUALITY_PATTERNS:
|
||||
match = pattern.search(text)
|
||||
if match:
|
||||
block.quality_tag = match.group(0)
|
||||
break
|
||||
|
||||
def parse_html(self, html: str) -> List[HLDPBlock]:
|
||||
text = html
|
||||
text = re.sub(r'<[^>]+>', '', text)
|
||||
text = re.sub(r' ', ' ', text)
|
||||
text = re.sub(r'<', '<', text)
|
||||
text = re.sub(r'>', '>', text)
|
||||
text = re.sub(r'&', '&', text)
|
||||
return self.parse_markdown(text)
|
||||
|
||||
def build_cognitive_chain(self, blocks: List[HLDPBlock]) -> List[dict]:
|
||||
jumps = []
|
||||
for block in blocks:
|
||||
if block.cognitive_jump:
|
||||
jumps.append({'jump_point': block.cognitive_jump, 'context': block.content[:200], 'hldp_path': block.path, 'persona': block.persona})
|
||||
return jumps
|
||||
|
||||
def build_causal_chains(self, blocks: List[HLDPBlock]) -> List[str]:
|
||||
chains = []
|
||||
for block in blocks:
|
||||
if block.causal_chain:
|
||||
chains.append(block.causal_chain)
|
||||
return chains
|
||||
Loading…
x
Reference in New Issue
Block a user