Python 设计正则表达式以查找任何名词短语
我正在尝试使用正则表达式(并且没有NLTK)构建一个分块器(或浅层解析器),但无法找到一个能够实现我所希望的功能的正则表达式。我的近期目标是:在自然语言文本中找到所有名词短语 我的第一步是用自制的词性标记器标记所有句子,然后将标记/标记对列表加入一个字符串,如下所示: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' 我的下一步是
'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)
看
可选地匹配DT,后跟零个或多个Ajective(?:(?:\w+DT)?(?:\w+JJ)*)?
- “\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))