【问题标题】:Can I perform stemming using regular expressions?我可以使用正则表达式执行词干提取吗?
【发布时间】:2012-12-13 10:00:12
【问题描述】:

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

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

(\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”匹配玻璃,因此条件“s”被丢弃。在玻璃(不匹配)的情况下,条件 's' 被丢弃,因为另一个 's' 在它之前,它不完全匹配。我必须承认我不是 100% 了解这一点,所以我的逻辑可能看起来有点不稳定,这只是一个想法。

【问题讨论】:

  • 不,这不是正则表达式的工作——尤其是删除s
  • 一些例子表明语言知识是必要的:applyslyspeciesnucleusby

标签: regex stemming


【解决方案1】:

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

有大量关于词干提取和词形还原的文献。 Google 是您的朋友。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    但是,这仍然存在将glass 拆分为glass 的问题。要处理这个问题,你需要类似

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

    在另一个 s 之前使用否定查找来防止 s 替代匹配。

    【讨论】:

      【解决方案3】:

      作为在/for 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-31
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        相关资源
        最近更新 更多