首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在词干结束后,是否有可能得到一个自然词?

在词干结束后,是否有可能得到一个自然词?
EN

Stack Overflow用户
提问于 2015-02-10 18:52:49
回答 2查看 384关注 0票数 2

我有一个词play,它在词干之后变成了plai。现在我想让play再来一次。有可能吗?我用过波特的史泰默。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-11 05:54:56

Stemmer能够处理人工不存在的单词。您希望将它们作为一组所有可能的单词的元素返回吗?你怎么知道这个词不存在,也不应该被归还?

作为一种选择:找到一本所有单词及其形式的字典。为他们每个人找一根树干。将此投影保存为地图:(词干,所有单词形式的列表)。这样你就能得到一个给定词干的所有单词形式的列表。

UPD:如果您需要所有可能的单词,包括不存在的,那么我可以提供这样的算法(没有检查,只是建议):

波特词干算法。我们需要一个反向版本。

如果直线算法中的规则有一个形式(m>1) E -> (删除最后一个E),那么反向规则将是“用E叉”,这意味着我们需要尝试其他方法。例如,在直线算法probate -> probat中,反向我们有两种选择:probat -> { probat, probate }。这些替代品中的每一种都应单独进行进一步处理。请注意,这是一组替代方案,因此我们将只处理不同的单词。这样一条规则将有以下形式:A -> { , B, C },意思是“用三种替代方式替换结尾A:保留原样、用B和用C”。

代码语言:javascript
复制
Step 5b: (m>1) *L -> { , +L } // Add L if there's L at the end.
Step 5a: (m>1) -> { , +E }
         (m=1 and not *o) -> { , +E } // *o is a special condition, it's not *O.
Step 4: (m>1) *S or *T -> { , +ION }
        (m>1) -> { , +AL, +ANCE, +ENCE, ..., +IVE, +IZE }
Step 3: (m>0) *AL -> { , +IZE }
        (m>0) *IC -> { , +ATE, +ITI, +AL }
        (m>0) -> { , +ATIVE, +FUL, +NESS }
Step 2: (m>0) *ATE -> { , ATIONAL } // Replace ATE.
        (m>0) *TION -> { , +AL } // Add AL at the end.
        (m>0) *ENCE -> { , ENCI } // Replace ENCE.
        ...
        (m>0) *BLE -> { , BILITI } // Replace BLE.
Step 1c: (*v*) *I -> { , Y } // Replace I.
Step 1b: (m=1 and *oE) -> { , +D, delete last E and add ING } // *o is a special condition.
         (*v*c and not (*L or *S or *Z)) -> { , add last consonant +ED, add last consonant + ING }
         *IZE -> { , IZING, +D }
         (*v*BLE) -> { , +D, delete last E and add ING }
         *ATE -> { , ATING, +D }
         (*v*) -> { , +ED, +ING }
         (m>0) *EE -> { , +D }
Step 1a: *I -> { , +ES }
         *SS -> { , +ES }
         not *S -> { , +S }

直线算法必须选择第一最长规则。反向算法应该使用所有的规则。

例(直):

代码语言:javascript
复制
Input: PLAYING
Step 1a doesn't match.
PLAYING -> PLAY (Step 1b)
PLAY -> PLAI (Step 1c)
m=0, so the steps 2-5 don't match.
Result: PLAI

反转:

代码语言:javascript
复制
Input: PLAI
m=0, so the steps 2-5 are skipped
Step 1c:
PLAI -> { PLAI, PLAY }
Step 1b:
PLAI -> { PLAI, PLAIED, PLAIING }
PLAY -> { PLAY, PLAYED, PLAYING }
Resulting set: { PLAI, PLAIED, PLAIING, PLAY, PLAYED, PLAYING }
Step 1a:
PLAI -> { PLAI, PLAIS, PLAIES }
PLAIED -> { PLAIED, PLAIEDS }
PLAIING -> { PLAIING, PLAIINGS }
PLAY -> { PLAY, PLAYS }
PLAYED -> { PLAYED, PLAYEDS }
PLAYING -> { PLAYING, PLAYINGS }
Resulting set: { PLAI, PLAIS, PLAIES, PLAIED, PLAIEDS, PLAIING, PLAIINGS, PLAY, PLAYS, PLAYED, PLAYEDS, PLAYING, PLAYINGS }

我在迈克尔·通切夫的链接上检查了所有这些单词,每个单词的结果都是"plai“(请注意,这个站点不接受大写输入)。

票数 1
EN

Stack Overflow用户

发布于 2015-02-11 00:59:33

显然不是。许多不同的词,在被阻止后,可以成为柏拉图:包括玩和玩。

在这里试试:demo.html

因此,如果,给柏拉图,它可能来自任何一个词,它不是决定性的。或者你想要得到所有可能的词集,对柏拉图来说?

更新: Qualtagh提到了一些好主意。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28439522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档