February 2, 2021

Парсинг строковых полей для извлечения признаков

Эффективность работы моделей машинного обучения определяется качеством формируемой  признаковой базы. Зачастую для отбора категорий признаков и их  извлечения требуется проявлять изобретательность и проводить сложную  работу, например, парсинг строковых полей. Решение последней задачи во  многом облегчается при использовании библиотеки Pandas.

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

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

Для демонстрационных целей будем работать с таблицей о продаже недвижимости в Республике Северная Осетия-Алания следующего вида:

Крайнее поле под названием «desc» содержит описание объявления, поэтому его мы и будем парсить в дальнейшем.

Визуализация

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

Добавление столбца-индикатора

После изучения указанного поля я составил словарь слов-индикаторов хорошего ремонта, которые задал в списке around_w_l  (точнее основы слов для удобства задания регулярного выражения). Затем  для каждого слова проверяется его присутствие рядом (слева или справа)  со словом ремонт в каждом поле столбца (посредством векторизованного метода contains). При наличии хотя бы в одном случае совпадения соответствующее значение поля столбца будет 1, иначе – 0:

around_w_l=['дорог', 'капитальн', 'шикарн', 'евро', r'кап.', 'новы', 'идеальн','полн','современн']
search_series = df['desc']

ind_final = pd.Series([False]*len(df['desc']))
ind_temp = pd.Series([False]*len(df['desc']))

for word in around_w_l:
templ_l = re.compile(r'{}[а-я]*\s+{}[а-я]*'.format(word, 'ремонт'))
templ_r = re.compile(r'{}[а-я]*\s+{}[а-я]*'.format('ремонт',word))

ind_temp = np.any(pd.concat([df['desc'].str.contains(templ_l), df['desc'].str.contains(templ_r)],axis=1),axis=1)
ind_final = np.any(pd.concat([ind_final, ind_temp],axis=1),axis=1)

ind_final = ind_final.astype(int)

В скольких случаях найден заданный шаблон можно посмотреть следующим образом:

Не пропустите ничего интересного и подписывайтесь на страницы канала в других социальных сетях:

Instagram

Яндекс Дзен

Telegram