我有一个词 play ,在词干变成 plai 之后。现在我想再次 播放 。可能吗?我使用过Porter's Stemmer。
答案 0 :(得分:2)
显然不是。在被扼杀之后,许多不同的词语可以成为一种形式:包括游戏和游戏。
在此处试试:http://9ol.es/porter_js_demo.html
因此,如果给予plai,它可能来自任何一个词,那么它不是确定性的。或者你想获得一系列可能出现在plai上的词?
更新: Qualtagh提到了一些好主意。
答案 1 :(得分:1)
Stemmer能够处理人为的不存在的单词。您是否希望将它们作为一组所有可能单词的元素返回?你怎么知道这个词不存在而且不应该被退回?
作为选项:找到所有单词及其表单的字典。找到每个人的干。将此投影保存为地图:(词干,所有单词形式的列表)。因此,您将能够获得给定词干的所有单词形式的列表。
<强> UPD:强> 如果您需要包括不存在的所有可能的单词,那么我可以提供这样的算法(它没有被检查,只是一个建议):
Porter stemming algorithm。我们需要一个反转版本。
如果直接算法中的规则具有(m>1) E ->
形式(删除最后一个E),则反向规则将是“with with E”,这意味着我们需要尝试其他方式。例如,在直接算法probate -> probat
中,我们有两种选择:probat -> { probat, probate }
。应进一步单独处理这些替代方案中的每一种。请注意,这是替代品的集,因此我们只处理不同的单词。这样的规则将具有以下形式:A -> { , B, C }
,这意味着“以三种替代方式替换结尾A:保持原样,使用B和C”。
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 }
直接算法必须选择第一个最长的规则。反向算法应该使用所有规则。
示例(直接):
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
反转:
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 }
我在Michael Tontchev的链接上检查了所有这些字词。每个人的结果都是“plai”(请注意,该网站不接受大写输入)。