
SceneGraphParser精准解析的秘密DFS树遍历如何处理限定词、形容词与复合名词【免费下载链接】SceneGraphParserA python toolkit for parsing captions (in natural language) into scene graphs (as symbolic representations).项目地址: https://gitcode.com/gh_mirrors/sc/SceneGraphParserSceneGraphParser包名sng_parser是一个纯 Python 实现的场景图解析工具包它能用 spaCy 做依赖句法分析再通过一套人工规则把自然语言句子解析成场景图scene graph——节点是被限定词、形容词、复合词修饰的名词短语边是名词之间的关系。理解它精准解析的秘密核心就在于对依存树做的一次DFS 树遍历。 场景图长什么样先看一个例子安装后只需两行代码pip install SceneGraphParser python -m spacy download en # 下载英文模型import sng_parser graph sng_parser.parse(A woman is playing the piano in the room.) sng_parser.tprint(graph) # 表格化可视化结果输出会分成两张表Entities实体HeadSpanModifierswomana womanapianothe pianotheroomthe roomtheRelations关系SubjectRelationObjectwomanplayingpianowomaninroom可以看到a、the这些**限定词determinant**被精确地从主语身上剥离出来作为修饰语挂在实体节点上而不是混进名词本身。这正是 DFS 遍历的功劳。⚙️ 三步解析流水线核心逻辑全部在 sng_parser/backends/spacy_parser.py 中整个解析分三步找实体遍历 spaCy 识别出的所有名词短语noun chunks忽略代词并对每个短语做一次 DFS 树遍历收集修饰语定主语根据nsubj、acl、pobjpass等依存关系确定每个动词的主语包括被动句翻转建关系把实体之间的动词、介词短语含 in front of 这类短语介词组装成关系边。 重点拆解DFS 遍历如何处理三类修饰语对每个名词短语解析器从**中心名词entity.root**出发做深度优先搜索按依存类型分派处理def dfs(node): if node not in visited_nodes: # 防御依存图偶发成环 visited_nodes.add(node) for x in node.children: if x.dep_ det: # 限定词 → 记为修饰语 elif x.dep_ nummod: # 数量词 → 记为修饰语 elif x.dep_ amod: # 形容词 → 记为修饰语并列结构会被展开 elif x.dep_ compound: # 复合名词 → 拼进 head并继续 dfs三种处理策略各不相同正是精准二字的来源1️⃣ 限定词det与数量词nummod——只记录不改头词a、the、two这类词不改变名词的含义主体DFS 遇到它们时只把{dep, span, lemma_span}追加进modifiers列表。所以实体头词依然是woman而完整跨度是a woman。2️⃣ 形容词amod——记录并展开并列结构遇到形容词修饰语时解析器会调用内部的__flatten_conjunction辅助函数把 redandold 这种并列形容词拆开逐个记录避免遗漏任何一个修饰成分。3️⃣ 复合名词compound——合并进头词并递归这是最特殊的一类复合名词的第二部分本身就是新的复合词。例如官方示例句 A woman is playing thespace craftat NASA. 中spaCy 认为craft的复合修饰语是space。DFS 的处理是把space直接拼接到头词前面head space craft然后对space节点继续 dfs以处理更长的复合词链式复合。对比两种策略就能看出设计巧思det/amod是剥离式修饰记下来头词不变compound是融合式修饰头词本身被重新定义。4️⃣ 附加彩蛋场景名词识别DFS 结束后解析器还会拿拼接好的lemma_head去查内置词典 sng_parser/_data/scene-nouns.txt收录 400 个场景类名词如 airport、amusement park命中则给实体打上type: scene标签——这源于其出处CVPR 2019 论文《Unified Visual-Semantic Embeddings》。 内置规则词典一览精准度还来自三份随包发布的规则数据加载逻辑在sng_parser/database.py数据文件规模用途sng_parser/_data/phrasal-verbs.txt1771 条识别 play with 等短语动词正确生成关系边sng_parser/_data/phrasal-preps.txt11 条识别 in front of 等短语介词解析方位关系sng_parser/_data/scene-nouns.txt401 条场景名词分类标签被动句、方位句、分词句等边角情况The piano is played by a woman.同样由parse方法中一组针对依存结构的显式规则覆盖。 快速上手与进阶配置最简单方式直接调用全局单例sng_parser.parse(sentence)任何地方随用随取自定义后端sng_parser.Parser(spacy, modelen_core_web_sm)通过构造参数切换 spaCy 模型以支持其他语言参见 sng_parser/parser.py扩展后端继承ParserBackendsng_parser/backends/backend.py用Parser.register_backend装饰器注册即可表格输出sng_parser.tprint(graph)实现见sng_parser/utils.py可交互 Demoexample/demo.py内置了 10 个测试句并支持手动输入是观察各种边角情况解析结果的最好入口想获取源码研究细节可克隆仓库git clone https://gitcode.com/gh_mirrors/sc/SceneGraphParser✅ 小结为什么它的解析是精准的限定词/数量词DFS 遍历中剥离为修饰语头词保持纯净形容词记录修饰语并列结构逐词展开复合名词递归合并进头词天然支持链式复合规则可配置短语动词、短语介词、场景名词全部由词典文件驱动易于扩充。需要提醒的是解析基于人工规则作者也在 README.md 中明确表示欢迎提交失败/边角案例的报告API 仍在演进中。对于想理解句子 → 场景图这条完整链路的读者从spacy_parser.py里的dfs函数读起是最短的路径。【免费下载链接】SceneGraphParserA python toolkit for parsing captions (in natural language) into scene graphs (as symbolic representations).项目地址: https://gitcode.com/gh_mirrors/sc/SceneGraphParser创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考