Список, хранящийся в переменной entities
, имеет тип list[list[tuple[str, str]]]
, где первая запись в кортеже - это строка для объекта, а вторая - тип объекта, например:
>>> from pprint import pprint
>>> pprint(entities)
[[],
[('Ishmael', 'GPE')],
[('Some years ago', 'DATE')],
[],
[('November', 'DATE')],
[],
[('Cato', 'ORG')],
[],
[],
[('Manhattoes', 'ORG'), ('Indian', 'NORP')],
[],
[('a few hours', 'TIME')],
...
Затем вы можете создать реверс dict
следующим образом:
>>> sum(filter(None, entities), [])
[('Ishmael', 'GPE'), ('Some years ago', 'DATE'), ('November', 'DATE'), ('Cato', 'ORG'), ('Manhattoes', 'ORG'), ('Indian', 'NORP'), ('a few hours', 'TIME'), ('Sabbath afternoon', 'TIME'), ('Corlears Hook to Coenties Slip', 'WORK_OF_ART'), ('Whitehall', 'PERSON'), ('thousands upon thousands', 'CARDINAL'), ('China', 'GPE'), ('week days', 'DATE'), ('ten', 'CARDINAL'), ('American', 'NORP'), ('June', 'DATE'), ('one', 'CARDINAL'), ('Niagara', 'ORG'), ('thousand miles', 'QUANTITY'), ('Tennessee', 'GPE'), ('two', 'CARDINAL'), ('Rockaway Beach', 'GPE'), ('first', 'ORDINAL'), ('first', 'ORDINAL'), ('Persians', 'NORP')]
>>> from collections import defaultdict
>>> type2entities = defaultdict(list)
>>> for entity, entity_type in sum(filter(None, entities), []):
... type2entities[entity_type].append(entity)
...
>>> from pprint import pprint
>>> pprint(type2entities)
defaultdict(<class 'list'>,
{'CARDINAL': ['thousands upon thousands', 'ten', 'one', 'two'],
'DATE': ['Some years ago', 'November', 'week days', 'June'],
'GPE': ['Ishmael', 'China', 'Tennessee', 'Rockaway Beach'],
'NORP': ['Indian', 'American', 'Persians'],
'ORDINAL': ['first', 'first'],
'ORG': ['Cato', 'Manhattoes', 'Niagara'],
'PERSON': ['Whitehall'],
'QUANTITY': ['thousand miles'],
'TIME': ['a few hours', 'Sabbath afternoon'],
'WORK_OF_ART': ['Corlears Hook to Coenties Slip']})
dict
, хранящийся в переменной type2entities
, - это то, что вы хотите. Чтобы получить имена наиболее часто встречающихся людей в первых 500 строках (и соответствующее количество упоминаний):
>>> from collections import Counter
>>> entities = [[(entity.text, entity.label_) for entity in nlp(sentence).ents]for sentence in documents[:500]]
>>> person_cnt = Counter()
>>> for entity, entity_type in sum(filter(None, entities), []):
... if entity_type == 'PERSON':
... person_cnt[entity] += 1
...
>>> person_cnt.most_common(5)
[('Queequeg', 17), ('don', 4), ('Nantucket', 2), ('Jonah', 2), ('Sal', 2)]