Время прочтения: 4 мин.

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

Анализ огромного потока неструктурированной текстовой информации является одним из постоянных действий любого человека. Для того, чтобы провести быстрый обзор ключевых моментов существуют современные технологичные инструменты, такие как графы знаний или knowledge graph. Графы знаний используются для наглядного представления взаимосвязей между людьми, событиями, предметами и т.д.

Данные для обработки были предварительно собраны из новостных источников с веб-сайтов организаций, а также дополнительно проведены простые манипуляции:

  • местоимения заменены на наименования компаний;
  • предложения разделены в список.

Чтобы построить knowledge graph необходимо в предложении определить несколько основных сущностей, а именно: субъекта, объекта и отношения между ними. В качестве субъектов и объектов чаще всего выступают следующие части речи: простые или составные имена существительные, а также связанные с ними прилагательные в отдельных случаях. Функцию построения отношений между частями речи в русском языке могут выполнять как глаголы, так и существительные. Подготовленный набор данных выглядит следующим образом:

Процесс построения графа знаний состоит из нескольких этапов: анализ текстовой информации, затем построение графической интерпретации. Для работы с текстовой информацией используется библиотека spacy, а для построения графов – связка Networkx и PyViz.

  1. подключение необходимых библиотек:
import re
import pandas as pd
import spacy
import networkx as nx
from pyvis.network import Network
nlp = spacy.load("ru_core_news_sm")
df = pd.DataFrame(list_, columns=['Предложения'])
df.head(4)

2. выделение основных сущностей с помощью библиотеки spacy и загруженной модели, обученной для русского языка:

def get_object_subject(str_):
    object_,subject_  = "", ""
    prefix, postfix  = "", ""
    flag1, flag2 = False, False
    for token in nlp(str_):
        if token.dep_ != "punct":
          
            if token.dep_=="nsubj":
                subject_ = token.text
                flag1 = True

            if token.dep_=="obj":
                object_ = token.text
                flag2 = True
            
            if token.dep_.endswith("mod") == True:
                prefix = token.text
                
            if token.dep_.endswith("ppos") == True:
                postfix = token.text
                
        if prefix != "" :
            if flag1:
                subject_ = prefix +" "+ subject_
                flag1 = False
            if flag2:
                object_ = prefix +" "+ object_
                flag2 = False
            prefix = ""
       
        if postfix != "" :
            if flag1:
                subject_ = subject_ + " " + postfix
                flag1 = False
            if flag2:
                object_ = object_ + " " + postfix
                flag2 = False
            postfix = ""
        
    return [subject_.strip(), object_.strip()]
object_subject = [get_object_subject(i) for i in df["Предложения"]]
relations = [get_relation(i) for i in df['Предложения']]

3. формируем набор данных для построения графа:

result_df = pd.DataFrame({'subject_':[i[0] for i in object_subject], 'object_':[i[1] for i in object_subject], 'relation_':relations})

4. обработанные данные выглядят следующим образом:

5. построение графа на основе выделенных из предложений параметров:

G=nx.from_pandas_edgelist(result_df, "subject_", "object_", 
                          edge_attr=["relation_"], create_using=nx.MultiDiGraph())
nt = Network(height='750px', width='100%')
nt.from_nx(G)
for node in nt.nodes:
    if node['label'] == 'Компания Магнит':
        node['color'] = 'red'
    elif node['label'] == 'Компания Роснефть':
        node['color'] = 'yellow'
    elif node['label'] == 'Компания Норникель':
        node['color'] = 'blue'
    else :
        node['color'] = 'grey'
nt.show('nx.html')

Полученный граф выглядит:

Таким образом, с помощью построения графа знаний мы определили на примере отдельно взятых компании, каким основным направлениям ESG уделяется пристальное внимание. Аналогичную процедуру можно провести и для других российских компаний.