【问题标题】:RegEx Filter for common words常用词的正则表达式过滤器
【发布时间】:2016-04-03 17:47:39
【问题描述】:

我正在尝试从一段文本中删除常用词(连词、副词、代词等)。我正在使用正则表达式,但由于某种原因,我的过滤器中的一些常用词没有被过滤掉。

一些没有被过滤的单词示例:“havent”、“why”、“should”

有什么想法吗?

 splitResult = s.split()
        p = re.compile(
            """^(&|also|a|about|again|all|after|are(nt)?|arent|as|an(y)?|at|
                bcuz|before|be(low)?|between|bring|but|by|and|can(not)?|close(d)?|could(nt)?|
                cuz|do(nt)?|down|decide(d)?|decision|on(to)?|or|of|our|over|out|have(nt)?|he(re)?|
                her|his|other(s)?|even|got(ten)?|for|from|get(s)?|got(ten)?|has(nt)?|havent|he(s)?|
                him|his|if|in|to|in(to)?|is(nt)?||make|me|once|play(ed)?|role|say(s)?|seen|she(s)?|
                should(nt)?|stop(ped)?|time|my|no(t)?|must(nt)?|now|you(re)?|your|want|want(ed)?|
                watch(ed)?|way|we(re)?|will|with||i|a|is(nt)?|just|would(nt)?|before|that|the(re)?|
                their|them|they|this|turn|when|at|how|it(s)?|which|who|after|then|if|how|because|know(s)?|
                yet|[A-Za-z]{1,2}|http(s)?://.*|www\..*)$""",re.I)

        for word in splitResult:
            m = p.findall(word)
            if not m:
                word = "".join(c for c in word if c not in ("?", ".", "!", '"', ",","'","(",")"))
                wordsList.insert(ctr,word)

【问题讨论】:

  • 我认为这是一个更适合自然语言处理的工作,例如:stackoverflow.com/questions/9953619/…
  • 我把它放在Regex101,你可以在解释部分看到错误(虽然它没有突出显示)。基本上你有is(nt)?||make,应该是is(nt)?||makewith||i,应该是with|i。两者都有 2 || 而不是 1。这不能解决问题,但我建议你更新你的 RegEx
  • 我找不到任何问题,我只是将捕获组转换为非捕获以获得更清晰的输出:请参阅demo。请注意,您可以通过对具有共同结尾的关键字进行分组来进一步缩小此模式以使其更有效。

标签: regex python-3.x


【解决方案1】:

您的模式没有 why 作为其替代之一。

您的模式似乎变得如此之大,以至于您无法管理它。

当周围有空格或撇号时,您的模式不匹配。

haventshould 没有理由过滤失败,否则。没有更多代码,没人知道。

(以下是 regex101.com 中的错误,但您仍应相应地修复您的正则表达式。)

根据regex101.com有以下两个错误:

|此位置的交流发电机有效地截断了组,使超出此点的任何其他标记都无用

这意味着你的代码中有||s,本质上。

注意:如果您想匹配虚无(相当于空字符串),则不应在之后进行更改,因为此正则表达式引擎会匹配最早的更改。

他们在这里:

  • ||make
  • |with||i

(使用正则表达式找到:\|\|

【讨论】:

  • 这是一个不错的选择。错误消息,hiwever,可以改进 :) 双 || 使正则表达式匹配“无”,在这一点上 - 它并没有真正截断。 (确实如此,但都在规则之内。)
  • @RadLexus 我没有选择那个措辞。去告诉regex101.com那个。
  • 我意识到 ||我只是想解释一下这个问题。
  • || 无效,因为该模式在开头和结尾都锚定。
  • @CasimiretHippolyte 我调查了一下,发现了一个bug report。我会回去看看我是否能更好地回答这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-19
  • 2017-07-18
  • 2016-09-02
相关资源
最近更新 更多