Использование обработки естественного языка для поддержки малого бизнеса.

Семейный магазин итальянских деликатесов Altomonte’s Italian Market предлагает традиционные итальянские деликатесы в районе Большой Филадельфии с тех пор, как владельцы иммигрировали в США более 50 лет назад. Начав с небольшой мясной лавки с одной комнатой в Джермантауне, Altomonte’s превратился в бизнес с двумя магазинами, обслуживающими тысячи покупателей в неделю. Владельцы, Фрэнсис и покойный Микеле, соединили итальянские и американские традиции с идеями 21-го века, особенно с помощью их сына Винсента и дочери Марии. Altomonte’s по-прежнему проводит большую часть своего анализа по традиции, в том числе отбирает бычков для своего мясного отдела, интуитивно зная, сколько мяса покупатели купят в зависимости от времени года. Перейдя в 21 век, они внедрили технологические достижения, такие как киоски с сенсорным экраном для заказов сэндвичей, а также другие средства инноваций в операции своего бизнеса. Эти достижения, направленные на обеспечение одновременной работы, также включают создание присутствия в Интернете, где их платформы социальных сетей добились огромного успеха. Итак, где же Альтомонте может расти дальше? Может ли использование машинного обучения (ML) в их повседневных операциях по-прежнему способствовать развитию итальянского рынка и деликатесов Altomonte? Ответ положительный. Семейный итальянский рынок, а не крупная технологическая компания из Кремниевой долины, может извлечь выгоду из анализа машинного обучения.

Обработка естественного языка

Обработка естественного языка (NLP) - это сфера деятельности машинного обучения, которая анализирует человеческую речь и текст для экстраполяции скрытых идей документа. Text Mining в НЛП - это идея, что мы можем получить дополнительные знания из основной части текста или корпуса, используя различные преобразования слов и алгоритмы НЛП. Чтобы лучше понять тему основного текста, можно использовать различные подходы. Анализ тематической модели позволяет аналитику извлекать информацию и предлагать темы или резюме всего текста. Модели анализа настроений вместо того, чтобы искать разные темы и заголовки для описания данных, смотрят на скрытые эмоции в данных. В обоих подходах используются различные алгоритмы, от Скрытой модели распределения Дирихле до Биграммных моделей и Нейронных сетей. Хотя я не планирую показывать вам, как я создал искусственную нейронную сеть (ИНС), которая может преобразовывать английский сленговый текст в итальянский и обнаруживать ваш сарказм, я могу показать вам, как методы НЛП помогли поддержать и дать понимание Традиционный итальянский рынок.

Анализ настроений

Я мог бы вдаваться в более мелкие детали и статистические выводы из анализа, который я провел для Altomonte, вместо этого я подумал, что сделаю его интересным и объясню, как я обучал сверточную нейронную сеть (CNN) делать прогнозы настроений в обзорах рынка Facebook. Так что расслабьтесь, наслаждайтесь хорошей тарелкой спагетти и фрикадельками (или давайте перейдем к десерту и канноли) и наслаждайтесь!

Что такое анализ настроений?

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

Сверточные нейронные сети

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

Анализ настроений: онлайн-обзоры итальянского рынка Altomonte

Для анализа использовались следующие библиотеки Python:

import keras
from keras.layers import Input, Conv1D, Embedding , MaxPooling1D, GlobalMaxPooling1D, Dense
from keras.models import Model
from keras.preprocessing.text import Tokenizer
from keras.optimizers import Adam
from keras.preprocessing.sequence import pad_sequences
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

Данные

Обучающие данные представляли собой корпус, в который вошли онлайн-обзоры из Yelp, TripAdvisor и Google Reviews. Обзоры охватывают последние 10 лет работы Altomonte’s. Каждому обзору в обучающей выборке соответствует оценка от 1 до 5, где 1 считается плохим, а 5 - отличным. У обзоров Facebook нет рейтинга, что подтверждает их использование в качестве тестовых данных для предсказания их скрытого значения.

df = pd.read_csv('Altomontes_reviews.csv')
df.head()

Как показано выше, данные представляют собой список обзоров с функциями «Месяц», «Год», «Рейтинг» и «Платформа» для каждого обзора.

Обработка данных

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

df = df.drop(['Month','Year','Platform'],axis=1)
df2 = df

Затем был создан новый двоичный столбец под названием «Метка», в котором было указано 1, если отзыв был признан положительным, и 0, если отзыв был признан отрицательным. Было решено, что отзывы с оценкой 3 или выше будут положительными, а отзывы 2 или ниже - отрицательными.

df['Label'] = [1 if x >=3 else 0 for x in df['Rating']]

Следующая часть предварительной обработки включает превращение слов, известных как «токены» в предложениях, в последовательность чисел.

MAX_VOCAB_SIZE = 10000 
tokenizer = Tokenizer(num_words=MAX_VOCAB_SIZE)
tokenizer.fit_on_texts(X_train)
sequences_train = tokenizer.texts_to_sequences(X_train)
sequences_test = tokenizer.texts_to_sequences(X_test)

