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

时间:2014-06-24 01:13:03

标签: python regex chunking

我正在尝试使用正则表达式(并且没有NLTK)构建一个chunker(或浅层解析器),但是不能提出一个能够做我想做的事情的正则表达式。这是我的直接目标:在自然语言文本中查找所有名词短语。

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

'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)。鉴于这个通用公式,我尝试了这个正则表达式(请记住标记的字符串在单词和标签之间交替):

'(\w+ DT)? (\w+ JJ)* (\w+ (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。图案。我假设我的正则表达式与这些用户匹配,因为我将确定器模式设置为可选(?),将形容词模式设置为零或更多次(*)。

克里斯

2 个答案:

答案 0 :(得分:6)

使用此:

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

请参阅demo

  • (?:(?:\w+ DT )?(?:\w+ JJ )*)?可选地匹配DT,然后是零或更多的ajectives
  • ' \ w +(?:N [NP] | PRN)'匹配NNNPPRN

答案 1 :(得分:0)

你的正则表达式是,

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

DEMO