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

Затем вы можете обобщить это для любого списка предложений и части речевых тегов.

Другие вопросы по тегам