我正在尝试使用正则表达式(并且没有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。图案。我假设我的正则表达式与这些用户匹配,因为我将确定器模式设置为可选(?),将形容词模式设置为零或更多次(*)。
克里斯