我正在尝试使用NLTK来帮助我解析一些文本。作为一个例子,我有:
1 Robins Drive owned by Gregg S. Smith was sold to TeStER, LLC of 494 Bridge Avenue, Suite 101-308, Sheltville AZ 02997 for $27,000.00.
使用:
words =pos_tag(word_tokenize(sentence))
我明白了:
[('1', 'CD'), ('Robins', 'NNP'), ('Drive', 'NNP'), ('owned', 'VBN'), ('by', 'IN'), ('Gregg', 'NNP'), ('S.', 'NNP'), ('Smith', 'NNP'), ('was', 'VBD'), ('sold', 'VBN'), ('to', 'TO'), ('TeStER', 'NNP'), (',', ','), ('LLC', 'NNP'), ('of', 'IN'), ('494', 'CD'), ('Bridge', 'NNP'), ('Avenue', 'NNP'), (',', ','), ('Suite', 'NNP'), ('101-308', 'CD'), (',', ','), ('Sheltville', 'NNP'), ('AZ', 'NNP'), ('02997', 'CD'), ('for', 'IN'), ('$', '$'), ('27,000.00', 'CD'), ('.', '.')]
假设我想要提取“所有者”的角色。 (Gregg S. Smith),有没有办法混合和匹配文字和标签,可能是这样的格式:
'owned by{<NP>+}'
先前在Mixing words and PoS tags in NLTK parser grammars对此进行过讨论,但我不确定我是否理解所提供的答案。这是可能的,如果是这样,你可以提供一个代码示例。
答案 0 :(得分:2)
如果您组合每个单词和标记,然后使用RegEx
查找某些PoS标记序列,您可以获得所需的结果。
例如,使用您已定义的words
变量
joined = ' '.join([w+"<"+t+">" for w,t in words])
会产生
'1<CD> Robins<NNP> Drive<NNP> owned<VBN> by<IN> Gregg<NNP> S.<NNP> Smith<NNP> was<VBD> sold<VBN> to<TO> TeStER<NNP> ,<,> LLC<NNP> of<IN> 494<CD> Bridge<NNP> Avenue<NNP> ,<,> Suite<NNP> 101-308<CD> ,<,> Sheltville<NNP> AZ<NNP> 02997<CD> for<IN> $<$> 27,000.00<CD> .<.>'
然后你必须创建一个正则表达式来根据单词/标签上下文找到你要查找的序列。
例如,使用python RegEx模块re
>>> import re
>>> m = re.match(r'.*owned<VBN> by<IN>.*?<NNP>', joined)
>>> m.group(0)
'1<CD> Robins<NNP> Drive<NNP> owned<VBN> by<IN> Gregg<NNP>'