【发布时间】:2014-08-14 03:25:05
【问题描述】:
我正在尝试使用正则表达式(并且没有 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)。鉴于这个通用公式,我尝试了这个正则表达式(记住标记字符串在单词和标签之间交替):
'(\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'。我假设我的正则表达式会匹配这些模式,因为我将确定模式设置为可选 (?) 并将形容词模式设置为零次或多次 (*)。
克里斯
【问题讨论】: