一段两小时的访谈录音转成文字,常常是一大段连在一起的汉字,中间没有一个标点。会议记录和从网页复制下来的正文也经常这样,有的社交媒体长帖干脆用空格代替标点。拿这样的材料直接做分析,工具照样会出结果,只是结果往往不准。
这是因为文本分析是一步接一步做的。先切句,再分词,然后才进入真正想做的分析,比如算可读性或者挑摘要句。每一步都用上一步的结果,句子在哪里断开,是整条流程里最早做出的判断。
文本结构还原(Punctuation Restoration,也叫标点还原)做的事情,是给这类材料补上标点、重新断句,原文的字一个不改。句子断对了,分词不会跨过原来的停顿,搭配统计只在一句话里面数,按句子算的工具拿到的也是一句一句完整的话,后面的分析就更准。
在 TATOOLS 的【文本结构还原器】里【上传文档】,就能拿到按原文顺序排好、带标点的句表,还有平均句长和短中长句的分布。下载的整理文本每行一句,可以直接交给后面的分析工具。
这篇教程先用一个公式和两项经典实验讲清断句对准确度的影响,再用一段中文访谈演示三种常见的错法。后半部分讲标点具体怎么补,长文章和专有名词怎么处理,结果怎么评估和核对,最后是报告的读法和补完标点以后能接着做的分析。
01
很多分析工具是按句子算的
国家标准《标点符号用法》(GB/T 15834—2011)把点号分成两类。句号、问号和叹号是句末点号,表示一句话说完了;逗号、顿号、分号和冒号是句内点号,表示句子中间的停顿。按这个标准,一句话就是到句末点号为止的那一段文字。
用符号写出来更清楚。把一份材料看成 m 个字符组成的序列 c,断句就是选出 N 个切开的位置,组成集合 B。第 j 句 s_j 就是第 j − 1 个位置和第 j 个位置之间的那段字符。
c = (c_1, c_2, …, c_m)
B = {b_1 < b_2 < … < b_N},b_0 = 0,b_N = m
s_j = c_(b_(j−1)+1) … c_(b_j),j = 1, …, N
举个例子。【社区主任说好,几天后又说名额满了。后来我们也就没再去问。】一共 28 个字符,两个句号分别是第 17 和第 28 个字符,B = {17, 28},切出两句,长度分别是 17 和 11。
句子切好以后,后面的分析就以句子为单位来算。判断情感时一句判一次,算平均句长时句子数是分母,统计词组搭配时只在一句话或者两个标点之间数。TATOOLS 里有好几件工具直接依赖标点和句子。
| TATOOLS 工具 | 标点和句子在里面起什么作用 |
|---|---|
| 文本可读性分析 | 按句末点号切句,平均句长是可读性评分的一项 |
| 抽取式摘要 | 把每句话当作候选,按句子之间的相似度排序后挑出来 |
| 相似句查找 | 把文本切成单句,两句两句地比较意思 |
| 高频词提取 | 统计两到四个词组成的固定说法时,只在两个标点之间数 |
| 依存句法分析 | 优先在句末点号处把长文切成片段,再一段段分析句子结构 |
| 高级情感分析 | 每行判断一次,每行一句时就是逐句判断 |
同一份材料的标点对不对,决定了这些工具拿到手的是一句完整的话、半句话,还是好几句连成的一大段。
02
前一步断错,后面每一步都跟着错
文本分析通常是一条流水线(Pipeline),几个处理步骤首尾相接。设 h 是断句,g 是分词,f 是最后要做的分析,原文 T 的分析结果就是三个函数套在一起。
R = f( g( h(T) ) )
断句出的错,分词这一步看不出来,只能照着错的句子往下切,分析那一步也一样。前一步的错误一层层传到后面,叫作级联误差(Cascading Errors)。Finkel、Manning 和 Ng 在 2006 年专门写过论文,讨论语言标注流水线里的这个问题。
最后的准确度可以按断句对错拆开来算。把分析的对象分成两组,一组句子断对了,另一组断错了,总的准确度就是两组准确度按比例加起来。
A = a × A_对 + (1 − a) × A_错
a:断句正确的部分所占的比例
A_对:断句正确时的分析准确度
A_错:断句错误时的分析准确度
A_对 和 A_错 差得越多,分析结果受断句的影响就越大。假设某项信息抽取在句子断对时准确度是 0.80,断错时只有 0.40(数字是为了演示假设的)。断句正确的比例 a 是 0.60 时,A = 0.60 × 0.80 + 0.40 × 0.40 = 0.64;a 提高到 0.95,A = 0.95 × 0.80 + 0.05 × 0.40 = 0.78。抽取方法一点没改,准确度提高了 0.14,全部来自前面的断句。
比较两种分析方法谁更好之前,应该先把句子断对,不然比出来的差距里混着断句的误差。TATOOLS 把【文本结构还原器】放在分析开始之前,要提高的就是公式里的 a。
03
少了逗号,信息抽取的得分掉了多少
标点对后面分析的影响,在语音转写研究里有过专门的实验。比较不同条件时常用相对降幅,S 是同一个系统在不同标点条件下的得分。
相对降幅 = (S_参照 − S_条件) / S_参照
Makhoul 等人 2005 年把英文广播新闻和通讯稿的录音转写交给同一个信息抽取系统,只改变转写稿里的标点,看系统找人物机构和它们之间关系的得分。实体值得分(Entity Value Score,EVS)衡量实体找得准不准,关系值得分(Relation Value Score,RVS)衡量实体之间的关系找得准不准,两项都是越高越好。下表是转写没有识别错误时的得分。
| 标点从哪来 | EVS | RVS |
|---|---|---|
| 人工加的全部标点 | 59.7 | 27.3 |
| 人工断句,加上逗号 | 58.9 | 25.9 |
| 只有人工断句 | 53.4 | 21.3 |
| 只有机器断句 | 51.7 | 19.9 |
第二行和第三行的区别只在逗号。去掉逗号以后,EVS 从 58.9 降到 53.4,相对降幅是 (58.9 − 53.4) / 58.9 ≈ 9.3%;RVS 从 25.9 降到 21.3,相对降幅是 (25.9 − 21.3) / 25.9 ≈ 17.8%。从第一行的全部人工标点一直降到最后一行的只有机器断句,EVS 相对降了 (59.7 − 51.7) / 59.7 ≈ 13.4%,RVS 降了 (27.3 − 19.9) / 27.3 ≈ 27.1%。论文把多种识别错误率下的结果平均以后,给出的数字是实体大约降 13.5%,关系大约降 25%。
关系得分掉得比实体得分多。作者的解释是,同位语这类结构要靠逗号标出来,抽取规则就是靠这些逗号认出它们。同位语是补充说明前一个名词的成分,比如【布什,美国总统,今早表示】里的【美国总统】。
句中的逗号和句末的句号一样,带着后面分析需要的结构信息。TATOOLS 的【文本结构还原器】补的不只是句号,逗号、顿号和分号也会一起补上。
04
句子断得越准,句法分析越准
Kahn、Ostendorf 和 Chelba 2004 年用英文电话对话做了另一个实验。句法分析器保持不变,只换句子边界的来源,看分析出来的句子结构对不对。他们用 PARSEVAL(按句法树里的括号对不对得上来打分的标准方法)算括号精确率和召回率,还统计了交叉括号数,也就是分析出来的短语边界和标准答案互相交叉的次数,这个数越少越好。
| 句子边界从哪来 | 括号精确率 | 括号召回率 | 交叉括号数 |
|---|---|---|---|
| 人工断句,加上标点 | 79.30 | 69.91 | 35.88 |
| 人工断句 | 68.40 | 77.45 | 46.80 |
| 机器断句 | 63.09 | 72.47 | 66.21 |
| 只按说话停顿断 | 58.67 | 68.05 | 80.40 |
句子边界越接近人工标注,交叉括号越少,从只按停顿断的 80.40 降到人工断句的 46.80。以只按停顿断为起点、人工断句为上限,中间这段就是断句能带来的全部提升。机器断句拿到了其中多少,可以用增益占比 G 来算。
G = (S_机器 − S_停顿) / (S_人工 − S_停顿)
精确率:(63.09 − 58.67) / (68.40 − 58.67) = 4.42 / 9.73 ≈ 45.4%
召回率:(72.47 − 68.05) / (77.45 − 68.05) = 4.42 / 9.40 ≈ 47.0%
机器断句拿到了不到一半的提升空间。人工断句之后再加上标点,精确率和召回率的调和平均又从 72.6 升到 74.3。
两项实验的结论一致,句子边界越准,后面的分析越准,句中的逗号还能再带来一部分提升。TATOOLS 的【依存句法分析】也是先切句再分析结构,句子断对了,它分析的才是完整的句子。两项实验用的都是英文语音转写,下面换成中文材料,看缺了标点具体会错在哪里。
05
用一段中文访谈看三种错法
下面这段是为这篇教程写的社区养老访谈答话,共 227 个汉字、30 个标点。
我家老人今年八十三了,腿脚不方便,白天基本离不开人。主要是我爱人在照顾,孩子都在外地工作,一年回来两三次。社区的日间照料中心,我们去年去问过。社区主任说好,几天后又说名额满了。后来我们也就没再去问。请护工上门也考虑过,费用太高,中等收入家庭长期负担不起。您问最需要什么帮助?我觉得是助餐和陪诊。老人一个人去医院,挂号、缴费、拿药都搞不明白。要是有志愿者陪着,我们上班也能安心一些。街道也办过几次讲座,讲防诈骗,讲慢病管理,老人挺爱去的。只是时间都安排在工作日上午,家里人没法陪。如果能挪到周末,参加的人肯定会更多。
把标点全部删掉,就是一份典型的无标点转写稿。拿它和原文对比,能看到三种错法。
分词会把标点两边的字拼成一个词
中文分词通常把标点当成天然的分界,标点两边的字不会被切进同一个词。标点一删,两边的字就可能拼成词典里的常用词。用 TATOOLS 使用的分词器切材料里的一个片段,结果是这样的。
有标点:费用 太高 , 中等 收入 家庭 长期 负担 不起
无标点:费用 太 高中 等 收入 家庭 长期 负担 不起
【太高,中等】之间的逗号没了,分词器切出了一个【高中】。以有标点时的切法为标准答案,按每个词的起止位置逐个对照。标准答案有 8 个词,无标点时切出 9 个,起止位置对得上的有 6 个。精确率(Precision)是切出来的词里切对的比例,召回率(Recall)是标准答案里被切对的比例,F1 是两者的调和平均。
精确率 = 6 / 9 ≈ 0.667
召回率 = 6 / 8 = 0.75
F1 = 2 × 精确率 × 召回率 / (精确率 + 召回率) = 12 / 17 ≈ 0.706
少了一个逗号,F1 就从 1 降到 0.706。切错的词还会接着往下传,【高频词提取】会多数出一个【高中】,【中等 收入】这个固定说法反而数不到了。
词组统计会多出材料里没有的搭配
统计搭配和固定说法时,要先规定哪些词算挨着,这个范围叫窗口(Window)。常见的做法是把两个标点之间的一段当作一个窗口,窗口里每两个挨着的词算一个词组,n 个词就有 n − 1 个词组。标点一删,窗口就跨过了原来的停顿。取材料里的【我爱人在照顾,孩子都在外地工作,一年回来两三次】,只留两个字以上的词来数。
有标点:[爱人 照顾] [孩子 外地 工作] [一年 回来 两三次]
词组数 = 1 + 2 + 2 = 5
无标点:[爱人 照顾 孩子 外地 工作 一年 回来 两三次]
词组数 = 8 − 1 = 7
多出来的两个词组是【照顾孩子】和【工作一年】。【照顾孩子】连意思都变了,原话是爱人在照顾老人,孩子在外地工作,标点一删就读成了爱人在照顾孩子。凡是按标点划窗口的搭配统计和关系抽取,都会把它当成材料里真说过的话计进去。
13 句话会变成 1 句
分析单位(Unit of Analysis)是一次统计或判断针对的对象。按句子算的工具先切句再计算,句子怎么切,决定了一共算几段话、每段是哪些字。按句末点号切,示例材料有 13 句,连标点一共 257 个字符,平均句长是 257 / 13 ≈ 19.8 个字符。标点删掉以后,整段只剩 1 句,平均句长变成 227 个字符。
| TATOOLS 工具 | 补好标点、每行一句时 | 没有标点时 |
|---|---|---|
| 文本可读性分析 | 平均句长 19.8 个字符 | 平均句长 227 个字符,评分偏向很难读 |
| 抽取式摘要 | 从 13 句里挑 | 只有 1 句,摘要只能是全文 |
| 相似句查找 | 13 句两两比较,共 78 对 | 整段太长,只能按长度硬切,切口可能在词中间 |
| 高级情感分析 | 13 行,一句判断一次 | 1 行,整段只判断一次 |
三种错法的根子都在标点。TATOOLS 的【文本结构还原器】在分析开始之前把标点补回去,分词、搭配统计和按句子算的工具就又回到了一句一句的话上。
06
补标点到底在做什么
从计算的角度看,补标点是给每个词后面选一个标点。设一段没有标点的文本切词后得到词序列 w,一共 n 个词。在第 i 个词后面选一个标签 y_i,标签从标点集合 L 里取,∅ 表示什么都不加。把词和标签依次拼起来,就是补好标点的文本。
w = (w_1, w_2, …, w_n)
L = {∅, 逗号, 顿号, 分号, 冒号, 句号, 问号, 叹号}
输出 = w_1 y_1 w_2 y_2 … w_n y_n
ŷ = argmax_y P(y | w)
最后一行的意思是,在所有可能的标法里挑出概率最大的那一种。这个定义里有一条硬规则,词的顺序和词本身都不能动,只能在词和词之间插入标点。换成编辑距离的说法,从原文到结果只允许插入,替换和删除都不允许。句号放在哪里,句子就在哪里断开,补标点和断句是同一件事。
拿材料里的一句话试试。【社区主任说好几天后又说名额满了】切出 10 个词,关键在第 3 个词【说好】后面放不放逗号。
w = 社区 主任 说好 几天 后 又 说 名额 满 了
读法一:y_3 = 逗号 → 社区主任说好,几天后又说名额满了。
读法二:y_3 = ∅ → 社区主任说好几天后又说名额满了。
两种读法只差一个标签,说的事却不一样。读法一是主任先答应了,几天后又改口;读法二很容易读成主任过了好几天才说名额满了,答应过这件事就看不出来了。要是做事件抽取或者立场分析,这个逗号决定了材料里记录的是一件事还是两件事。
标法的数量也说明了为什么要靠模型来选。末尾固定放句号,中间还剩 9 个位置,就算每个位置只在不加、逗号和句号三种里选,也有 3^9 = 19,683 种标法,选哪一种要看整句话甚至上下文的意思。
TATOOLS 把这条硬规则直接写进了还原要求。模型拿到的是切好的词序列,只能在词和词之间补标点、断开句子,词序和词语都保持原样,最后返回一张句子列表。
07
补标点的两种做法
标点还原的方法大致沿两条路发展。第一条是序列标注(Sequence Labeling),给每个位置直接预测一个标签。早期用条件随机场(Conditional Random Field,把整串标签放在一起算概率的模型),后来有带注意力机制的双向循环网络,再后来是预训练语言模型加一个分类层。第二条是生成式还原(Generative Restoration),让语言模型读入词序列,直接写出带标点的句子。
| 对比 | 序列标注 | 生成式还原 |
|---|---|---|
| 输出什么 | 每个位置一个标签,再和词拼起来 | 直接写出带标点的句子 |
| 会不会改动原文 | 输出的结构决定了改不了 | 靠还原要求约束,写完要核对 |
| 能用哪些标点 | 训练时就定好了 | 可以按意思用问号、叹号和引号 |
| 需不需要标注语料 | 需要同领域的人工标注语料 | 新领域的材料可以直接处理 |
| 能看多少上下文 | 附近窗口里的几个词 | 整段话的意思,方便判断疑问、感叹和引语 |
两种做法最大的区别在第二行。序列标注的输出只能是 w_1 y_1 … w_n y_n 这种形式,结构上就不会改字。生成式还原的输出是一段重新写出来的文字,有没有改字需要事后检查。换来的好处是换了领域也能直接用。访谈转写和会议记录不用单独准备标注语料,网页正文和社交媒体长帖也一样。
TATOOLS 用的是生成式还原,另外做了两件事。一是材料作为待处理的数据交给模型,材料里就算有像指令一样的句子,也只会被当成要断句的文字。二是结果保留了逐句的句表和完整结果文件,方便按后面讲的办法逐字核对。
08
自定义词典决定哪里可以断开
候选断点(Candidate Boundary)是可以放标点的位置。不算文本末尾,按字来断,m 个字之间有 m − 1 个候选断点;先切词再断,候选断点只在词和词之间,n 个词只有 n − 1 个。词怎么切,决定了模型能在哪里断开,也决定了要从多少种标法里挑。
按字断的候选断点数 = m − 1
按词断的候选断点数 = n − 1,n ≤ m
标法的数量 = |L| ^ 候选断点数
以【乡村振兴战略稳步推进】为例,10 个字之间有 9 个位置。通用分词把它切成【乡村 振兴 战略 稳步 推进】5 个词,剩下 4 个位置。把【乡村振兴】加进词典,它就切成 4 个词,只剩 3 个位置。按 3 种标签算,标法的数量依次是 3^9 = 19,683、3^4 = 81 和 3^3 = 27。词典越贴合材料,要挑的标法越少,专有名词中间也不会被断开。
TATOOLS 会先把【自定义词典】加载进通用中文分词器,再给全文切词。词典一行写一个词,也可以写成【词 词频 词性】,中间用空格隔开,多个词之间用逗号、顿号、分号或者换行分开都行。词典只影响词怎么切,不会增减任何字。后面做分析时也用同一份词典,补标点和做分析两个阶段对专有名词的切法就一致。
切词时,原文里的换行和空格会一起去掉,全文变成一条连续的词序列,句子在哪断开完全按语义和语法来判断。用空格代替标点的长帖也因此能重新断句。原文里本来就有的标点会作为词留在序列里,模型在这个基础上补上缺的标点。
09
长文章怎么分块处理
语言模型一次能处理的文本长度有限,长文章要分成几块。设每块 B 个词,衔接长度 k 个词,n 个词的材料分成 J 块。从第 2 块开始,每块的输入是上一块最后 k 个词加上本块的词,这 k 个词叫衔接上下文。
J = ⌈n / B⌉
第 1 块输入:w_1 … w_B
第 j 块输入:w_((j−1)B−k+1) … w_((j−1)B) + w_((j−1)B+1) … w_(min(jB, n))
总输入词数 = n + (J − 1) × k
分块的位置是按词数定的,经常落在一句话中间。带上衔接上下文,新一块的第一句能连着前文一起判断;代价是这 k 个词会被处理两遍,拼接时要把重复去掉。拿 n = 14,B = 6,k = 2 手算一遍。
| 块 | 衔接上下文 | 本块的词 | 输入词数 |
|---|---|---|---|
| 第 1 块 | 无 | w_1 到 w_6 | 6 |
| 第 2 块 | w_5、w_6 | w_7 到 w_12 | 8 |
| 第 3 块 | w_11、w_12 | w_13、w_14 | 4 |
一共 3 块,总输入词数 6 + 8 + 4 = 18,和公式算出的 14 + 2 × 2 = 18 一样。
TATOOLS 碰到超过块长的材料,会按固定词数分块,所有块同时提交处理,结果按原来的顺序拼接。拼接时,如果新一块输出的某句话比较短,而且已经完整包含在上一块的最后一句里,就当作衔接重复删掉。块和块接上的地方有两种情况。
分块正好落在句末。第 1 块最后一句是【后来我们也就没再去问。】,第 2 块带着衔接词【去 问】开头,输出的第一句是【去问。】。这句已经包含在上一句里,拼接时删掉,结果和不分块一样。
分块落在句子中间。第 1 块最后几个词是【请 护工 上门】,这一块输出了【请护工上门。】;第 2 块带着衔接词【护工 上门】接着处理,输出【护工上门也考虑过。】。这句没有包含在上一句里,拼接后会保留,于是【护工上门】出现了两次,本来的一句话也被拆成了两句。
抽查长文章的结果时,要重点看块和块接上的地方,第二种情况留下的痕迹是相邻两句之间重复了几个词。某一块如果没能返回结果,这一块就不产生句子,输出里会少掉对应的一段。后面讲的逐字核对能把这两种问题都找出来。
10
句子断长还是断短
句长 ℓ_j 是第 j 句的字符数。平均句长(Mean Sentence Length,MSL)是所有句子字符数的平均值,也是文体研究里最常用的长度指标,Yule 早在 1939 年就用句长分布研究作者的写作风格。
ℓ_j = len(s_j),字符包括汉字、标点、数字和字母
MSL = (ℓ_1 + ℓ_2 + … + ℓ_N) / N
同一段话可以断成几个长句,也可以断成更多短句,两种断法在语法上都说得通。断长还是断短,要看后面做什么分析。Matusov、Mauser 和 Ney 2006 年为语音翻译设计断句方法时,就在断句模型里加入了句段长度模型,还设了最短和最长的长度限制,让句子长短合乎翻译的需要。
把希望的句长范围 [a, b] 写成一条软约束,就是在语义合不合理之外,再给超出范围的句子扣分。
ŝ = argmax_s [ log P(s | w) − λ × Σ_j φ(ℓ_j) ]
φ(ℓ) = max(0, a − ℓ) + max(0, ℓ − b)
句长在 [a, b] 里面时不扣分,超出多少就扣多少。λ 越大,扣分越重,约束也就越接近硬性的上下限。软约束让意思完整排在第一位,句长偏好只在几种都说得通的断法之间做选择。
手算一个例子。一段材料断成两句,分别是 80 和 20 个字符,第一句正中间有一个逗号。
| 最长句长 | 句长 | 句数 N | MSL | 长句(30 个字符及以上) | 中句(10 到 29 个字符) |
|---|---|---|---|---|---|
| 100 | 80、20 | 2 | 100 / 2 = 50.0 | 1 | 1 |
| 60 | 40、40、20 | 3 | 100 / 3 ≈ 33.3 | 2 | 1 |
最长句长设为 60 时,80 个字符的那句要扣 φ = 80 − 60 = 20 分。在逗号处拆开,把逗号改成句号,两句各 40 个字符,都不扣分,总字符数还是 100。句数从 2 变成 3,平均句长从 50.0 降到 33.3,长句从 1 条变成 2 条。
后面要做的分析不同,句长偏好也可以跟着调整。
| 后面要做的分析 | 希望句子是什么样 | 句长偏好怎么设 |
|---|---|---|
| 相似句查找,逐句判断情感 | 一句只说一件事 | 最长句长设小一些 |
| 抽取式摘要 | 意思完整,能单独摘出来 | 保持默认范围 |
| 比较可读性和文体 | 各份材料的口径一致 | 所有材料用同一组设置 |
TATOOLS 工具页上的【句长偏好】有【最短句长】和【最长句长】两个滑块,单位是字符。最短句长可以设 5 到 50,最长句长可以设 50 到 200,默认是 5 和 100。这两个值会作为偏好写进还原要求。明显超过最长值的句子,会优先在意思完整的逗号或分号处拆开;明显不到最短值的短句,如果和前后句意思连贯,可以合并成一句。拆句和并句都只改标点,词序和词语不变。
11
怎么判断标点补得好不好
Sparck Jones 和 Galliers 1996 年把自然语言处理系统的评估分成两类。内在评估(Intrinsic Evaluation)直接拿输出和人工参照比,看标点本身标得对不对;外在评估(Extrinsic Evaluation)看输出能让后面的任务做得多好,衡量它对研究目标有多大用处。前面讲的两项经典实验都属于外在评估。
内在评估按标点种类分别算精确率、召回率和 F1。设某种标点在参考答案里出现 G 次,系统输出了 H 次,位置和种类都对上的有 C 次。槽错误率(Slot Error Rate,SER)把三类错误加在一起算。替换 S 是位置对了但种类错了,删除 D 是漏标,插入 I 是多标,分母是参考答案里的标点总数。
精确率 = C / H
召回率 = C / G
F1 = 2 × 精确率 × 召回率 / (精确率 + 召回率)
SER = (S + D + I) / 参考答案的标点总数
参考答案取【社区主任说好,几天后又说名额满了。】,系统输出【社区主任说好几天后,又说名额满了。】,逐个位置对照的结果见下表。
| 位置 | 参考答案 | 系统输出 | 算作 |
|---|---|---|---|
| 【说好】后面 | 逗号 | 无 | 删除 |
| 【后】后面 | 无 | 逗号 | 插入 |
| 【了】后面 | 句号 | 句号 | 正确 |
句号的 G = 1,H = 1,C = 1,F1 = 1。逗号的 G = 1,H = 1,C = 0,精确率和召回率都是 0。SER = (0 + 1 + 1) / 2 = 1.0。逗号只挪了一个位置,就记了一次删除和一次插入,而这个逗号恰好就是前面决定材料里有几件事的那个逗号。插入错误没有上限,所以 SER 可以大于 1。
外在评估回答的是这一步预处理值不值得做。从材料里抽一段,人工加好标点作为参照,再把同一段的还原结果交给同一个分析工具,用前面的相对降幅公式比较两份结果。降得越少,还原结果在这项分析上就越接近人工标点的效果。
在 TATOOLS 里,从【逐句结果】抽一批句子人工标注,就能按上面的公式算内在指标;把下载的整理文本交给后面的工具,就能做外在评估。
12
删掉标点,逐字对一遍原文
没有参考答案时,也有一个能直接做的检查办法。补标点只允许插入标点,所以把输入和输出里的标点和空白全部删掉以后,剩下的字应该一模一样。
strip(输出) = strip(输入)
strip:删掉全部标点符号和空白字符
还用上面的例子。输出共 17 个字符,删掉 2 个标点剩 15 个汉字,和输入的 15 个汉字逐字相同,核对通过。如果某句输出成了【后来我们也就不再去了。】,删掉标点后和原文【后来我们也就没再去问】一比,有两处字被换掉了,核对不通过。对不上的地方长什么样,能看出问题出在哪里。
| 对不上的样子 | 原因 | 怎么处理 |
|---|---|---|
| 块和块接上的地方,相邻两句重复几个词 | 分块落在句子中间 | 删掉重复的词,把两句合并 |
| 输出里少了连续的一段 | 这一块没有返回结果 | 把少掉的那段单独再提交一次 |
| 别的地方有字被换掉、漏掉或多出来 | 这里没守住只插入标点的规则 | 按原文逐处改回来 |
生成式还原的输出是重新写出来的文字,个别字词可能在这一步被改掉或漏掉。交给后面的分析之前先逐字核对一遍,分析用的每个字就都能在原文里找到。
TATOOLS 任务详情页的【下载原始数据】提供两份文件。整理文本的开头有一行文件名,后面每行一句;完整结果文件里保存了全部句子、总句数和句长汇总。用整理文本做核对时,先删掉开头那行文件名。
13
报告怎么看
TATOOLS 的报告从上到下依次是【这份结果说明了什么】【逐句结果】【方法说明 / 数据口径】和【下一步建议】四块。
【这份结果说明了什么】是一组带标签的条目。【整体】给出输出了多少句、报告页保留了多少条;【源文件】对应下载的文件;【输出规模】给出总句数和平均句长,并按平均句长所在的区间附一句文体提示;【句长分布】给出短句、中句和长句各有多少条、各占多少,以及哪一档最多;【样例句】摘出前两句;【浏览方式】说明怎么翻页和下载。卡片底部的【怎么继续看】建议了阅读顺序。
【逐句结果】每行是一个序号、一句话和这句话的字符数。报告页收录前 100 条,每页 50 条。
【方法说明 / 数据口径】默认折叠,记录了处理流程和句长的统计口径。
【下一步建议】里是【文本清洗】【词频统计】【情感分析】三个工具的入口。
| 报告里的数 | 数的是什么 | 怎么算 |
|---|---|---|
| 总句数 | 输出的所有句子 | 看断句结果,和原文有几行无关 |
| 平均句长 | 所有输出句的字符数平均值 | 分母是总句数,标点、数字和字母都算字符 |
| 短句、中句、长句 | 每一档的句数 | 短句不到 10 个字符,中句 10 到 29 个,长句 30 个及以上 |
| 三档占比 | 每一档句数占的比例 | 分母是总句数 |
| 逐句结果条数 | 报告页收录的句子 | 前 100 条,全部句子在下载文件里 |
平均句长和三档计数按全部输出句计算。句表超过 100 条时,这几个数覆盖的句子比【逐句结果】里能看到的多。拿示例材料的原标点来说,13 句的字符数在 10 到 28 之间,平均句长 257 / 13 ≈ 19.8,全部落在中句一档,占 100%。
14
补完标点以后接着做什么
从没有标点的材料到逐句分析,在 TATOOLS 里一共四步。
在【文本结构还原器】里【上传文档】,把专有名词和术语放进【自定义词典】,按后面要做的分析设好【句长偏好】。
下载整理文本,删掉开头那行文件名,逐字核对一遍。
把核对好的整理文本交给后面的工具。【文本可读性分析】【抽取式摘要】【相似句查找】和【依存句法分析】按句子处理;【高级情感分析】一行判断一次,每行一句就是逐句判断情感;【高频词提取】统计固定说法时,只在两个标点之间数。
同一项研究的所有材料用同一组句长偏好和同一份词典,把核对好的整理文本存下来当作分析底本,后面的分析都从这份文本开始。
TATOOLS 里有两件处理标点的工具,适用的材料不一样。
| 工具 | 适合什么材料 | 保持不变的 | 会改的 |
|---|---|---|---|
| 文本结构还原器 | 没有标点,不知道句子在哪断开 | 所有词和词序 | 补上标点,重新断句 |
| 标点纠正 | 已经有标点,句子基本断对了 | 文字和原来的断句 | 把已有的标点改对改统一 |
| 材料 | 上传前先做 | 用哪个工具 |
|---|---|---|
| 访谈或会议的录音转写稿 | 删掉时间戳;说话人标记会被当成普通的词参与断句,上传前删掉或统一写法 | 文本结构还原器 |
| 复制时丢了标点的网页或文档正文 | 删掉导航、页脚和广告文字 | 文本结构还原器 |
| 用空格代替标点的社交媒体长帖 | 保留正文,空格在切词时会去掉,按意思重新断句 | 文本结构还原器 |
| 一行一条的评论或弹幕 | 每行本来就是一条 | 标点纠正的【按行纠正】 |
| 标点用得乱的普通文稿 | 保持原来的分段 | 标点纠正 |
一行一条的材料,换行已经把每条分开了。交给文本结构还原器的话,换行会在切词时去掉,相邻两条可能被连成一句;交给【标点纠正】按行处理,每条的边界都能保留。
15
小结
很多分析工具按句子计算。句子在哪里断开,决定了这些工具算的是哪些字、分母是多少;句中的标点决定了统计词组时哪些词算挨着。
断句出的错会一步步传到后面。最后的准确度可以拆成断句正确和断句错误两部分按比例相加,断句正确的比例越高,结果越准。
英文语音转写实验里,去掉逗号让关系抽取的得分相对下降了约 17.8%;在句法分析上,机器断句拿到了约 45% 的提升空间。
在中文材料上,缺了标点,分词会跨过停顿,词组统计会多出假搭配,13 句话会变成 1 句。
补标点可以看成给每个词后面选一个标签,硬规则是只能插入标点。
TATOOLS 用生成式还原,新领域的材料可以直接处理;自定义词典保护专有名词,长文章分块时带着前文处理,句长偏好让句子长短合乎后面分析的需要。
评估分内在和外在两类。没有参考答案时,删掉标点逐字对照原文,核对通过的整理文本就可以作为分析底本。
还原好的整理文本可以接着交给 TATOOLS 的【文本可读性分析】【抽取式摘要】【相似句查找】和【高级情感分析】;已经有标点、只需要统一写法的材料,交给【标点纠正】。
16
资料来源
GB/T 15834—2011《标点符号用法》,中华人民共和国国家标准,2011 年发布
Lafferty、McCallum 与 Pereira:Conditional Random Fields: Probabilistic Models for Segmenting and Labeling Sequence Data,ICML,2001,第 282–289 页
Makhoul、Kubala、Schwartz 与 Weischedel:Performance Measures for Information Extraction,DARPA Broadcast News Workshop,1999,第 249–252 页
Yule:On Sentence-Length as a Statistical Characteristic of Style in Prose,Biometrika,第 30 卷第 3–4 期,1939,第 363–390 页
END
