Jan Fan     About     Archive     Feed     English Blog

调研:词性标注(POS Tagging)各主流实现

因为工作上中文“词性标注”(Part-of-Speech Tagging)的需求,笔者对业界开放的几个主流的词法分析器做了一番调研,并结合具体业务的需求,对标注方法做了比较和选择。 具体包括以下实现:

背景知识

“词性标注”的任务,是对句子中各个成分进行角色的标注,这些角色通常包括以下的内容。 根据分类标准的不同,具体的细类会稍有不同。

pos_example

“词性标注”从本质上来说,也是一个“序列标注”的问题,再细化,是一个分类问题。 假设已有 tags (A,B,C,D),现在需要对句子中的每个词,标注 tags 中的一个。

比如“中文分词”问题,也可以看作是一个“序列标注”的问题。

# S => SINGLE
# B => BEGIN
# M => MIDDLE
# E => END

大/B 家/E 要/S 保/B 护/E 单/B 身/M 狗/E

“词性标注”和“中文分词”是紧密相连的,可通过两种途径将它们进行结合。

一般而言,串行的方式容易造成误差传播——一步错,步步错。一旦分词没分对,后面的标注也就没有意义了。

而联合模型,一般是通过序列标注的方法,来对句子中的每一个词同时标注组合 tag。 当然这种方法速度会下来很多,因为 tag 是 \(tag\_segment \times tag\_pos\) 的笛卡尔积,数量很大。

对于具体的一个词,应该给它分配哪个 tag 呢? 换一个表达方法,也就是取 \(p(tag|word)\) 概率最大那个 tag。 计算 \(p(tag|word)\) 的方法,一个是通过贝叶斯方法来计算,另一个常见的方法是结合更多的特征,比如汉字本身的部首、前后的词及其 tag 等信息,建立一个词性的分类器。

因为我们是对整个句子做标注,所以最后还需要一个全局优化的过程。

hmm_example

一般是采用隐式马尔科夫模型(Hidden Markov Model, HMM) + ** Viterbi 动态规划算法**,来求解这个全局优化问题。 这里就暂不细表了。

jieba

jieba 最为人称道的是它的分词功能,正如它的 Slogan ——“做最好的 Python 中文分词组件”。 而它的词性标注功能则要逊色许多。

jieba 的词性标注由两个步骤组成。

分词 => 词典的预置词性 => 联合模型HMM标注剩余的词

最大的弊端在于多性词的识别。 根据这篇论文的调研,中文语料中多性词约占了23.6%,直接从词典读取预先设置的词性,效果不会好的。

对于不在词典中的剩余词,jieba 的 HMM 模型是用1998人民日报的语料训练得来的,语料小,也没有额外的规则和特征补充,对未登陆词的效果也不会好。具体模型的训练可以参见这个 issue

LTP

LTP 的卖点是用了 SVMTool 来实现串行式的词性分类器,再做句子级别的全局优化。 除了常见的前后词和词性,这个分类器还抓取了很多中文特有的特征,比如后缀(“市”、“委会”、“化”等)、部首结构、叠词等,对未登录词的优化要好上不少。

jieba 仅以 <字 - tag> 为单元建模。 LTP 相比 jieba,多了词的特征这一层,以 <词 - 特征 - tag> 为单元来建模。

另外值得一提的是,LTP给出的论文说是用了 SVMTool,但我在阅读代码的过程中并没有发现,权重的训练都是用 perceptron 或 passive aggressive 算法完成的。而且 LTP 的 C++ 代码写得相当漂亮和规范,很养眼。

ICTCLAS

ICTCLAS 只是用了普通的HMM模型来做串行的词性标注,在标注上并没有出采的地方,它重要的工作主要放在前面的分词阶段了。

它分词上的特点是,区别于常规的作法,句子上的全局优化只取一个最优分词结果,它会先保留 N 个最优结果。 然后在后面层叠多个细分的 HMM 模型(人名/地名识别、嵌套词识别),修正这 N 个分词结果。 最后再从修正的 N 个分词结果中选取最优的作为最终分词结果。 整个过程可以参见下面的流程图和论文

ICTCLAS_diagram

THULAC

THULAS 的重点也是放在了分词上,采用了联合模型来提供词性标注的功能,具体的实现模型在官网没有详细介绍,优势可能就是语料更丰富一些吧。

根据它贴出的论文,在分词上它基于标点符号的无监督方法训练了 10 billion 的样本,对于未登录词的切分在鲁棒性上有显著的提升。 但从这篇THULAC探析文章来看,也只是用了基于多种特征的分类器,论文的无监督成果怎么应用的不得而知,待笔者功力更进一步之后再回来看这个问题吧。

FudanNLP

复旦 NLP 组的 FNLP 更多是往平台上去建设,除了分词、词性标注,还提供了很多其它的文本功能,比如句法分析、可视化等,给使用者更灵活的组合。

在词性标注上串行和联合的方式它都有提供,按论文上的介绍,它还使用了额外的信息,比如人名中的姓氏、地名和企业名的后缀等,因为除了源码没有更详细的介绍了,笔者猜测大致上是基于特征分类实现的序列标注吧(笔者很懒的好吧)。

最后

可以看到,大多数词法分析工具都把分词放在了更重要的位置。 对词性标注主要还停留在分类器汉语特征工程的优化上。

所以笔者的思路主要是在句子级别的全局优化上,结合人工标注团队的协助。 过半的汉语词汇是单性词,可以通过标注单性词来在全局优化时进行修正,亦即带 constraint 的 Virterbi 算法。

当然,人工标注的结果,不仅仅只能用来做 constraint,其实是可以去反推去修正标注错误、甚至是分词错误的。 但没有找到这方面的理论工作,笔者精力有限,暂且搁下,这不失为一个很好的研究方向。

参考文献

Comments

多说 Disqus