简单感知器实现英文词性标注
说明
首先,我最近开始学感知器算法来进行中文词性标注,英文词性标注等一系列任务,是看了这篇文章:《200行代码实现英文词性标注》以及其他讲感知器算法的文章的启示。现在我大致读懂了这篇文章并实现了他的算法。
但是,我对于《200行代码实现英文词性标注》这篇文章有一点要说明:
他的正确率97%是在训练集上,测试集上正确率只有65%!
我并没有贬低他的意思,事实上用区区200行(事实上他用了300行)代码实现一个感知器是一个优美的工作,而且他的解释很好,的确带我入了门。但是我觉得把训练集上的准确率和别人测试集上的准确率比较是很不妥当的,而且会误导初学者。所以,这篇文章的算法是只能帮助你入门的简单算法,并不是什么灵丹妙药能直接击败其他复杂的算法。
数据集
数据集是文章附带的华尔街语料WSJ的部分,这个数据集比较难,因为词性标注地太细了,而且标注我不是很看的懂他的意思。
我觉得英文有词形式变化应该比中文好标注吧。事实上人民日报的语料标注粒度小,而且数据比较大。我找到了一个比较小的华尔街日报数据集,还标注地很细,所以同样是感知器算法,前者能上90,后者只有68左右。
基本原理
与简单感知器实现中文词性标注几乎一模一样,不同的是英文由于多了词形式变化的特征,抽的特征会更加多样。
抽特征
英文相比中文多了词形式变化,所以可以抽特征多了前缀后缀,prefix,suffix等。
测试结果
因为我是根据那篇文章来的,所以效果和他差不多。
他在测试集上是0.65,我是0.68。
在训练集上我们有几乎有0.97或者0.98(但这个意义不大)。
平均感知器算法
感知器算法在正确率收敛附近可能会产生波动甚至一直震荡,进而是稳定性不佳,而且可能会影响模型最终表现。对此产生了平均感知器的算法。
文章中的代码直接对每一轮迭代模型求平均,这样做的缺点是收敛会很慢。
所以我们可以到一定阶段,比如两轮迭代测试集上的正确率相差不大时候开始平均下面每一轮迭代的模型权重,或者动态调整步长之类的。属于一个感知器的小trick。