简介:一份关于改进BERT算法在专利实体抽取领域应用的学术论文PDF,聚焦石墨烯制备技术案例,面向自然语言处理、专利分析与知识图谱方向的研究人员与工程师,可解决传统串行实体关系抽取效率低、精度有限等问题。资源为单个PDF文件,压缩包大小约1.55MB,内容为完整期刊论文,包含中英文摘要、关键词、正文与参考文献。文中提出两种改进算法:将中文特征与句法语义特征结合的BERT-BiLSTM-CRF命名实体识别算法,以及以注意力机制增强语义建模的实体关系抽取算法,并在石墨烯专利数据上完成数值实验,验证其能高效解析专利文本、揭示企业技术动态演化过程,进而服务于专利新颖性判断与知识图谱构建。已有143人学习浏览,适合从事专利文本挖掘、技术演化分析及实体抽取方法研究的读者参考借鉴。
1. 专利实体抽取为什么难:串行管线失效背后的误差接力
很多人以为命名实体识别(NER)是个被 BERT 解决得差不多的老问题,但一旦落到专利文本上,结论就完全不一样。这篇以石墨烯制备技术为例的研究给出的对比数据很反直觉:传统的 CRF+依存句法方案,精确率只有 25.18%,召回率 27.84%,F1 值为 26.44%;而改进后的 BERT-BiLSTM-CRF 结合注意力与句法关系的方案,F1 值达到了 61.03%,几乎是前三者的两倍以上。差距之所以如此悬殊,不是因为 CRF 模型本身弱,而是因为专利文本里的实体不是人名、地名、机构名,而是氧化石墨烯、真空泵、旋转床这类领域术语,且真正要抽取的对象是「动宾关系二元组」——一种和通用 NER 任务完全不同的问题定义。理解这次改进,核心不是背诵 BERT 的 Transformer 结构,而是搞明白三件事:串行流程为什么要拆、特殊符号怎么把实体位置告诉模型、以及为什么在 BERT 之上还要再加 BiLSTM 和 CRF。
2. 专利里的实体关系是什么:动宾二元组、句法依存与 CRF 的边界
2.1 专利实体不是人名地名:动宾二元组才是新颖性的骨架
通用 NER 任务关注的是 PER、LOC、ORG、TIME 这类封闭类别,但专利文本的价值载体完全不同。一篇石墨烯制备专利的说明书和权利要求书里,核心不是「谁在哪做了什么」,而是「用什么材料、经过什么操作、得到什么产物」。论文把这种结构定义为动宾关系二元组,例如<得到,氧化石墨烯分散液>、<配制,镁盐溶液>、<加入,碱溶液>。实体内容指化学材料、实验器材,如氧化石墨烯、碳纤维、烘箱、真空泵,它们本身并不承载创新性,创新性体现在「操作 + 操作对象」的组合:同一种材料的不同操作方式、不同操作顺序,才是专利的新颖性所在。
这个定义对后续所有模型设计都是决定性的。传统信息抽取会把「实体识别」和「关系识别」当作两个独立阶段,但专利场景真正需要的是把整条工艺流程序列抽出来——从「将氧化石墨烯于水中分散,得到氧化石墨烯分散液」这句话里,不仅要知道氧化石墨烯是实体,还要知道它与「得到」构成动宾关系。这意味着实体边界和关系类型是强耦合的:先识别实体但不懂句法,后面关系分类必然出错;先做句法分析但实体边界错了,依存关系再准也白搭。理解了这个耦合,才能理解后面为什么要用 $ 和 # 符号把实体位置显式锚定进 BERT。
2.2 传统串行框架:CRF 分词、词性标注与依存句法树的误差接力
论文梳理的传统框架是一条典型的串行流水线:输入原始句子后,先是分词,然后去停用词、词性标注,再做命名实体识别,得到文本序列标注,进入实体集识别,最后做多实体嵌入和关系识别。这套流程里,分词用的是 CRF 分词语料训练出来的模型,并采用类似最大匹配的思想——专利分析不依赖特定词语,所以把包含最长字符词的长度信息提供给统计模型,让分词器更倾向识别专利中的长术语。
分词之后紧接着是句法分析。论文表 1 列出的句法依存关系包括主谓关系(SBV)、动宾关系(VOB)、间宾关系(IOB)、前置宾语(FOB)、兼语(DBL)、定中关系(ATT)、状中结构(ADV)、动补结构(CMP)、并列关系(COO)、介宾关系(POB)、左附加关系(LAD)、右附加关系(RAD)、独立结构(IS)和核心关系(HED)。句法分析树用于明确每个词汇和短语在句子结构中承担的作用,帮助识别最有可能与关系特征词构成关系的实体对。这套思路本身没有错,问题出在「接力」上。
我用一个例子说明误差是怎么传染的:如果第一步分词把「氧化石墨烯分散液」切成了「氧化」「石墨烯」「分散液」,实体边界就被破坏了;到了句法分析阶段,依存关系可能把「分散」误判为谓语中心词,动宾关系提取出的元组就变成了<分散,石墨烯>,而不是正确的<得到,氧化石墨烯分散液>。更麻烦的是词性标注错误——中文里「分散」既是动词又是形容词,NLP 工具一旦把它标注成形容词,后面的依存分析会连锁出错。论文明确指出,使用 NLP 处理工具提取出来的词汇信息往往会出错,这些错误特征会对实体关系抽取结果产生不利影响。串行架构的每一级都在向下一级传递「已确认的错误」,而且没有回退机制。
2.3 CRF 的边界:它擅长序列标注,但不擅长语义理解
前面引用的早期研究大多围绕词典、规则、模板和条件随机场展开,王密平等人的工作甚至用不完备语料库、无人工参与,让 CRF 对字进行角色标注来识别术语。这类方法的共同假设是:实体可以通过字符模式和上下文统计特征来识别。CRF 确实擅长这一点——它能把 B-ORG 这种 BIO 标签序列的转移概率建模出来,避免出现「B-ORG 后面直接跟 I-PER」这种非法标注。
但专利实体抽取的核心瓶颈不是标签转移非法,而是语义角色混乱。CRF 只能看到字面特征窗口,它不知道「提供氢氧化镁石墨烯复合材料」和「得到氧化石墨烯分散液」里,「提供」和「得到」虽然都是动词,但在工艺流程序列里的语义功能不同——一个是输入原料,一个是生成产物。论文用「动宾关系」来统一这两类,但 CRF 加依存句法树的方法没有能力区分「提供」这个动作的宾语是不是真正的产物实体。实验结果也印证了这一点:CRF+依存句法的精确率只有 25.18%,意味着它抽取出的关系里四分之三是噪声。这不是调参能解决的,是特征表达能力的上限。
3. BERT-BiLSTM-CRF:为什么预训练特征之上还要再叠双向LSTM和CRF
3.1 BERT 输入表征:token、segment、position 三种 embedding 求和
论文用的 BERT 是典型的 Transformer encoder 结构,通过联合调节所有层中的双向 Transformer 来预训练深度双向表示。这里的关键不是"双向"这个口号,而是它的输入构造方式。论文图 4 展示了输入表征的四个组成部分:token embeddings、segment embeddings、position embeddings,三者和加后进入 Trm 层。第一个 token 永远是 [CLS],它的输出向量可以作为整个句子的聚合表示,用于分类任务;句子之间用 [SEP] 分隔。
这里面有个容易被忽略的细节:position embeddings 是学习出来的,不是用正弦函数算出来的固定编码。对专利抽取任务来说,实体在句子中的位置本身就是关键信息——「A 得到 B」和「B 得到 A」是完全不同的工艺步骤,位置编码的区分能力直接决定了模型能不能捕捉这种顺序敏感。BERT 支持的最大序列长度是 512,这对专利权利要求这种长句是个硬约束,后面避坑部分会专门展开。
3.2 为什么要加 BiLSTM 和 CRF:序列上下文与标签合法性约束
很多新手会问:BERT 已经用 Transformer 编码了整个句子,为什么还要在它后面接 BiLSTM 再叠 CRF?答案是三个模块各管一段:BERT 输出的 H 向量已经包含了丰富的上下文语义,但它是「每个 token 独立编码」的结果,没有显式建模标签之间的依赖关系;BiLSTM 在前向和后向两个方向再做一次序列聚合,把「前文信息向量」和「后文信息向量」融合,强化句子层面的序列特征;CRF 则负责在解码阶段全局约束标签转移——比如实体的 BIO 标签必须遵守「B-OR 后面只能接 I-OR 或 O」这类语法,不能从 B-OR 直接跳到 I-PER。
我一般会这么理解:BERT 负责「这个词是什么」,BiLSTM 负责「这个词在句子里上下文是什么」,CRF 负责「这一串标签合不合法」。三者是递进关系,而不是并列关系。论文图 7 的关键结构是:BERT 特征表示层 → BiLSTM → CRF 解码层,其中 BERT 产出的特征直接作为 BiLSTM 的输入,最后一层由 CRF 完成标签序列解码。
3.3 数据流与维度演算:从字向量到序列标签
下面用一个简化的 Python 数据流示意来追踪维度变化。假设 batch size 为 2,句子长度为 128,BERT 的 hidden size 为 768。
# 假设输入已经完成 tokenization # input_ids: [batch_size=2, seq_len=128] # 第 1 步:BERT 编码,输出每个 token 的上下文向量 # bert_outputs: [2, 128, 768] bert_outputs = bert(input_ids) # 第 2 步:BiLSTM 前向+后向聚合,hidden_size 设为 256 # lstm_outputs: [2, 128, 512],512 = 256(前向) + 256(后向) lstm_outputs = bilstm(bert_outputs) # 第 3 步:线性层将 512 维映射到标签类别数 # 假设标签类别共 7 种:O, B-OR, I-OR, B-EQ, I-EQ, B-PR, I-PR # logits: [2, 128, 7] logits = linear(lstm_outputs, num_labels=7) # 第 4 步:CRF 解码,在全局标签序列上做维特比搜索 # decoded_tags: [2, 128],每个位置是合法标签 decoded_tags = crf_decode(logits)逻辑说明:BERT 输出的 token 向量经过 BiLSTM 后会拼接前向和后向两个方向的隐状态,这一步能让每个位置的表示同时包含「它前面发生了什么」和「它后面将要发生什么」。线性层把 BiLSTM 的 512 维输出映射到标签空间,但此时每个位置的预测还是互相独立的;只有 CRF 在最后把整条标签序列拉在一起做全局约束。这也是为什么纯 BERT+Softmax 做 NER 的效果不如 BERT-BiLSTM-CRF——Softmax 只看单点得分,CRF 还看标签转移矩阵中「前一标签 → 当前标签」的联合概率。
3.4 字级别标注:绕过中文分词的天花板
论文图 7 展示的分词结果很有意思:「经过干燥再分散得到氧化石墨烯分散液」被 BERT 特征表示层按字处理,输出结果里的 O、B-OR、I-OR 是逐字标注的。这里有一个领域工程师都很熟悉的坑:中文专利术语的长度和边界极不稳定,「氧化石墨烯」「氧化石墨烯分散液」看起来像同一个词族的变体,但实体边界完全不同。如果用词级别的 BIO 标注,那分词阶段就要给出正确边界,相当于把错误提前到了第一步。
字级别标注的思路是:不依赖分词器,直接把每个汉字作为一个 token 输入 BERT。因为 BERT 用的是 WordPiece 子词切分,中文场景下基本就是单字切分,所以实体边界由模型自己从序列标注里学出来。论文选择在 BERT 特征之上做 BiLSTM 和 CRF,本质上是把「边界判断」这件事完全交给模型的序列建模能力,而不是交给前置 NLP 工具。这也解释了为什么改进方案比 CRF+依存句法的精确率高出一倍多——错误不再从分词阶段就开始接力。
4. 注意力机制与句法语义融合:关系抽取如何把实体位置变成模型输入
4.1 用特殊符号锚定实体:$ 与 # 如何把位置信息传给 BERT
实体识别解决了「实体在哪」,关系抽取要解决「这两个实体之间是什么关系」。论文的第二种改进算法把这个问题转化成一个分类任务:输入一个句子和两个目标实体,输出关系类别。关键设计是在输入 BERT 之前,用特殊符号把实体位置标记出来。
以句子「四川的省会是成都」为例,第一个实体「四川」前后加 $ 符号,变成「[CLS] $ 四川 $ 的省会是成都」;第二个实体「成都」前后加 # 符号,变成「[CLS] 四川的省会是 # 成都 #」。这样做的目的论文说得很直白:让模型知道这两个词的特殊性,相当于变相指出两个实体的位置。如果没有这些符号,模型只能靠人的标注去猜哪两个 token 是实体对,而实体在长句里间隔很远时,这种位置信号早就被注意力机制稀释掉了。
$ 和 # 是两种不同的锚点,这很重要。同类符号会混淆两个实体,不同符号让模型在 Self-Attention 计算时能区分「这是在指第一个实体」还是「这是在指第二个实体」。BERT 的输入表征里本身有 token embeddings,特殊符号经过 embedding 后,等于给实体的上下文向量加上了可学习的偏置。这个设计比常见的「实体位置嵌入」更轻量——不需要额外构造 position mask,只需要在输入文本里插入四个字符。
4.2 从三个向量到关系分类:CLS 与实体向量的拼接与 Softmax
模型结构的核心是三个信息源。论文的公式清晰地描述了这一过程:BERT 输出的 [CLS] 向量 H0 保存整个句子的语义内容,维度为 [n, d];实体 1 的向量通过计算 BERT 输出实体各字向量的平均得到,记为 e1,维度同样是 [d];实体 2 的向量 e2 同理。得到一个综合向量后,输入线性层并做 softmax 分类。
# 假设句子长度 m=128,hidden size d=768,batch size n=4 # H0: [4, 768],CLS 位置的输出,代表整句语义 h0 = bert_outputs[:, 0, :] # 实体向量:对实体覆盖范围内的 token 向量求平均 # 实体 1 位置:i..j,实体 2 位置:k..m e1 = mean(bert_outputs[:, i:j+1, :], dim=1) # [4, 768] e2 = mean(bert_outputs[:, k:m+1, :], dim=1) # [4, 768] # 三个向量分别经过线性变换 + tanh 激活 h0_prime = tanh(w0 @ h0 + b0) # [4, 768] h1_prime = tanh(w1 @ e1 + b1) # [4, 768] h2_prime = tanh(w2 @ e2 + b2) # [4, 768] # 拼接成 [4, 3*768=2304],再映射到 L 个关系类别 concat = torch.cat([h0_prime, h1_prime, h2_prime], dim=1) # [4, 2304] h_double_prime = w3 @ concat + b3 # [4, L] probabilities = softmax(h_double_prime, dim=-1) # [4, L]逻辑说明:这里有一个容易忽略的设计选择——CLS 向量和实体向量不是直接拼接,而是先分别经过独立的线性层 W0、W1、W2 并加 tanh 激活。原因在于三个向量的语义粒度不同:CLS 是整句的压缩表示,实体向量是局部字符的平均,直接拼接会让模型难以区分「谁是谁」。分别做一次线性变换相当于给每个信息源一个独立的特征空间,tanh 把输出压到 [-1, 1],避免拼接后某些维度数值过大压过其他维度。最后的 W3 维度是 [L, 3d],把语义向量映射到关系类别空间。
4.3 注意力机制在关系抽取里的作用:给字重新分配权重
第二种改进算法不是只用特殊符号,它还引入了字级别的注意力机制。输入一个句子后,先分词,再输入 BERT 标注,把训练后的分布式词向量输入到 BiLSTM 中获取句子语义信息,然后引入字级别注意力:模型学习每一个字的权重大小,自动关注对关系抽取影响更大的字。
论文图 8 展示的流程是:句子 → 分词 + 句法标注 → 词向量 → BiLSTM(前向+后向)→ 注意力机制 → softmax → 输出结果。注意力在这里做的其实是软对齐:在「经过干燥再分散得到氧化石墨烯分散液」这句话里,「得到」「氧化」「石墨烯」「分散液」这几个字/词会被赋予更高权重,而「经过」「干燥」「再」的权重会被压低。这种软性的重要性分配,比硬编码句法规则更适应专利文本的多样性——同样是动宾结构,石墨烯专利里谓词可能是「得到」,也可能是「提供」「加入」「混合」,谓词不同但语义角色相同。
论文图 9 的抽取结果显示,注意力机制方案能从工艺流程里抽出<制备,氧化石墨烯>、<得到,氧化石墨烯分散液>、<配制,镁盐溶液>、<配制,碱溶液>、<加入,旋转床或套管>这一串动宾二元组,整体构成一条清晰的工艺路线。相比 CRF+依存句法容易抽出的杂乱关系,注意力机制方案的优势在于它不需要预先定义句法规则,靠数据自己学会「哪些字组合在一起构成工艺动作,哪个动作和哪个宾语关联」。
5. 专利实体抽取避坑指南:标注、序列长度与实验评估的三个陷阱
5.1 分词错误污染实体边界:词级别标注是最大的坑
现象:用现成的中文分词工具做词级别 BIO 标注,模型精确率始终在 30%~40% 徘徊,且召回率极不稳定。检查抽取结果发现,「氧化石墨烯分散液」经常被识别成「氧化石墨烯」+「分散液」两个实体,动宾关系变成<分散,液>这种荒谬结果。
原因:中文专利术语不是通用分词器的训练分布。分词工具基于新闻、百科语料学习,对「旋转床」「套管」「镁盐溶液」这类领域术语的边界判断能力很差。论文中 CRF+依存句法只有 25.18% 的精确率,很大一部分误差就来源于此。
解决:改用字级别标注,让 BERT 的 WordPiece 直接切到单字粒度,把实体边界判断交给 BiLSTM+CRF 的序列建模能力。代价是训练序列变长(一句话的字数就是 token 数),但换来的是不再依赖外部分词器,错误从源头上被截断。
5.2 长句截断破坏实体锚点:max_length=512 不是安全值
现象:把专利权利要求原文直接输入模型,BERT 报序列长度超限,于是盲目设置 max_length=512,结果训练时 loss 不降,抽取结果里大量关系元组残缺。
原因:BERT 的位置编码是学习出来的,最大长度 512 意味着超出部分被直接截断。专利权利要求书里一个句子经常超过 200 个字符,而实体对可能分布在句子的两端——比如「加入氧化石墨烯分散液后经搅拌、超声、过滤、干燥,得到石墨烯复合材料」里,第一个实体「氧化石墨烯分散液」在句首,第二个实体「石墨烯复合材料」在句尾,截断如果砍在两者之间,$ 和 # 锚点就会丢失一个,关系分类彻底失效。
解决:对长文本做滑窗分段,每段 256~384 个 token 并带上 overlap(比如重叠 32 个 token),保证实体对无论出现在哪个位置都会被至少一个窗口完整包含。另外,训练和推理要用相同的截断策略,否则训练时模型没见过「不完整的实体」,推理时却喂给它截断样本,效果会断崖式下跌。
5.3 一次实验定结论:评估指标对样本量极其敏感
现象:表 2 的结果看着很漂亮——CRF+依存句法的 F1 只有 26.44%,纯 BERT 是 44.99%,改进算法是 61.03%。但如果只跑一次实验就下结论,换一批测试数据可能发现改进方案的 F1 掉到 55% 以下。
原因:论文用了精确率、召回率和 F1 值三个指标,定义是 P=Nr/Np、R=Nr/Ns、F1=2PR/(P+R),其中 Nr 表示预测正确的动宾关系句子数目,Np 表示待预测的句子数目,Ns 表示标准动宾结果的句子数目。专利语料里动宾关系非常稀疏,一篇专利说明书可能只有几十个有效关系元组,测试集如果只有几百条句子,几个预测结果的偏差就会让 F1 波动好几个点。
解决:做至少 5 折交叉验证,报告均值和方差;对预测错误做错误分析,区分「实体边界错」「关系类型错」「实体对错配」三类。论文流程里把训练数据和测试数据划分后,采用的是静态语料评估,这在当时是主流做法,但真实场景下专利是持续新增的,静态评估无法反映模型在时间序列上的退化速度。
5.4 关系类别集合不收敛:动宾谓词太多导致 softmax 类别爆炸
现象:注意力机制方案抽取出的结果里出现大量「一次性谓词」,比如<提供,有力保障>、<缩短,30 s~30 min>,这些根本不是工艺步骤。把它们直接加入关系类别集合,softmax 分类器被稀释,核心动宾关系的召回率下降。
原因:论文图 6 的结果里能清楚看到这个问题——用改进 BERT 模型抽取后,噪声比 CRF 方案少了很多,但仍然有「(提供,有力保障)」「(缩短,30 s~30 min)」「(混合,石墨烯溶液镁盐溶液以及碱液)」这类结果。原因在于「提供」「缩短」在句子层面确实是合法动词,但在工艺流程序列里不是核心操作步骤。模型按字面特征分类,不知道哪些谓词是工艺流程的一部分。
解决:在训练前先做关系类别归一化,把同义谓词合并——「配制」「制备」归为一类,「得到」「获得」归为一类,「加入」「添加」归为一类,同时把「提供有力保障」这类明显不是工艺步骤的句子过滤掉。关系类别集合越小、越收敛,softmax 分类器的区分度越高。这个步骤看起来不起眼,但直接决定了注意力机制方案的上限:61.03% 的 F1 是在限定关系类别数量后的成绩,不加约束直接套用会掉回 50% 以下。
6. 端到端还是分层解耦:静态语料训练与动态专利演化的取舍
两种改进方案放在一起看,会发现它们其实是同一个设计哲学的两条实现路径:不再相信「先分词、再句法、最后规则匹配」的串行流水线,而是让模型从数据里直接学习实体边界和关系语义。BERT-BiLSTM-CRF 走的是序列标注路线,把实体识别变成带全局约束的标签解码;注意力机制方案走的是分类路线,把关系抽取变成「句子 + 实体对 → 关系类别」的映射。后者在工程上更直接——你不需要先跑一个 NER 再跑一个关系分类器,只需要在输入里插入 $ 和 # 符号,一次 forward 就能得到关系结果。
但这里有个值得琢磨的取舍:注意力机制方案把实体位置通过特殊符号告诉模型,等于是把「实体边界」作为前提输入,而不是作为模型的中间产出。这意味着如果上游 NER 出错,下游分类照样崩。论文中改进的 BERT-BiLSTM-CRF 和注意力与句法关系结合,F1 达到 61.03%,但仍有余量——如果能把实体识别和关系抽取放进同一个模型做联合训练,让两个任务共享 BERT 参数,误差传播的空间会更小。这是端到端派和分层派长期争论的焦点:端到端模型理论上更优,但需要大量联合标注数据;分层模型工程上更稳,每一层都能单独调试、单独换模型。
论文的结束语也指出了一个更有意思的限制:目前的研究是在当前静态数据库基础上划分训练数据和测试数据,对于未来时间序列上的动态分析方法是技术创新管理领域的另一个重要问题。换句话说,训练语料是某个时间切片的专利集合,但专利是持续公开的——今年训练好的模型,明年面对新申请时,抽取出的实体关系是否还准确?石墨烯技术从氧化石墨烯制备,到石墨烯复合材料,再到具体应用,术语在演化,关系结构也在演化。把时间维度加进抽取模型,需要对数据做时间切片,逐年重训或增量更新,这比单次静态评估复杂得多。
我自己的习惯是:拿到任何新的专利语料,先不做模型实验,而是手工标注 200 条句子,统计实体边界长度分布和动宾谓词频次。这一步能省掉后面大量的返工——如果谓词类别超过 50 种,就该先做类别合并,而不是增加模型容量;如果实体平均长度在 4 到 6 个汉字,序列标注的标签设计就要考虑「长实体内部是否允许嵌套」。从那以后,我每次做专利实体抽取项目,都强制自己先走一遍「标注 200 条 → 统计分布 → 定关系类别集 → 再跑模型」的流程,而不是直接拿公开模型 finetune。这个顺序调过来,能少踩一半的坑,希望帮到你。
本文还有配套的精品资源,点击获取