最近写东西提到这个算法,要看一下,结果网上都是直接根据代码解释,对于我这种菜鸟在刚开始看一个算法的时候真心不想直接看代码学。奈何都是各种语言的代码,么得办法。先走了一遍,有了大致的了解,翻译成自己的话,也不知道准不准确,欢迎懂的大佬给我批评指正。
附上官网:https://tartarus.org/martin/PorterStemmer/
一、先把单词按下述规则整理成“CV”的格式
我们假设,"C"代表一连串辅音字母,“V”代表一连串元音字母。所以,是所有单词都可以用四种字母组合来表示:
CVCV……C
CVCV……V
VCVC……C
VCVC……V
用[ ]表示可选,即有或没有均可。则四种形式可以归纳为:
[C]VCVCVC……[V]
用m表示辅音串“C”的个数,进而可以将上述形式转化为:
[C]VC{m}[V]
这样,我们就可以将每个单词都写成这种形式。
二、明确提取词干的规则
链接:https://blog.csdn.net/zhanghaiyang9999/article/details/41628789
*S -词干以S结束 (同样适用于其他字符).
*v* - 词干包含一个元音.
*d - 词干以两个相同辅音结束(如. -TT, -SS).
*o - 词干以cvc的形式结束, 但是第二个c(辅音)不是 W, X 或者Y (如 -WIL, -HOP).
这些条件可以用AND,OR和NOT来运算,但只选择符合最长的一种,例如:
SSES -> SS AND
IES -> I AND
SS -> SS AND
S ->
classes->class而不是classe,因为它会选择最长的匹配规则。
另外,步骤一中提到的m也会作为条件规则的一部分。
三、加入合适条件取出后缀
(condition) S1 -> S2
(condition) 是s1的条件,假如s1满足(condition) ,那么就转化为s2。(condition) 由步骤二中的规则和逻辑连接词AND,OR和NOT构成。
我理解的大致步骤就是这样,然后就要看代码了,以后发现有错误再改喽。