use*_*038 9 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'
Run Code Online (Sandbox Code Playgroud)
我的下一步是使用正则表达式在字符串中搜索名词短语的实例.现在,名词短语的一般语言公式是:可选的确定词(DT),零个或多个形容词(JJ),以及名词(NN),专有名词(NP)或代词(PRN).给定这个通用公式,我尝试了这个正则表达式(请记住,标记的字符串在单词和标签之间交替):
'(\w+ DT)? (\w+ JJ)* (\w+ (NN|NP|PRN))'
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
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
Run Code Online (Sandbox Code Playgroud)
这是我的输出:
[('the DT', 'large JJ', 'balcony NN', 'NN')]
Run Code Online (Sandbox Code Playgroud)
它没有找代词或专有名词,并且由于某种原因只匹配'\ w + DT\w + NN'模式中的'NN'.我认为我的正则表达式会匹配这些使用者,因为我将确定器模式设置为可选(?),将形容词模式设置为零或更多次(*).
克里斯
用这个:
(?:(?:\w+ DT )?(?:\w+ JJ )*)?\w+ (?:N[NP]|PRN)
Run Code Online (Sandbox Code Playgroud)
见演示.
(?:(?:\w+ DT )?(?:\w+ JJ )*)? 可选地匹配DT,然后是零或更多的主观NN,NP或PRN