1

与 [1]搬运工词干算法实现问题类似的问题?, 但扩大了。

基本上,step1b 定义为:

步骤1b

`(m>0) EED -> EE                    feed      ->  feed
                               agreed    ->  agree
(*v*) ED  ->                       plastered ->  plaster
                               bled      ->  bled
(*v*) ING ->                       motoring  ->  motor
                               sing      ->  sing `

我的问题是为什么 feed干到 feed而不是 fe?我在网上尝试过的所有在线 Porter Stemmer 的词根 feed都是 ,但据我所见,它应该是 fe.

我的思路是:

`feed` does not pass through     `(m>0) EED -> EE` as measure of     `feed` minus suffix     `eed` is `m(f)`, hence     `=0`

`feed` will pass through     `(*v*) ED  ->`, as there is a vowel in the stem     `fe` once the suffix     `ed` is removed. So will stem at this point to     `fe`

有人可以向我解释一下在线 Porter Stemmers 是如何做到的 feed吗?

谢谢。

4

4 回答 4

0

这是因为“feed”没有VC(元音/辅音)组合,因此m = 0。要删除“ed”后缀,m > 0(检查每个步骤的条件)。

于 2017-08-19T08:03:05.730 回答
0

删除后缀的规则将以(条件)S1 -> S2 的形式给出,这意味着如果一个单词以后缀 S1 结尾,并且 S1之前的词干满足给定条件,则将 S1 替换为 S2。条件通常以 m 的形式给出,例如 (m > 1) EMENT -> 这里 S1 为 `EMENT' 而 S2 为空。这会将 REPLACEMENT 映射到 REPLAC,因为 REPLAC 是 m = 2 的单词部分。现在,在您的示例中:(m>0) EED -> EE feed -> feed before 'EED',后面是否有元音按常数,重复超过零次??答案是否定的,在“EED”是“F”之前,没有元音后跟常数

于 2020-01-25T20:52:25.487 回答
0

很遗憾这里没有人真正阅读这个问题。这就是为什么feedfe被步骤 1b 的规则 2 阻止的原因:

该算法的定义指出:

在一组写在彼此之下的规则中,只有一个被遵守,这将是与给定单词的最长匹配 S1 的那个。

这里没有明确说明条件总是被忽略,但确实如此。feed与第一个规则匹配(但由于不满足条件,因此未应用),因此忽略 1b 中的其余规则。

代码大致如下所示:

// 1b
if(word.ends_with("eed")) { // (m > 0) EED -> EE
    mval = getMvalueOfStem();
    if(mval > 0) {
        word.erase("d");
        }   
    }
else if(word.ends_with("ed")) { // (*v*) ED -> NULL
    if(containsVowel(wordStem) {
        word.erase("ed");
    }
}
else if(word.ends_with("ing")) { // (*v*) ING -> NULL
    if(containsVowel(wordStem) {    
        word.erase("ing");
    }
}

这里重要的是else ifs。

于 2021-08-26T14:47:26.663 回答
0

在提要中,m 指的是元音、辅音对。没有这样的一对。

但是在约定的“VC”中是ag。因此它被替换为同意。条件是m>0。

这里 m = 0。

于 2020-05-27T11:27:38.770 回答