Найти тему
Властелин машин

Как просто разметить неструктурированные поля с Python

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

Пусть перед нами стоит проблема распределения описаний набора товаров по их кодовым наименованиям. При этом описания вводятся пользователями базы данных без соблюдения единого порядка.

Допустим мы располагаем двумя файлами:

  • с кодами и соответствующими им унифицированными названиями товаров
  • введенными людьми описаниями, которые необходимо разметить

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

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

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

-2

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

-3

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

Напоследок реализуем функцию, которая и будет заниматься разметкой. На входе она примет списки кодов, названий, поисковых фраз и описаний товаров:

-4

Проверим ее работу на наших демонстрационных данных:

-5

Полный код сценария приведен ниже:

-6
-7

-8