我可以使用正则表达式执行词干化吗?

Iso*_*rph 5 regex stemming

如何让我的正则表达式完全匹配一个条件

例如,我有以下正则表达式:

(\w+)(?=ly|es|s|y)
Run Code Online (Sandbox Code Playgroud)

将表达式与"眼镜"这个词匹配会返回:

glasse
Run Code Online (Sandbox Code Playgroud)

正确的匹配应该是:

glass (match should be on 'es' rather than 's' as in the match above)
Run Code Online (Sandbox Code Playgroud)

表达式应该适用于任何类型的单词,例如:

films
lovely
glasses
glass
Run Code Online (Sandbox Code Playgroud)

目前正则表达式与上述单词匹配为:

film - correct
lovel - incorrect
glasse - incorrect
glas - incorrect
Run Code Online (Sandbox Code Playgroud)

这些单词的正确匹配应为:

film
love
glass
glass
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题是我不确定如何调整我的正则表达式以正确地满足's'或'es',因为一个单词可以包含诸如"眼镜"之类的两个单词.

更新

谢谢你到目前为止的答案.我很欣赏词干的复杂性和语言知识的要求.然而,在我的特定情况下,单词是有限的(电影,可爱,眼镜和玻璃),因此我只会在上面的表达式中遇到这些单词和后缀.我没有特定的申请.我只是想知道是否可以使用正则表达式.我得出的结论是,这是不可能的,但是以下是可能的:

找到或找不到匹配项,例如匹配眼镜但不是玻璃,但DO匹配电影:

film (match) - (films)
glass (match) - (glasses)
glass (no match) - (glass)
Run Code Online (Sandbox Code Playgroud)

我在想的是,是否有一种方法可以将后缀与末尾的字符串完全匹配.在上面的例子中,'es'匹配glass,因此条件's'被丢弃.在玻璃的情况下(不匹配)条件's'被丢弃,因为另一个's'在它之前,它不完全匹配.我必须承认我不是百分之百关于这一点所以我的逻辑可能看起来有点不对劲,这只是一个想法.

ccl*_*eve 5

如果你想做词干,请使用像Snowball这样的库.用正则表达式做你想做的事情是不可能的.特别是,如果没有某种语言知识,你的正则表达式就不可能知道应该从'电影'中删除尾随's'而不是'glass'.

关于词干和词形还原的文献很多.谷歌是你的朋友.


Ian*_*rts 3

你在这里遇到的基本问题是加号

(\w+)(?=ly|es|s|y)
Run Code Online (Sandbox Code Playgroud)

贪婪的,并且会尽可能多地获取,同时仍然允许整个正则表达式匹配。您还没有确切地说您正在使用哪种正则表达式,但请尝试

(\w+?)(?=ly|es|s|y)
Run Code Online (Sandbox Code Playgroud)

+?意思与 相同,+但不情愿,尽可能少匹配,同时仍允许整体匹配成功。

glass然而,这仍然存在它分裂成glas和的问题s。要处理这个问题,你需要类似的东西

(\w+?)(?=ly|es|(?<!s)s|y)
Run Code Online (Sandbox Code Playgroud)

使用负向后查找来防止s替代项在另一个 s 前面时匹配。