5.9 经典NLP分词、词性、命名实体与句法

1.说起来,NLP在深度学习之前就有完整的看家本领

说起来,这两年大家聊到自然语言处理,多半第一时间想到的就是大模型。可大模型并不是凭空蹦出来的。在它之前,NLP这个领域已经踏踏实实积累了三四十年,攒下了一整套处理语言的基本功。这些基本功里最经典的几样,就是分词、词性标注、命名实体识别和句法分析。

这几件事有个共同的特点,处理的都是结构化的标注活儿。说得更具体些,输入是一段文字,输出要么是把句子切成一段段小块,要么是给每个小块贴上一个标签,要么是理出小块和小块之间的关系。在大模型时代之前,几乎每一项NLP应用,搜索、机器翻译、问答、情感分析,都得先把这几样基础任务跑一遍,再去撑上面的业务。

我记得刚入行那会儿,有位老工程师常讲一句话,说这些经典任务就是NLP的地基,地基打不扎实,上面盖得再漂亮也只是花架子。这话到今天依然成立。即便如今BERT和那些更大的模型早就能把这些活儿一起端了,理解传统方法仍然很有价值,因为它们讲清楚了语言到底是怎么被一步步拆解和标注的。这一章我们就把这几样本领一件件聊下来。

2.分词:中文没有空格,得先把句子切开

英文分词其实挺省心,单词之间本来就有空格,按空格切就完事了。可中文不一样,中文句子里字和字挨在一起,中间没有天然的分隔。所以中文NLP的第一道关,就是分词,要把一串连续的字符切成一个个有意义的词。

记一个句子 ssss 就是一串字符组成的序列。分词的目标,是把它切成 w1,w2,,wnw_1, w_2, \dots, w_n 这样一串词,wiw_i 就是切出来的第 ii 个词,nn 是词的总数。比如句子(小张喜欢吃苹果),切成(小张)、(喜欢)、(吃)、(苹果)四个词。这件事看起来简单,边界其实并不好定。像(研究生命的起源)这种经典例子,到底切成(研究)、(生命)、(的)、(起源),还是切成(研究生)、(命)、(的)、(起源),靠的就是怎么判断。

最直白的方法是规则分词。准备一本大词典,然后从头到尾扫句子,扫到一个最长能匹配上的词就切出来。这种做法有个名字,叫前向最大匹配(Forward Maximum Matching,缩写成FMM)。它从句子左端开始,每一步都尽量取一个最长的、能在词典里查到的词,取完再继续往后扫。算法简单得很,速度也快,可它的毛病也很明显,纯粹靠词典,对上下文一点感觉都没有。碰上歧义句常常切错,碰到词典里没收的新词,比如人名、网络新词,就直接抓瞎。

所以光靠规则不够,还得借助统计。统计分词的思路,是给每一种切分方式打一个概率分数,再选分数最高的那一种。这里的概率常常用隐马尔可夫模型(Hidden Markov Model,缩写成HMM)来建模。HMM把分词看成一个序列标注问题,给每个字标上一个状态,常用四个状态:B表示词的开头,M表示词的中间,E表示词的结尾,S表示单字成词。字的序列是看得见的观测,状态序列是看不见的隐变量。设观测序列为 x1:nx_{1:n},意思就是句子里那 nn 个字排成的序列,下标 1:n1:n 表示从第 11 个到第 nn 个。再设隐状态序列为 z1:nz_{1:n},也就是每个字对应的那串B、M、E、S标签。HMM要算的,是在观测 x1:nx_{1:n} 已知的情况下,哪一组隐状态 z1:nz_{1:n} 概率最大。这件事的底子是贝叶斯公式和条件概率,我们在1.4 节概率信息论里聊过,那里讲的恰好就是这里的根。HMM求解最可能的隐状态序列,用的就是著名的维特比算法(Viterbi算法)。

HMM之后还有更精细的方法,叫条件随机场(Conditional Random Field,缩写成CRF)。CRF和HMM最大的不同,是它直接建模当前字的标签在上下文条件下的概率,避开了HMM那条很强的独立性假设。换句话说,CRF考虑特征的时候更自由,能同时看上下文里的多个字,分词的准确率通常比HMM高一截。早些年中文分词能上工业水平的,多半都是基于CRF。说穿了,这些统计方法做的都是同一桩事,把(切对还是切错)变成一个可以反复优化的概率问题。

