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

时间:2012-12-28 04:00:56

标签: regex stemming

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

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

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

将表达式与“眼镜”一词匹配会返回:

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',因为一个单词可能包含两个,例如“眼镜”。

更新

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

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

film (match) - (films)
glass (match) - (glasses)
glass (no match) - (glass)

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

中的加号
(\w+)(?=ly|es|s|y)

贪心,并且会尽可能地抓住,同时仍然允许整个正则表达式匹配。你还没有确切地说出你正在使用哪种正则表达式但尝试

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

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

然而,这仍然存在将glass拆分为glass的问题。要处理这个问题,你需要像

这样的东西
(\w+?)(?=ly|es|(?<!s)s|y)

使用负面外观防止s替代方案在另一个s前面进行匹配。

答案 2 :(得分:1)

作为在/ python中寻找这种解决方案的人的案例,有一个由自然语言工具包提供的RegexpStemmer,它工作得非常快

# regex stemmer 
from nltk.stem import RegexpStemmer
rs = RegexpStemmer('ing$|s$|ed$|y$', min=3)
t=time.clock()
train[col]=train[col].apply(lambda x: ' '.join([rs.stem(word) for word in x.split()]))
print(time.clock()-t)

http://www.nltk.org/api/nltk.stem.html

http://snowball.tartarus.org/algorithms/english/stemmer.html