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

С помощью несложного текст майнинга можно узнать, за что дают подарки.

Компания своим клиентам дарит подарки. Причины различны. И сотрудники компании вносят информацию о них в систему, данные которой хранятся на HADOOP.

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

Так как данные хранятся в HADOOP — логично использовать библиотеки, которые для этого разработаны — PYSPARK ML.

Что нам нужно:

  1. Создать набор данных для текст майнинга.
  2. Обработать его с помощью библиотек PYSPARK ML.
  3. Визуализировать.
  1. Создание набора данных для текст майнинга.

Подключимся к HADOOP через Python, используя библиотеки PySpark:

import os
import sys
 from pyspark import SparkConf
from pyspark.sql import SparkSession, HiveContext, SQLContext
 from pyspark.sql.functions import udf
from pyspark.sql.types import StringType, ArrayType
import pandas as pd
conf = SparkConf().setAppName('text_mining').setMaster('yarn')
conf.setAll([ 
## здесь ваши set
 ])
spark = SparkSession.builder.config(conf=conf).enableHiveSupport().getOrCreate()")
sqlc = HiveContext(spark)
sqlContext =SQLContext(sqlc)

И создадим набор данных для текст — майнига:

query = '''SELECT descriptions FROM  crm_podarki'''
# descriptions - информация, внесенная работниками в систему о причинах
df = sqlContext.sql(query)
df.show(5)

2. Обработка набора данных с помощью библиотек PYSPARK ML.

Загрузим необходимые библиотеки для текст майнинга:

from pyspark.ml.feature import RegexTokenizer
import nltk
import pymorphy2
from nltk.corpus import stopwords
pymorph = pymorphy2.MorphAnalyzer()
ru_stop_word = stopwords.words('russian')

Используем RegexTokenizer для разбиения текста на отдельные слова:

rt = RegexTokenizer(inputCol = "descriptions",outputCol = "txt",pattern=r"\s+")
df_text =rt.transform(df)

Определим функцию для нормализации (лемматизации) слов и исключения из текста стоп-слов.

def prep(text):
     text =  [str(pymorph.normal_forms(word)[0]) for word in text if word not in ru_stop_word]
     Return text

Приведем слова в тексте к первоначальному виду и удалим стоп-слова:

prep_udf = udf(prep, ArrayType(StringType()))
df_text =df_text.withColumn('final',prep_udf('txt'))
df_text.show(5)

Последний штрих: загрузим все слова в один DataFrame и сохраним в файл формата csv:

df_pd = df_txt.toPandas()
pd_list=[]
for lst in df_pd['final']:
     pd_list += lst
df_pd_text = pd.DataFrame(df_list, columns=['words'])
df_pd_text.to_csv('podarok.csv')

Таким образом, мы получили файл со всеми словами, которые были в текстах сообщений.

3.Визуализация результатов майнинга текста.

Для  визуальной оценки воспользуемся стеком ElasticSearch — Kibana.

Загрузим полученный файл в индекс ElasticSearch, используя инструмент Kibana.

Для визуализации воспользуемся инструментом визуализации — облако тегов.

Видим: в облаке есть слова, которые не относятся к причинам: “Клиент”,”Подарок”.

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

Таким же образом можно исключить и другие теги, которые визуально не относятся к словам причин подарков.

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

Как видите, не так много нужно действий и кода, чтобы узнать — получать подарки просто!