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

При анализе данных есть необходимость выявлять объекты контроля по атрибутам, размещенным в неструктурированном текстовом поле. На первый взгляд, задача может показаться легкой, если анализируемый объем незначительный, но когда объем обрабатываемой базы составляет миллионы строк, то для решения задачи необходим творческий подход.

Передо мной стояла задача по выявлению выгодоприобретателей наших клиентов и определению даты последнего обновления сведений о них. Решать ее буду с использованием библиотек Python pandas и json.

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

document_data = docs['some_texts'].values.tolist()
organizational_legal_form = ['за ИП', 'за ООО', 'за ЗАО', 'за ОАО', 'за ТСЖ', 'за КФХ', 'за               
АО', 'за УК', 'за ЧПО', 'за ЧОП']
inn = 'ИНН'

def organizational_legal_form_search(sent, key):
    forms = []
    if key in sent:
        keyindex = sent.index(key)
        forms.append(sent[keyindex] + ' ' + sent[keyindex+2])
    return forms

def tokenize(text): 
    punktuation = ['!@"“’"«»#$%№&\'()*+,—/:;<=>?^_`{|}~\[\]©.\x0c”,©\n-']
    tokens = [i for i in text.split()]
    tokens = [word for word in tokens if word not in punktuation and word != '']
    return tokens 

tokens = [tokenize(txt) for txt in document_data] 
inns = [organizational_legal_form_search(token, inn) for token in tokens]
for token in tokens:
    orgs = [organizational_legal_form_search(token, key) for key in 
organizational_legal_form]

Для большего понимания приведу пример результата:

Было:

Стало:

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

Import pandas as pd 
import json
file = r" ЕГРИП_ИНН_ИП.xlsx"
tab = pd.read_excel(file, engine="openpyxl")
new_tab = pd.DataFrame()
inns = list(tab["egrip.innfl"])
ltab = len(tab)

for n, row in enumerate(tab["egrip.svzapegrip"]):
    inn = inns[n]
    if isinstance(row, float):
        continue
    inner_part = row[1:-1]
    inner_part = inner_part.split("},{")
    for elem in inner_part:
        if elem =='': continue
        if elem[0] != '{':
            elem = '{'+ elem
        if elem[-1] != '}':
                elem +='}'
        try:
            elem = json.loads(elem)
            tab_elem = json_normalize(elem)
            tab_elem['ИНН'] = [inn] * len(tab_elem)
            new_tab = pd.concat([tab_elem, new_tab])
        except:
            try:
                elem =  json.loads(row)
            except:continue
            tab_elem = json_normalize(elem)
            tab_elem['ИНН'] = [inn] * len(tab_elem)
            new_tab = pd.concat([tab_elem, new_tab])
            break

Пример результата:

Было:

Стало:

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

Разработанный код по обработке текстового поля я смог использовать и в решении последующих задач. Мне необходимо было обработать файлы хозяйственных договоров и извлечь названия контрагентов. Для выполнения этой задачи я изменил в коде значение переменной organizational_legal_form на «с одной стороны, и».

Текст в файле:

   Общество с ограниченной ответственностью «ННННННННН», именуемое в дальнейшем «Заказчик», в лице директора ВВВВВВ, действующей на основании устава, с одной стороны, и Общество с ограниченной ответственностью частная охранная организация «РРРРРРРРРР», именуемое в дальнейшем «Исполнитель», в лице Генерального директора МММММММ, действующего на основании Устава, с другой стороны, далее совместно именуемые «Стороны», а каждая в отдельности «Сторона», заключили настоящий Договор (далее – Договор) о нижеследующем:

Текст после обработки:

Общество с ограниченной ответственностью частная охранная организация «РРРРРРРРРР»

Так получилось успешно применить разработку и подтвердить её универсальность.