到了大模型时代,分词的颗粒度变了。现在主流的做法是子词切分(subword),把词再往下拆成更小的零件,既避免词典收不全的尴尬,又能把词表大小控制住。最常见的两种子词算法是BPE(Byte Pair Encoding)和WordPiece。BPE从一个一个字符开始,反复合并出现频率最高的字符对,直到词表涨到预设的大小为止。WordPiece思路相近,只是它合并的时候看的标准是可能性,频次只作参考。我们在5.1 节聊预训练的时候提到过词元(token),那些词元就是子词切分产出来的。中文这边,jieba几乎是绕不开的工具,它把词典和统计两种思路揉在一起,速度快、效果稳,新人入门拿它练手再合适不过。说起来我自己第一次做中文分词就是从jieba起步的,调一行代码就能跑,背后那些HMM、CRF的细节它都替你封装好了。

3.词性标注:给每个词贴上名词、动词这些标签

分完词,下一步常常就是词性标注(Part-of-Speech Tagging,缩写成POS)。词性标注做的事,是给切出来的每个词,配上一个词性标签,比如名词、动词、形容词、副词、介词。设第 ii 个词 wiw_i 的词性标签为 yiy_i,那么词性标注的任务,就是给一串词 w1,,wnw_1, \dots, w_n 都各自配上合适的 yiy_i

为什么要标词性呢,因为同一个词在不同语境里可能担任完全不同的角色。拿(他把住门,把书看完)这种句来说,前一个把是动词,握、守的意思,后一个把是介词。光看词本身判断不了,得看上下文。词性是后续很多任务的基础,句法分析、信息抽取、机器翻译,都依赖它先打好底。

POS的方法也大致走过规则、统计、神经网络三段路。早期靠人工总结规则,比如(如果前一个词是副词,那当前词很可能是动词)。后来改用HMM、CRF这类统计模型,思路和分词那边几乎一模一样,只是标签集从B、M、E、S换成了几十种词性。再后来用BERT这类预训练模型做序列标注,效果又往上窜了一截。说穿了,词性标注本质上也是一个序列标注任务,方法上的经验是通用的,搬到分词、命名实体识别上都成立。

4.命名实体识别:从文本里抠出人名、地名、机构名

命名实体识别(Named Entity Recognition,缩写成NER)干的是更专门的活儿,它要从文本里挑出某一类有专门意义的词,主要分成人名、地名、机构名、时间、数字这些类别。设第 ii 个词 wiw_i 的实体类型为 cic_icic_i 可以是人名(PER)、地名(LOC)、机构名(ORG),或者干脆不是任何实体,记作O。NER的任务,就是给一串词都配上合适的 cic_i

举个实际的例子。小明在一家律所实习,老板让他做合同审查,一上来要先把合同里出现的所有公司名、人名、签约日期挑出来,归档成结构化的表。这种事如果靠人眼一行行扫,几百份合同能扫到怀疑人生,交给NER就特别合适。模型扫一遍,自动把(甲方:杭州某某科技有限公司)、(乙方:李某)、(签订日期:2026年7月14日)这几样抽出来,小明再做后续核对就行。

NER和POS一样,通常也当成序列标注任务来做。最经典的标签方案叫BIO,B-X表示某个类型X的实体的开头,I-X表示这个实体的内部,O表示不在任何实体里。比如(杭州某某科技有限公司)这个机构名,杭州标成B-ORG,某某标成I-ORG,科技标成I-ORG,有限公司也标成I-ORG,一连串拼起来就是一个完整的实体。早年NER同样靠CRF做多,CRF能照顾到标签之间的依赖,这一点对实体识别格外要紧。我之前看过一本讲体育数据挖掘的书,里头提到足球转播里自动识别球员名字、球队名字、比分数字,靠的也是同一套NER方法,把解说词里的关键信息抽出来再做统计。现在主流的做法是在BERT后面接一层CRF或者一个简单的分类头,预训练模型负责理解上下文,CRF负责把标签序列约束得合理。

5.句法分析:理出词和词之间到底什么关系

分词、词性、实体这些做完了,再往下就是句法分析。句法分析关心的不再是单个词的标签,而是词和词之间的关系。它主要有两套思路,一套叫依存句法,一套叫成分句法。

依存句法看的是词和词之间的支配关系。一句话里通常有一个核心动词,其他词要么直接修饰它,要么间接挂在它身上。每个词都有一个支配它的父节点,它们之间的关系类型叫依存关系,比如主语、宾语、定语。拿(小张吃苹果)来说,核心动词是吃,小张是吃的主语,苹果是吃的宾语,这就构成了一棵小小的依存树。

成分句法看的是句子的层次结构,把一句话不断切成短语,先切成名词短语、动词短语两大块,再往下切成更小的成分,最后画成一棵成分树。两套思路描述的是同一句话的不同侧面,依存句法更轻、更适合工程用,成分句法更接近传统语法书里讲的那套。

句法分析为什么难呢,因为语言里头充满了歧义和长距离依赖。比如(我看到他拿着望远镜)这句话,是我拿着望远镜看他,还是我用望远镜看到他,人听起来都觉得通顺,机器要判别就得花点心思。我之前翻过一本讲合同法的入门书,里头说一份复杂的商业合同,单个句子写到三四百字并不稀奇,定语从句嵌着定语从句,像俄罗斯套娃一样一层套一层。这种长句要画对依存关系,对模型是相当硬的考验。早年大家用基于规则的转移方法,后来用转移分类器、图模型,再后来用基于预训练模型的方法,每一代都在把准确率往上挪一点。

6.深度学习一来:传统方法融进了大模型

聊到这儿你大概也看出来了,分词、词性、命名实体、句法这四件事,方法演进走过的是同一条路,先是规则,再是统计,最后是预训练模型。BERT一出来,这些任务的最好成绩几乎全被它和它的后辈们拿走了。模型先在海量文本上预训练,这件事5.1 节讲过,再在标注好的小数据上微调一下,就能把上面这些活儿做得又快又准。

可这并不意味着传统方法就白学了。CRF里的特征工程思想,到今天还活在BERT后面那一层序列标注头里。HMM那套概率建模的语言,是5.5 节里RLHF建模奖励和策略的底子。子词切分更不用说,BPE和WordPiece至今是大模型分词的标准方案。说穿了,大模型时代并没有把这些老本领扔掉,而是把它们的长处吸收进来,融成了一套更顺手的工具。

我有个朋友在一家做医疗AI的初创公司做事,他跟我讲过一件事。他们做电子病历抽取,产品上线之初,就是在一个BERT前面接一个jieba做粗分词,再叠一层CRF兜底,去抽病历里的症状、药名、剂量。听起来这套组合挺土,可就是这套土办法,撑住了医院前两年的实际业务。直到换成更大的领域模型,传统那一层的影子还在,只是变薄了。这桩事让我印象很深,传统方法到今天依然活着,只是换了个位置继续发光。

一句话总结,分词把句子切开,词性标注给每块贴标签,命名实体挑出其中的关键名词,句法分析再理出块和块之间的关系,这四件事就是经典NLP的看家本领。深度学习来了之后工具换了,任务本身却没消失,理解了它们,你才看得懂后来那些大模型到底在原有地基上盖出了什么新东西。

今天就先到这儿,下一章见。

练习

Q1. 中文分词为什么比英文麻烦?前向最大匹配(FMM)和基于HMM的统计分词各有什么短板?

英文天然用空格把词隔开,按空格切就行;中文字和字挨在一起没有天然分隔,得先把句子切成有意义的词,所以多一道关。前向最大匹配(FMM)纯粹靠词典,从头扫、取最长能匹配的词,简单快但对上下文没感觉,碰上歧义句(如"研究生命的起源")常切错,碰到词典没收录的新词直接抓瞎。基于HMM的统计分词靠概率挑切分方式(用B/M/E/S四状态序列标注),比规则聪明,但HMM有较强的独立性假设,对上下文的利用受限,准确率后来被CRF超过。

Q2. 命名实体识别(NER)常用BIO标签方案,请说明B-ORG、I-ORG、O分别表示什么,并给出"杭州某某科技有限公司"的标注。

B-X表示某类型X实体的开头词,I-X表示该实体的内部词,O表示不在任何实体里。对"杭州某某科技有限公司"这个机构名(ORG),BIO标注是:杭州→B-ORG,某某→I-ORG,科技→I-ORG,有限公司→I-ORG。一连串拼起来就是一个完整实体。这种方案让序列标注模型能把一个跨多个词的实体识别出来,再配合CRF约束标签之间的依赖(比如B-ORG后面不能直接跟B-ORG),识别才稳。

Q3. 易错点:大模型(BERT、GPT)出来之后,传统分词、词性、NER、句法这些任务是不是就没用了?

没消失,只是工具换了。BERT出来后这些任务的最好成绩几乎全被它和后辈拿走,先预训练再微调就能做得又快又准。但传统方法的思想还活着:CRF的特征工程思想活在BERT后面那层序列标注头里;HMM那套概率建模是RLHF建模奖励和策略的底子;子词切分(BPE、WordPiece)至今是大模型分词的标准方案。说穿了,大模型把传统方法的长处吸收进来,融成更顺手的工具,任务本身(切开句子、贴标签、抠实体、理关系)一直是NLP的基础,理解了它们才看得懂大模型在原有地基上盖了什么新东西。

相关标签
深度学习NLP分词命名实体识别