我能否使用正则表达式进行词干提取?

5

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

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

(\w+)(?=ly|es|s|y)

将表达式与单词"glasses"进行匹配,返回结果如下:
glasse

正确的匹配应该是:
glass (match should be on 'es' rather than 's' as in the match above)

表达式应该适用于各种单词,例如:
films
lovely
glasses
glass

目前,正则表达式匹配上述单词的方式如下:

film - correct
lovel - incorrect
glasse - incorrect
glas - incorrect

这些单词的正确匹配应该是:

film
love
glass
glass

我目前遇到的问题是不确定如何调整我的正则表达式以适应's'或'es',因为一个单词可能同时包含这两个,比如"glasses"。

更新

感谢迄今为止的答案。我理解词干提取的复杂性和语言知识的要求。然而,在我特定的情况下,单词是有限的(films,lovely,glasses和glass),因此我只会遇到这些单词和上述表达式中的后缀。我没有特定的应用程序。我只是好奇是否可以使用正则表达式实现。我得出结论,这是不可能的,但以下是否可能:找到匹配项或未找到匹配项,例如匹配“glasses”但不匹配“glass”,但匹配“films”。
film (match) - (films)
glass (match) - (glasses)
glass (no match) - (glass)

我认为可以通过从字符串末尾准确匹配后缀的方式来实现。在上面的例子中,“es”与“glass(es)”匹配,因此条件“s”被丢弃。对于glass(无匹配项),条件“s”被丢弃,因为另一个“s”位于其前面,它不完全匹配。我必须承认我不是100%确定这一点,所以我的逻辑可能有些摇摆不定,这只是一个想法。

不,这不是正则表达式的工作 - 特别是移除s - nhahtdh
一些示例表明语言知识的必要性:applyslyspeciesnucleusby - nhahtdh
3个回答

5
如果您想进行词干处理,请使用像Snowball这样的库。使用正则表达式实现您想要的功能将是不可能的。特别地,如果没有对语言的了解,您的正则表达式将无法知道应该从“films”中删除尾随的's',但不应该从“glass”中删除。
有大量关于词干处理和词形还原的文献。谷歌是您的好朋友。

3
你在这里遇到的基本问题是加号在字符串中不被视为数学运算符。这意味着你需要使用一个或多个操作符将其转换为数字,然后才能执行所需的计算。
(\w+)(?=ly|es|s|y)

贪婪模式会尽可能多地匹配,同时确保整个正则表达式匹配成功。您没有明确指定使用哪种正则表达式引擎,但是可以尝试使用以下方式:

(\w+?)(?=ly|es|s|y)

+?+的意思相同,但它是勉强型,尽可能少地匹配,同时仍然允许整体匹配成功。

然而,这仍然存在一个问题,即将glass拆分为glass。要解决这个问题,您需要类似于以下内容:

(\w+?)(?=ly|es|(?<!s)s|y)

使用负向预测来防止在前面跟随另一个 s 时匹配 s 替代项。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接