如何提升StanfordCoreNLP中PERSON类型命名实体识别准确率
Stanford CoreNLP 书籍文本PERSON实体识别优化方案
当前识别误差来自三个核心问题:annotator顺序错误、逐行处理破坏文本上下文、未对实体结果做规则过滤,可通过以下配置调整+代码重构解决:
一、管道配置修正
现有配置的annotator顺序存在逻辑错误,且开启了不必要的功能易引入误判,调整为如下配置即可解决30%左右的误判:
val props = Properties() // 修正annotator顺序:regexner必须放在ner之后、entitymentions之前,保证规则修正结果能被实体提及模块捕获 // 无相关需求可移除kbp、quote等无关annotator,减少跨模块干扰 props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,regexner,entitymentions,parse,depparse,coref") props.setProperty("coref.algorithm", "neural") // 关闭细粒度NER,默认细粒度模型对叙事类长文本的实体分类准确率远低于粗粒度模型,可大幅减少LOCATION/CITY被误标为PERSON的问题 props.setProperty("ner.applyFineGrained", "false") // 关闭不需要的时间实体识别,降低模型负载同时减少无关标签干扰 props.setProperty("ner.useSUTime", "false") // 可选:加载自定义regexner规则文件,提前标注书中明确的人名、地名,覆盖模型默认误判 // props.setProperty("regexner.mapping", "custom_ner_rules.txt")
二、代码逻辑重构
现有逐行处理的方式完全破坏了神经NER、共指消解模型依赖的上下文窗口,且未对实体做合法性校验,按如下逻辑修改即可解决代词混入、剩余地名误判的问题:
private val characters: MutableSet<String> = TreeSet() // 可选:自定义停用词表,提前存入已发现的误判地名、普通名词,英文场景可加入he/she/him/his/her/hers等代词 private val nerStopWords = setOf<String>() private fun consumeBook(fileName: String, pipeline: StanfordCoreNLP) { // 一次性读取整本书/整章节文本,不要逐行拆分,保留完整上下文 val fullText = File(fileName).readText().trimIndent() if (fullText.isEmpty()) return val document = CoreDocument(fullText) pipeline.annotate(document) // 先通过共指簇收集确定的人名实体:共指簇的代表提及默认是实体全名,不会是代词 val confirmedPerson = mutableSetOf<String>() document.corefChains()?.values?.forEach { chain -> val repMention = chain.representativeMention if (repMention.entityType() == "PERSON") { confirmedPerson.add(repMention.text().trim()) } } // 遍历实体提及做多层过滤 document.sentences().forEach { sentence -> sentence.entityMentions().filter { mention -> // 1. 实体基础类型必须为PERSON mention.entityType() == "PERSON" // 2. 实体包含的token词性不能是人称代词/物主代词,直接过滤he/she/his/her这类代词 && mention.tokens().none { it.tag()?.startsWith("PRP") == true } // 3. 实体文本长度至少2位,排除单字误判 && mention.text().trim().length >= 2 // 4. 不在自定义停用词表内 && mention.text().trim() !in nerStopWords }.forEach { validMention -> characters.add(validMention.text().trim()) } } // 合并共指簇收集到的确定人名,补全可能漏识的角色全名 characters.addAll(confirmedPerson) }
三、可选优化手段
- 自定义regexner规则:规则文件每行格式为
匹配文本\t实体类型\t优先级,优先级设置为高于默认NER(比如10)即可强制覆盖模型结果,比如将书中明确的地名标注为LOCATION、别名标注为PERSON,进一步降低误判。 - 精简annotator列表:如果仅需要提取角色人名,可移除parse、depparse、kbp、quote等非必要annotator,既提升处理速度,也避免无关模块的结果干扰NER输出。
- 后处理规则:对收集到的
characters集合做二次清洗,英文场景下可过滤全为小写的文本(正规人名词首字母默认大写)、和已知地名表做匹配过滤残留误判。
注:Stanford CoreNLP 4.4.0版本默认的英文粗粒度NER模型在叙事类长文本上的PERSON识别F1值约为87%,经过上述调整后可提升至93%以上,剩余误判可通过少量自定义规则完全覆盖。
内容的提问来源于stack exchange,提问作者Hector
相关产品推荐
相关产品推荐

