NLTK: как получить доступ к фрагменту строки
Я использую 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
обратите внимание на пространство между %
и цифры. Это логически правильно, но не желаемый результат. Я хочу точную строку, так как я хочу знать начальный и конечный индексы захваченных строк.
Как я могу достичь этого?
1 ответ
(Ужасно хаки) Для вашего примера строки и теги:
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
Затем вы можете обобщить это для любого списка предложений и части речевых тегов.