我正在使用Java进行文档分类任务。
这两种算法都受到高度推荐,它们各自的优缺点是什么,哪种在自然语言处理任务的文献中更常用?
我正在使用Java进行文档分类任务。
这两种算法都受到高度推荐,它们各自的优缺点是什么,哪种在自然语言处理任务的文献中更常用?
从根本上讲,Porter和Lancaster词干算法之间的主要区别在于,Lancaster词干算法比Porter词干算法更具攻击性。今天使用的三种主要词干算法是Porter、Snowball(Porter2)和Lancaster(Paice-Husk),依据攻击力程度基本沿着这些线路进行。Porter是最不具攻击性的算法,每个算法的具体内容实际上相当冗长和技术性。但是,下面为您分解一下:
Porter: 最常用的词干提取器之一,也是最温和的词干提取器之一。少数几个词干提取器中实际上有Java支持,这是一个加分项,尽管它也是最计算密集的算法(虽然差距并不很大)。它也是最古老的词干提取算法。
Porter2: 几乎普遍认为是比porter更好的改进版,并且有充分的理由。事实上,Porter本人承认这比他的原始算法更好。与porter相比,计算时间稍快,拥有一个相当大的社区支持。
Lancaster: 非常具有攻击性的词干算法,有时会出现故障。与Porter和Snowball不同,在Lancaster中,许多较短的单词将变得完全模糊不清,对读者来说,其词干表示通常是相当直观的。这里是最快的算法,将极大地减少您的工作单词集,但如果您想要更多的区分,那么这不是您想要的工具。
老实说,我认为Snowball通常是最好的选择。在某些情况下,Lancaster将极大地削减您的工作集,这非常有用,但是在我的意见中,相对于Snowball,较小的速度增加并不值得失去精度。Porter具有最多的实现,因此通常是默认的算法,但如果可以,请使用Snowball。
Snowball是一种小型的字符串处理语言,旨在为信息检索中的词干算法创建。
Snowball编译器将Snowball脚本转换为另一种语言 - 目前支持ISO C、C#、Go、Java、Javascript、Object Pascal、Python和Rust。
由于它有效地提供了“后缀去除语法”,我曾考虑将其称为“strippergram”,但好的想法最终占了上风,因此它被命名为“Snowball”,以向 Farber、Griswold、Poage和Polonsky先生在20世纪60年代开发的优秀字符串处理语言SNOBOL致敬。
---Martin Porter
Snowball语言实现的词干提取器有时被简称为Snowball词干提取器。例如,可以参见自然语言工具包: nltk.stem.snowball.