1. 先搞清楚依存句法解析到底在解一个什么题前阵子接到一个需求从几万条客服工单里自动提取某设备坏了之后由谁负责维修这类三元组。我第一反应是上实体识别加正则匹配毕竟句式看着挺固定。真正跑通一轮之后才发现问题远没有这么简单——同一句话换个主语位置、加个时间状语、嵌套一个定语从句规则就全乱了。最后还是老老实实回到依存句法解析Dependency Parsing这条路上把每个词在句子里的骨架关系先抽出来再往下做抽取。很多刚接触自然语言处理的朋友会把依存句法解析当成画一棵好看的树觉得这是给语言学专业准备的和工程没什么关系。这个印象是大错特错的。依存句法解析的核心任务是对于一句自然语言判断出每个词之间的头-从属关系也就是回答三个朴素的问题——谁是动作的发出者谁是动作的承受者修饰成分挂在哪个中心词下面一旦这两个问题的答案确定了一句话的语义骨架也就出来了后面不管是做关系抽取、情感分析、问答系统还是机器翻译的调序都有了一个非常稳定的中间表达。举个例子这只小猫在花园里追逐那只蝴蝶这句话人和人读起来毫不费力就能知道追逐是小猫发的蝴蝶是被追的在花园里修饰的是追逐这个动作发生的地点。但要让机器知道这件事必须把词和词之间的关系显式地表达出来。依存句法解析输出的就是一张有向树结构根节点是谓语追逐主语小猫挂在它下面宾语蝴蝶也挂在它下面状语在花园里同样挂在它下面。有了这棵树下游任务不需要再去猜谁修谁直接从边上读就行。这篇文章我打算把自己从原理到实战踩过的坑都梳理一遍。适合的人群是正在做信息抽取、知识图谱相关项目的工程师以及刚入门自然语言处理、想搞懂句法分析到底是怎么回事的学生。我会用尽量直白的语言把两类主流算法的核心思想讲清楚然后给出一套可以照着跑的实操流程最后重点聊聊那些文档里不会写、但项目上几乎一定会碰到的坑。1.1 从三个要素理解依存关系到底在存什么依存句法解析的输出通常是一棵带标签的有向树。树上的每个节点对应句子中的一个词每条有向边从中心词指向从属词边上的标签就是这个关系的类型。和短语结构句法不同依存句法不关心哪个词组套哪个词组而是直接关心哪个词决定了哪个词的存在。一个词如果没有中心词在句子里就是一个孤立的词整棵树的根通常是句子的谓语中心词中文里很多时候由动词充当。可以这样理解短语结构树是把一句话拆成零件清单依存树是直接画出装配关系图。零件清单告诉你有哪些部件但装配关系图告诉你哪个零件固定在哪个零件上。做信息抽取这类任务时后者明显更实用因为它天然地把主语、宾语、状语这些语义角色从语法位置上剥离出来了。依存关系标签体系在不同语料上有差异常见的一套包括主谓关系SBV、动宾关系VOB、定中关系ATT、状中关系ADV等。英文资源里常见的对应概念是 nsubj、dobj、amod、advmod 这类标签。无论标签怎么命名底层逻辑是一致的每个从属词都必须且只能有一个头根节点除外树的边不能成环整棵树的根节点唯一。这四条约束合在一起保证了任何合法解析结果一定是一棵有向树不会出现这个词既归你管又归他管的混乱局面。1.2 和短语结构树相比依存树为什么更适合工程我刚开始做项目时也犹豫过要不要用短语结构句法来替代。后来对比下来发现工