Подсчет числа упоминаний организаций в тексте

Рейтинг: 0Ответов: 1Опубликовано: 16.03.2023

Возник вопрос по функционалу библиотеки Natasha. Допустим, требуется извлечь именованные сущности (named entities) из текста, а затем подсчитать частоту упоминания каждой в этом тексте. Путем сегментирования текста и NER можно увидеть подобные сущности в тексте:

from natasha import (
    Segmenter,
    NewsNERTagger,
    NewsEmbedding,
    Doc,
    ORG
)

segmenter = Segmenter()
emb = NewsEmbedding()
ner_tagger = NewsNERTagger(emb)

text = "Газпром планирует приобрести компанию Апекс Банк за 1 миллиард рублей. Газпром обозначил, что переговоры уже начаты."

doc = Doc(text)

doc.segment(segmenter)

doc.tag_ner(ner_tagger)

doc.ner.print()

Как результат будет такая визуализация:

Газпром планирует приобрести компанию Апекс Банк за 1 миллиард рублей.
ORG────                               ORG───────                      
Газпром обозначил, что переговоры уже начаты.
ORG────

Однако, мне требуется получить лист с частотой упоминаемости, вроде такого:

2 Газпром
1 Апекс Банк

В документации natasha есть предзаготовленные экстракторы дат, персон и денежных единиц, но по организациям нет; указано обращаться к библиотеке yargy и писать свой экстрактор. Но yargy ищет только предзаданные конструкции (на сколько понимаю), я же не знаю, какие организации могут быть упомянуты в тексте (в примере дал короткий, но на практике они больше). Каков может алгоритм решения проблемы, что я упускаю?

Ответы

▲ 1Принят

Попробуйте так:

from collections import Counter

counter = Counter([org.text for org in doc.spans if org.type =='ORG'])
print(counter.most_common())

Суть в том, что размеченный текст находится в doc.spans, можно перебрать его элементы и взять из них нужные. Ну и посчитать их.