NLTK:如何访问分块字符串
NLTK: How to access the chunked string
我正在使用 NLTK 分块,我想捕获与我的规则匹配的字符串。例如
这是我的意见
The stocks show 67% rise, last year it was 12% fall
我想捕捉
67% rise
和 12% fall
POS 标记上面的句子显示
('The', 'DT'), ('stocks', 'NNS'), ('show', 'VBP'), ('67', 'CD'), ('%', 'NN'), ('rise', 'NN'), (',', ','), ('last', 'JJ'), ('year', 'NN'), ('it', 'PRP'), ('was', 'VBD'), ('12', 'CD'), ('%', 'NN'), ('fall', 'NN')
现在,我想出了一个简单的规则
Stat: {<CD><NN>(<NN>+|<VBN>|JJ)?}
效果很好并捕获
('67', 'CD'), ('%', 'NN'), ('rise', 'NN')
('12', 'CD'), ('%', 'NN'), ('fall', 'NN')
现在,我想提取捕获的确切字符串。所以,我想要
67% rise
和 12% fall
我试过了
current=[]
for word,tag in subtree.leaves():
current.append(word)
print ' '.join(current)
但我得到
67 % rise
和 12 % fall
注意 %
和数字之间的 space。这在逻辑上是正确的,但不是所需的输出。我想要确切的字符串,因为我想知道捕获的字符串的开始和结束索引。
我怎样才能做到这一点?
(骇人听闻)
对于您的示例字符串和标签:
s = ('The', 'DT'), ('stocks', 'NNS'), ('show', 'VBP'), ('67', 'CD'), ('%', 'NN'), ('rise', 'NN'), (',', ','), ('last', 'JJ'), ('year', 'NN'), ('it', 'PRP'), ('was', 'VBD'), ('12', 'CD'), ('%', 'NN'), ('fall', 'NN')
a = (('67', 'CD'), ('%', 'NN'), ('rise', 'NN'))
c = 'The stocks show 67% rise, last year it was 12% fall'
编辑:作为列表理解:
>>>c[min((c.index(i[0]) for i in a)):max((c.index(i[0]) for i in a)) + [len(i[0]) for i in a][-1]]
>>>'67% rise'
找出每个单词在您输入的句子中出现的位置。记录每个单词的长度。
检查您想要的词性标记在示例句子中的位置。
(编辑:如果不需要则删除)
position=[]
lengths=[]
for wordtag in a:
print wordtag,c.index(i[0]),wordtag[0],len(wordtag[0])
position.append(c.index(wordtag[0]))
lengths.append(len(wordtag[0]))
> ('67', 'CD') 16 67 2
> ('%', 'NN') 18 % 1
> ('rise', 'NN') 20 rise 4
print position
print lengths
> [16, 18, 20]
> [2, 1, 4]
根据所需标签的最小和最大位置对输入的句子进行切片。你加一个lengths[-1]
来增加单词的长度rise
.
valid = c[min(position):max(position) + lengths[-1]]
print valid
> [16, 18, 20]
> [2, 1, 4]
> 67% rise
然后您可以将其概括为任何句子列表和词性标记。
我正在使用 NLTK 分块,我想捕获与我的规则匹配的字符串。例如
这是我的意见
The stocks show 67% rise, last year it was 12% fall
我想捕捉
67% rise
和 12% fall
POS 标记上面的句子显示
('The', 'DT'), ('stocks', 'NNS'), ('show', 'VBP'), ('67', 'CD'), ('%', 'NN'), ('rise', 'NN'), (',', ','), ('last', 'JJ'), ('year', 'NN'), ('it', 'PRP'), ('was', 'VBD'), ('12', 'CD'), ('%', 'NN'), ('fall', 'NN')
现在,我想出了一个简单的规则
Stat: {<CD><NN>(<NN>+|<VBN>|JJ)?}
效果很好并捕获
('67', 'CD'), ('%', 'NN'), ('rise', 'NN')
('12', 'CD'), ('%', 'NN'), ('fall', 'NN')
现在,我想提取捕获的确切字符串。所以,我想要
67% rise
和 12% fall
我试过了
current=[]
for word,tag in subtree.leaves():
current.append(word)
print ' '.join(current)
但我得到
67 % rise
和 12 % fall
注意 %
和数字之间的 space。这在逻辑上是正确的,但不是所需的输出。我想要确切的字符串,因为我想知道捕获的字符串的开始和结束索引。
我怎样才能做到这一点?
(骇人听闻) 对于您的示例字符串和标签:
s = ('The', 'DT'), ('stocks', 'NNS'), ('show', 'VBP'), ('67', 'CD'), ('%', 'NN'), ('rise', 'NN'), (',', ','), ('last', 'JJ'), ('year', 'NN'), ('it', 'PRP'), ('was', 'VBD'), ('12', 'CD'), ('%', 'NN'), ('fall', 'NN')
a = (('67', 'CD'), ('%', 'NN'), ('rise', 'NN'))
c = 'The stocks show 67% rise, last year it was 12% fall'
编辑:作为列表理解:
>>>c[min((c.index(i[0]) for i in a)):max((c.index(i[0]) for i in a)) + [len(i[0]) for i in a][-1]]
>>>'67% rise'
找出每个单词在您输入的句子中出现的位置。记录每个单词的长度。
检查您想要的词性标记在示例句子中的位置。 (编辑:如果不需要则删除)
position=[]
lengths=[]
for wordtag in a:
print wordtag,c.index(i[0]),wordtag[0],len(wordtag[0])
position.append(c.index(wordtag[0]))
lengths.append(len(wordtag[0]))
> ('67', 'CD') 16 67 2
> ('%', 'NN') 18 % 1
> ('rise', 'NN') 20 rise 4
print position
print lengths
> [16, 18, 20]
> [2, 1, 4]
根据所需标签的最小和最大位置对输入的句子进行切片。你加一个lengths[-1]
来增加单词的长度rise
.
valid = c[min(position):max(position) + lengths[-1]]
print valid
> [16, 18, 20]
> [2, 1, 4]
> 67% rise
然后您可以将其概括为任何句子列表和词性标记。