Files
tps-dashboard/ai-labeling/scripts/import_transcripts.py
T

120 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
import_transcripts.py - 将源目录的 10 期文稿(docx/伪docx)导入到 benchmark-set/transcripts/
用法: python scripts/import_transcripts.py
"""
import re
import sys
from pathlib import Path
from docx import Document
# ===== 配置 =====
SRC_DIR = Path(r"E:\TPS-我和顾问的便签\刘瑞桦收集")
DST_DIR = Path(__file__).parent.parent / "benchmark-set" / "transcripts"
DST_DIR.mkdir(parents=True, exist_ok=True)
# 映射表: 源文件名 → 目标文件名
# (注意:源文件名中的标点/空格与预期不同,已据实更新)
FILE_MAP = [
("硅基大脑终稿.docx", "ep03_硅基大脑.md"),
("潜艇的仿生之路.docx", "ep04_潜艇仿生.md"),
("马年军事图鉴0125.docx", "ep07_马年图鉴.md"),
("\u300a枪械射速决定论\u300b0225.docx", "ep10_射速决定论.md"),
("完稿 武器进化论\uff1a空战颠覆者.docx", "ep11_空战颠覆者.md"),
("逆袭战局的组装武器.docx", "ep12_逆袭战局.md"),
("枪械设计中的长短智慧总稿.docx", "ep13_长短智慧.md"),
("\u201cX\u201d系列新成员\uff1aX-76飞机-最终稿.docx", "ep14_X76飞机.md"),
("空中坚盾\u2014\u2014解码现代防空网.docx", "ep15_空中坚盾.md"),
# .doc 文件(改 .docx 后重试)
("舰证不凡_docx版.docx", "ep05_舰证不凡.md"),
]
# ===== 配置 =====
def is_real_docx(path: Path) -> bool:
"""通过前 4 字节判断是否为真 docxZIP 格式)"""
try:
with open(path, "rb") as f:
header = f.read(4)
return header == b"PK\x03\x04"
except Exception:
return False
def extract_text_real_docx(path: Path) -> str:
"""用 python-docx 提取真 docx 段落文本"""
doc = Document(str(path))
paragraphs = []
for para in doc.paragraphs:
text = para.text.strip()
if text:
paragraphs.append(text)
return "\n\n".join(paragraphs)
def extract_text_fake_docx(path: Path) -> str:
"""伪 docx(实际是 UTF-8 纯文本),直接读取"""
return path.read_text(encoding="utf-8")
def clean_text(text: str) -> str:
"""清洗文本:去掉 **Markdown 强调**,合并连续空行"""
# 去掉 ** ... ** 强调符号,保留中间文字
text = re.sub(r"\*\*(.+?)\*\*", r"\1", text)
# 去掉 * ... * 斜体(如果还有残留)
text = re.sub(r"\*(.+?)\*", r"\1", text)
# 连续 3 个以上空行合并为 2 个
text = re.sub(r"\n{3,}", "\n\n", text)
return text.strip()
def process_file(src_name: str, dst_name: str) -> tuple[bool, str]:
"""处理单个文件,返回 (是否成功, 消息)"""
src_path = SRC_DIR / src_name
if not src_path.exists():
return False, f"源文件不存在: {src_name}"
try:
if is_real_docx(src_path):
raw_text = extract_text_real_docx(src_path)
else:
raw_text = extract_text_fake_docx(src_path)
clean_text_str = clean_text(raw_text)
dst_path = DST_DIR / dst_name
dst_path.write_text(clean_text_str, encoding="utf-8")
char_count = len(clean_text_str)
return True, f"OK ({char_count} 字符)"
except Exception as e:
return False, f"解析失败: {e}"
def main():
print(f"源目录: {SRC_DIR}")
print(f"目标目录: {DST_DIR}")
print(f"待处理: {len(FILE_MAP)}\n")
results = []
for src_name, dst_name in FILE_MAP:
ok, msg = process_file(src_name, dst_name)
results.append((src_name, dst_name, ok, msg))
status = "[OK]" if ok else "[FAIL]"
print(f" {status} {src_name} -> {dst_name} {msg}")
# 汇总
success = sum(1 for r in results if r[2])
fail = len(results) - success
print(f"\n===== 汇总 =====")
print(f"成功: {success}/{len(results)}")
if fail > 0:
print("失败文件:")
for src, dst, ok, msg in results:
if not ok:
print(f" - {src}")
else:
print("全部成功!")
if __name__ == "__main__":
main()