当前位置: 首页 > 面试题库 >

如何使用nltk正则表达式模式提取特定的短语块?

毋琪
2023-03-14
问题内容

我写了以下正则表达式来标记某些短语模式

pattern = """
        P2: {<JJ>+ <RB>? <JJ>* <NN>+ <VB>* <JJ>*}
        P1: {<JJ>? <NN>+ <CC>? <NN>* <VB>? <RB>* <JJ>+}
        P3: {<NP1><IN><NP2>}
        P4: {<NP2><IN><NP1>}

    """

此模式将正确标记短语,例如:

a = 'The pizza was good but pasta was bad'

并使用2个短语给出所需的输出:

  1. 披萨很好
  2. 意大利面不好

但是,如果我的句子是这样的:

a = 'The pizza was awesome and brilliant'

仅匹配短语:

'pizza was awesome'

而不是所需的:

'pizza was awesome and brilliant'

我如何在第二个示例中也加入正则表达式模式?


问题答案:

首先,让我们看一下NLTK提供的POS标签

>>> from nltk import pos_tag
>>> sent = 'The pizza was awesome and brilliant'.split()
>>> pos_tag(sent)
[('The', 'DT'), ('pizza', 'NN'), ('was', 'VBD'), ('awesome', 'JJ'), ('and', 'CC'), ('brilliant', 'JJ')]
>>> sent = 'The pizza was good but pasta was bad'.split()
>>> pos_tag(sent)
[('The', 'DT'), ('pizza', 'NN'), ('was', 'VBD'), ('good', 'JJ'), ('but', 'CC'), ('pasta', 'NN'), ('was', 'VBD'), ('bad', 'JJ')]

(注意:以上是NLTK v3.1的输出pos_tag,旧版本可能有所不同)

您实际上想要捕获的是:

  • NN VBD JJ CC JJ
  • 神经网络

因此,让我们用以下模式来捕捉它们:

>>> from nltk import RegexpParser
>>> sent1 = ['The', 'pizza', 'was', 'awesome', 'and', 'brilliant']
>>> sent2 = ['The', 'pizza', 'was', 'good', 'but', 'pasta', 'was', 'bad']
>>> patterns = """
... P: {<NN><VBD><JJ><CC><JJ>}
... {<NN><VBD><JJ>}
... """
>>> PChunker = RegexpParser(patterns)
>>> PChunker.parse(pos_tag(sent1))
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('awesome', 'JJ'), ('and', 'CC'), ('brilliant', 'JJ')])])
>>> PChunker.parse(pos_tag(sent2))
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('good', 'JJ')]), ('but', 'CC'), Tree('P', [('pasta', 'NN'), ('was', 'VBD'), ('bad', 'JJ')])])

所以这就是通过硬编码“作弊”!

让我们回到POS模式:

  • NN VBD JJ CC JJ
  • 神经网络

可以简化为:

  • NN VBD JJ(CC JJ)

因此,您可以在正则表达式中使用可选的运算符,例如:

>>> patterns = """
... P: {<NN><VBD><JJ>(<CC><JJ>)?}
... """
>>> PChunker = RegexpParser(patterns)
>>> PChunker.parse(pos_tag(sent1))
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('awesome', 'JJ'), ('and', 'CC'), ('brilliant', 'JJ')])])
>>> PChunker.parse(pos_tag(sent2))
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('good', 'JJ')]), ('but', 'CC'), Tree('P', [('pasta', 'NN'), ('was', 'VBD'), ('bad', 'JJ')])])

很有可能您使用的是旧标记器,这就是为什么您的模式有所不同的原因,但是我想您会发现您可以使用上面的示例捕获所需的短语。

这些步骤是:

  • 首先,使用 pos_tag
  • 然后概括模式并简化它们
  • 然后将它们放入 RegexpParser


 类似资料:
  • 句子的输入列表: 所需输出: 是否有一种方法可以使用内置或第三方标记器使用提取引用(可以以单引号和双引号显示)? 我曾尝试使用tokenizer作为值提供单引号和双引号,但结果与预期相差甚远,例如: 有类似这样和这样的线程,但它们都建议使用基于正则表达式的方法,但是,我很好奇这是否只能用来解决-听起来像是自然语言处理中的常见任务。

  • 问题内容: 我在包含一些文本的文本文件中有字符串,如下所示: 我希望在类名之前获取所有内容。 我已经尝试了以下方法,但是我不知道该如何摆脱 我得到以下信息: 而不是我想要的: 关于如何解决此问题的任何指示? 问题答案: 如果不使用捕获组,则可以使用超前(业务)。 应该捕获您想要的一切。这里是细分的:

  • 我正在尝试使用python中的正则表达式。我构建了正则表达式,如下所示。我知道用于匹配搜索字符串的开头。我已使用包含多个的匹配模式构建框架,但我不确定将如何尝试匹配搜索字符串中的模式。 我预计会引发错误,关于无效的正则表达式,但它不会引发任何错误,也不会返回任何匹配项。 所以,我的问题是或是有效的正则表达式吗?

  • 问题内容: 考虑以下熊猫数据框: 更新: 我想用正则表达式提取电影的标题。因此,让我们使用以下正则表达式:。所以我尝试了以下方法: 但是,我得到以下信息: 关于如何从熊猫数据框中的文本中提取特定功能的任何想法?更具体地说,如何在全新的数据框中仅提取电影的标题?例如,所需的输出应为: 问题答案: 您可以尝试和,但最好使用,因为电影名称中也可以是数字。下一个解决方案是括号的内容以及 前导空格和尾随空格

  • 我需要编写一个具有以下规则的正则表达式: null null 这些示例无效: > 12--11(因为它包含两个连字符) 1-2345(因为它包含5号) <>是字符出现在最后一个位置,那么在字符之前必须有一个数字not hypen。 即11-A(必须不及格)11-1A(必须及格)

  • 我是正则表达式的初学者,并尝试搜索特定的数字模式。以下数据以 XML 格式嵌入。 要求是提取数据(最里面的列表)。在这个例子中,数据从24779开始到24760。注意:每次数据可能不是从“24”开始。因此,我计划通过以下逻辑提取:如果标签名(在本例中:DUT_1_PC)具有非零的有效数据,并且有效数据的计数大于100,用逗号分隔,则提取该列表及其标签名(DUT_1_PC)。 我无法提取所需的数据。