Porter和Lancaster词干算法的主要区别和优点是什么?

79

我正在使用Java进行文档分类任务。

这两种算法都受到高度推荐,它们各自的优缺点是什么,哪种在自然语言处理任务的文献中更常用?

1个回答

144

从根本上讲,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编译器将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.


45
Snowball实际上是由Martin Porter设计用于准确定义词干提取器的语言,它本身不是一个词干提取器。你所提到的算法被称为“英语词干提取器”或“Porter2词干提取器”。它与“Porter词干提取器”非常相似,但规则稍有改进。如果你正在进行研究比较,“Porter”(原始版本)更常用,但如果你需要实际的准确性,请使用“Porter2”。默认情况下,“Paice-Husk”是一个重量级的词干提取器,但如果你制定自己的规则,它会使用一个单独的规则文件,因此也很有用。这3种算法之间的计算时间几乎可以忽略不计。 - TheManWithNoName
@TheManWithNoName 原始答案关于Snowball是什么的解释让我感到困惑,因为它与我所读的不同。感谢您澄清了这个混淆。 - Gerry
7
为了回答问题,Snowball语言与所谓的Snowball词干提取器之间的混淆已经很普遍。例如,NLTK使用术语“SnowballStemmer”:http://www.nltk.org/howto/stem.html - juanmirocks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接