Был установлен максимальный размер словаря 10000, чтобы последовательности не становились слишком большими. Сначала был создан токенизатор, и отзывы были токенизированы. Подробнее о том, как работает токенизатор, можно прочитать здесь. Затем токенизированные обзоры были преобразованы в последовательности для чтения CNN. После токенизации слов их необходимо сопоставить с индексом. Это гарантирует, что каждое слово имеет свои уникальные числовые последовательности.

word2idx = tokenizer.word_index
V = len(word2idx)

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

data_train = pad_sequences(sequences_train,padding='post')
data_test = pad_sequences(sequences_test,maxlen=T,padding='post')

Обработка данных завершена, и CNN можно обучить на онлайн-обзорах итальянского рынка Альтомонте.

Модель

Для модели была сформулирована CNN с тремя одномерными слоями. Первоначальный ввод был вектором формы (T,), где T - длина каждой из последовательностей. Слой встраивания превращает каждую из проиндексированных переменных в векторы размером 20.

D = 20 
i = Input(shape = (T,))
x = Embedding(V +1 , D)(i)
x = Conv1D(16,2,activation='relu',)(x)
x = MaxPooling1D(2)(x)
x = Conv1D(32,2,activation='relu')(x)
x = GlobalMaxPooling1D()(x)
x = Dense(1,activation='sigmoid')(x)
model = Model(i,x)

Как только модель была создана, она была скомпилирована с использованием двоичной кросс-энтропии в качестве функции потерь. Использовалась бинарная кросс-энтропия, поскольку оцениваемые критерии заключались в том, был ли обзор правильно идентифицирован как 1 (положительный) или 0 (отрицательный).

model.compile(loss='binary_crossentropy',optimizer = 'adam',metrics = ['accuracy'])

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

r = model.fit(data_train,y_train,epochs=5,validation_data=(data_test,y_test))

Достигнутая точность составила 87,8% после 5 эпох, что неплохо. Одна проблема, которая возникла при обучении, заключалась в том, что набор данных был небольшим, и поэтому переоснащение было серьезной проблемой. Уменьшение параметров (меньше слоев) и некоторый отсев были полезны в преодолении переобучения. Altomonte’s следует подумать о том, чтобы собирать больше обзоров в будущем, чтобы получить более обобщаемую модель для прогнозов.

Прогнозы

Пример обзора со страницы Итальянского рынка Альтомонте в Facebook (эй, зацените!):

«Очень рекомендую !!! Я никогда не знал об Альтомонтесе, пока друг недавно не принес мне обед. Мы с мужем решили пойти и проверить это, и пока мы были там, мы встретили владелицу, и она была самым милым человеком на свете! По сути, она устроила нам экскурсию. Мы купили курицу марсалу на ужин, и это было замечательно! Мы также купили бруклинскую пиццу на обед, и она была восхитительной! Мы попробовали их кофе, и они дали нам попробовать канноли, бискотти и печенье. Очень хороший! Мы купили ракушки, соус маринара, бутылку вина, немного сыра и т. Д. Все выглядело хорошо, вкусно, и мы могли проводить там часы! Мы вернемся!! Может быть, сегодня? »

Читая этот обзор, мы можем интуитивно увидеть, что это положительно, однако что предсказывает модель?

review = tokenizer.texts_to_sequences(instance)
pred_list = []
for sublist in review:
    for item in sublist:
        pred_list.append(item)
predict_list = [predict_list]
review = pad_sequences(flat_list, padding='post', maxlen=T)
prediction = model.predict(review).round()

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

array([[1.]], dtype=float32)

Как видите, отзыв был получен как 1 или положительный (с точностью примерно 88%)! И точно так же у нас есть модель прогнозирования CNN, которую Альтомонте может использовать для оценки отношения и чувства клиентов к их бизнес-операциям на основе обзоров без рейтинга!

Вывод

Есть много методов машинного обучения, которые малые предприятия могут включить в структуру своей деятельности, чтобы помочь лучше понять производительность и эффективность бизнеса. Обработка естественного языка удобна для предприятий пищевой промышленности, чтобы получить более глубокое представление о том, что думает клиент, а не просто смотреть отзывы и делать обоснованные предположения. Что касается итальянского рынка Alomonte, существует множество других не обсуждаемых техник НЛП, которые можно применить. Тематическая модель Анализ отзывов может дать обратную связь о том, что клиенты замечают и что им нравится, когда они гуляют по предприятиям Altomonte. Один вывод и рекомендация для малых предприятий, чтобы получить наилучшие результаты от анализа машинного обучения, - это начать сбор и хранение огромных объемов данных и начать использовать модели НЛП. Спасибо за чтение!

Источники

  1. Жерон, А .: Практическое машинное обучение с помощью Scikit-Learn и TensorFlow: концепции, инструменты и методы для создания интеллектуальных систем. O’Reilly Media, Севастополь, Калифорния (2017).
  2. Васильев Юлий. Обработка естественного языка с помощью Python и Spacy: практическое введение. Сан-Франциско: без крахмала, 2020. Печать.
  3. Использование изображения было одобрено компанией Altomonte’s Italian Market Inc.