Python 设计正则表达式以查找任何名词短语

Python 设计正则表达式以查找任何名词短语,python,regex,chunking,Python,Regex,Chunking,我正在尝试使用正则表达式(并且没有NLTK)构建一个分块器(或浅层解析器),但无法找到一个能够实现我所希望的功能的正则表达式。我的近期目标是:在自然语言文本中找到所有名词短语 我的第一步是用自制的词性标记器标记所有句子,然后将标记/标记对列表加入一个字符串,如下所示: 'he PRN and CC bill NP could MOD hear VB them PRN on IN the DT large JJ balcony NN near IN the DT house NN' 我的下一步是

我正在尝试使用正则表达式(并且没有NLTK)构建一个分块器(或浅层解析器),但无法找到一个能够实现我所希望的功能的正则表达式。我的近期目标是:在自然语言文本中找到所有名词短语

我的第一步是用自制的词性标记器标记所有句子,然后将标记/标记对列表加入一个字符串,如下所示:

'he PRN and CC bill NP could MOD hear VB them PRN on IN the DT large JJ balcony NN near IN the DT house NN'
我的下一步是使用正则表达式在字符串中搜索名词短语的实例。现在,名词短语的一般语言公式是:可选限定词(DT)、零个或多个形容词(JJ)和名词(NN)、专有名词(NP)或代词(PRN)。根据这个一般公式,我尝试了这个正则表达式(请记住,标记字符串在单词和标记之间交替):

这是我的密码:

text = 'he PRN and CC bill NP could MOD hear VB them PRN on IN the DT large JJ balcony NN near IN the DT house NN'

regex = re.compile(r'(\w+ DT)? (\w+ JJ)* (\w+ (NN|NP|PRN))')
m = regex.findall(text)

if m:
     print m
这是我的输出:

[('the DT', 'large JJ', 'balcony NN', 'NN')]
它找不到代词或专有名词,出于某种原因,它只在'\w+DT\w+NN'模式中匹配'NN'。我假设我的正则表达式将匹配这些patersn,因为我将限定符模式a s可选(?)和形容词模式设置为零次或多次(*)

克里斯

用这个:

(?:(?:\w+ DT )?(?:\w+ JJ )*)?\w+ (?:N[NP]|PRN)

  • (?:(?:\w+DT)?(?:\w+JJ)*)?
    可选地匹配DT,后跟零个或多个Ajective
  • “\w+(?:N[NP]| PRN)”与
    NN
    NP
    PRN
    • 您的正则表达式是

      (\w+ DT)? (\w+ JJ)*|(\w+ (?:NN|NP|PRN))
      

      谢谢您的帮助。您的演示显示它工作得相当好,但是当我将它插入到我的程序中时,我的输出是:[('','he PRN'),('','','','',('','','','','',('','bill NP'),('','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',('','','','','','','','','','','','','','','','','','','','','','','','','',(“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,“”,’,是其中一个答案帮你解决了问题,还是问题仍然存在?你是对的。我移动了一个空格字符的位置,我想这可以修复它。尝试新的演示。:)谢谢下次见。:)查看快速修补后的解决方案,希望它不会引入新的错误。:)
      (\w+ DT)? (\w+ JJ)*|(\w+ (?:NN|NP|PRN))