Тематическое моделирование с использованием неотрицательной матричной факторизации

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

Что такое NMF (неотрицательная матричная факторизация)?

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

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

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

import json
import numpy as np
import pandas as pd
import re, nltk, spacy, string
nlp = spacy.load("en_core_web_sm")
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
from plotly.offline import plot
import plotly.graph_objects as go
import plotly.express as px
from textblob import TextBlob
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from pprint import pprint
import en_core_web_sm
from sklearn.decomposition import NMF
import warnings
warnings.filterwarnings("ignore")
from gensim.corpora.dictionary import Dictionary
from gensim.models.nmf import Nmf
from gensim.models.coherencemodel import CoherenceModel
from operator import itemgetter
from subprocess import check_output
from wordcloud import WordCloud, STOPWORDS
import pickle
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.metrics import f1_score
from sklearn.metrics import classification_report
file = open('complaints-2021-05-14_08_16.json')
data = json.load(file)
complaints_data = pd.json_normalize(data)
## Replacing blank cells in the "Complaints_what_happned" with nan
complaints_data[complaints_data['complaint_what_happened'] == ''] = np.nan
## Removing all rows where complaints column is nan
complaints_data = complaints_data.dropna(subset = ['complaint_what_happened'])
pd.options.mode.chained_assignment = None
complaints_data['complaint_what_happened'] = complaints_data['complaint_what_happened'].astype(str)
def clean_text(text):
'''
   1. Make text lowercase
   2. Remove text in square brackets
   3. Remove punctuations.
   4. Remove numbers.
'''
   text = text.lower()
   text = re.sub(r'\[.*?\]','', text)
   text = re.sub(r'[%s]'%re.escape(string.punctuation),'',text)
   text = re.sub(r'\w*\d\w*','',text)
   return(text)
complaints_data_clean = pd.DataFrame(complaints_data['complaint_what_happened'].apply(lambda x: clean_text(x)))

2. Исследовательский анализ данных очищенного набора данных

  • Визуализируйте данные в соответствии с длиной символа «Жалоба».
  • Используя облако слов, найдите первые 40 слов по частоте среди всех статей после обработки текста.
  • Найдите верхние униграммы, биграммы и триграммы по частоте среди всех жалоб после обработки текста.

3. Облако слов

Модель униграммы: -

N-граммы также называются последовательностями n слов. Языковая модель, основанная на определении вероятности на основе подсчета последовательности слов, может быть названа языковой моделью N-грамм. В зависимости от количества слов N-грамма может быть:

  • Unigram: Последовательность всего из 1 слова
  • Биграмма: последовательность из 2 слов
  • Триграмма: последовательность из 3 слов

В обработке естественного языка n-грамма представляет собой последовательность n слов. Например, «статистика» — это униграмма (n = 1), «машинное обучение» — биграмма (n = 2), «обработка естественного языка» — триграмма (n = 3). Для более длинных n-грамм люди просто используют их длину, чтобы идентифицировать их, например, 4 грамма, 5 граммов и так далее. В этой части проекта мы сосредоточимся только на языковых моделях, основанных на униграммах, то есть на отдельных словах.

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

Использованная литература:

  1. https://www.analyticsvidhya.com/blog/2021/06/part-15-step-by-step-guide-to-master-nlp-topic-modelling-using-nmf/
  2. https://www.geeksforgeeks.org/non-negative-matrix-factorization/