Что мы ищем, чтобы сделать здесь, по существу, является группа некоторые пункты classified_text
вместе ... так само собой разумеется, что itertools.groupby()
может помочь. Прежде всего, нам нужна ключевая функция, которая обрабатывает элементы с тегами 'PERSON'
или 'LOCATION'
как похожие, и все остальные элементы в отдельности.
Это немного осложняется тем фактом, что нам нужно различать смежные элементы, имеющие один и тот же тег (кроме 'PERSON'
или 'LOCATION'
), например. ('is', 'O'), ('the', 'O')
и т.д. Мы можем использовать enumerate()
для этого:
>>> list(enumerate(classified_text))
[..., (2, ('is', 'O')), (3, ('the', 'O')), (4, ('president', 'O')), ...]
Теперь, когда мы знаем, что мы будем предоставлять в качестве входных данных для groupby()
, мы можем написать нашу ключевую функцию:
def person_or_location(item):
index, (word, tag) = item
if tag in {'PERSON', 'LOCATION'}:
return tag
else:
return index
Обратите внимание, что структура index, (word, tag)
в присваивании соответствует структуре каждого элемента в нашем списке.
После того, как мы получили, что мы можем написать еще одну функцию, чтобы сделать фактическое слияние:
from itertools import groupby
def merge(tagged_text):
enumerated_text = enumerate(tagged_text)
grouped_text = groupby(enumerated_text, person_or_location)
return [
' '.join(word for index, (word, tag) in group)
for key, group in grouped_text
]
Вот она в действии:
>>> merge(classified_text)
['Barak Obama', 'is', 'the', 'president', 'of', 'United States of America']
Вау, это намного лучше, чем я бы сделал это. –