中文自然语言处理中,分词与命名实体识别是两项紧密关联的基础任务:分词负责把连续汉字切分成词语,命名实体识别则从这些词语中进一步定位人名、地名、机构名等关键信息。这两项技术直接影响到搜索、问答、推荐等上层应用的最终效果,理解它们的原理与选型思路对实际开发很有帮助。
中文分词的核心难点在于词语边界的不确定性与歧义。当前主流方案按技术演进大致分为三类,各有适用的场景。
基于词典的匹配方法依赖预先构建的大规模词库,通过正向最大匹配、逆向最大匹配等算法对文本进行扫描切分。这类方法在纯速度要求高、文本主题固定的场景下仍有价值,比如日志关键词抽取。但它的明显短板是难以处理词典外的网络新词、专有名词,遇到“南京市长江大桥”这类歧义句时也容易切分错误。
基于统计模型的序列标注方法将分词转化为对每个字打标签的任务(如B表示词首、E表示词尾、S表示单字词)。隐马尔可夫模型和条件随机场是这类方法的代表。它们能从标注语料中学习字与字的共现规律,对未登录词和基础歧义的容忍度比纯词典方法高不少,但训练依赖足量且标注一致的数据。
基于深度学习的端到端模型是目前精度最高的选择。以BiLSTM+CRF或预训练语言模型(如BERT)为代表的架构,能够自动捕捉长距离上下文信息,在通用中文评测集上的准确率通常能超过95%。不过这类模型对算力要求较高,推理速度相对较慢。
在实际开发中,直接选用成熟的开源工具往往比从零搭建更高效。例如PaddleNLP提供的LAC模型,就是在分词同时兼顾词性与实体标注的轻量级方案,兼顾了速度与准确率。
命名实体识别任务通常需要识别出人名、地名、机构名、时间、数量等通用类型;在医疗、法律、金融等行业,还会延伸到疾病名、药品名、法条编号或产品代码等专属类型。
中文场景下做实体识别有两大特殊难点。第一是边界依存问题:实体边界高度依赖前序分词的准确性,如果分词把“北京人民医院”切成“北京/人民/医院”,实体边界自然就会错乱。第二是多义性问题:同一个词在不同语境中指代完全不同,例如“苹果”既可能是水果,也可能是科技公司名称,需要靠上下文消歧。
一个有效的应对思路是采用联合训练方式。以LAC模型为例,它在训练时同步学习分词、词性标注与实体识别的任务,通过共享底层特征让三个任务相互增强,避免上游分词错误在实体识别阶段被放大。在垂直领域,如果实体专有性强,建议在通用预训练模型基础上使用领域语料做微调,效果会明显优于直接使用通用模型。
选择分词与NER方案,不能只看精度排行榜,还需要根据应用场景在精度、吞吐量和部署成本之间做权衡。
在实际开发过程中,有几个高频问题值得提前规避。
首先区分是大规模切分错误还是个别边界错误。若是通用词频繁切错,说明模型或词典与文本领域不匹配,应补充领域词典或改用领域语料微调;若只是个别长专名出错,优先在词表中添加该词并设置高优先级。
不一定。直接基于字符级标注做端到端实体识别是可行方案,它绕开了词边界错误的传导。但若是基于词向量的传统方案,则分词质量直接决定实体识别上限,建议采用分词与NER联合训练的模型。
先使用预训练的LAC或领域微调模型做零样本测试,通过抽样分析错误类型来确定标注重点。如果行文相对规整,仅需标注数百条覆盖典型格式的样本,就能基本验证方案的可行性。
分词和命名实体识别虽有十余年研究历史,但仍是中文处理链条中不可回避的环节。对于开发者而言,不必过度纠结于底层算法细节,更重要的是理解不同方法的适用边界:用轻量工具快速验证,用领域数据逐步优化,用规则修正细节误差。先跑通基础流程,再依据真实反馈迭代,才能让这两项技术在你的产品中稳定发挥作用。