Практические руководства

NMF - Наглядное объяснение и реализация на Python

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

Истоки NMF

«Основано ли восприятие целого на восприятии его частей?»

Исследователи Ли и Сын продолжают излагать математическую основу NMF в своей статье в журнале Nature 1999 года: «Здесь мы демонстрируем алгоритм неотрицательной матричной факторизации, который может изучать части лиц и семантические особенности текст. "

Красота науки о данных заключается в ее способности преобразовывать довольно философскую теорию в математические алгоритмы, которые проверяют полезность такой теории. NMF отвечает на вопрос - до какой степени целое является суммой своих частей? И как мы используем эти детали? Компании обычно используют эти части для поиска закономерностей и ассоциаций между более сложными объектами в целом.

В бизнес-контексте темы могут использоваться для сегментирования клиентов по типам и различного таргетинга на них. Кроме того, матрица «документ-тема» может использоваться для отображения каждого документа в пространстве и предоставления системы рекомендаций, основанных на сходствах и различиях.

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

Тематическое моделирование: как извлечь темы из большого корпуса документов?

Мы преобразуем корпус документов в числа, чтобы ответить на такие вопросы, как:

  • Какие темы преобладают в этом корпусе?
  • Насколько важна каждая тема в каждом документе?
  • Насколько хорошо эти извлеченные темы описывают исходный документ?
  • Насколько похож один документ на другой?

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

Терминология

Мы используем корпус для обозначения группы похожих средств массовой информации. Для NMF это может быть группа текстов, таких как статьи, изображения, такие как аэрофотоснимки или портреты, аудио, такие как песни, или видео на YouTube - все, что может быть концептуализировано как добавление частей (а не сложение и вычитание частей). Мы используем документ для обозначения одного текста, фотографии, песни или видео. термин - это слово.

NMF - это форма тематического моделирования - искусства выделения значимых тем, которые повторяются в корпусе документов. Корпус состоит из набора тем, встроенных в его документы. документ состоит из иерархии тем. тема состоит из иерархии терминов.

NMF использует логику гипотезы распределения, подробно рассмотренную в статье шведского лингвиста Магнуса Сальгрена Гипотеза распределения.

Сальгрен предлагает одно часто цитируемое объяснение:

«Эта гипотеза часто формулируется в таких терминах, как« похожие по значению слова встречаются в аналогичных контекстах »(Рубенштейн и Гуденаф, 1965)»

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

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

Давайте копаться!

NMF

NMF означает скрытый семантический анализ с методом «неотрицательной матричной факторизации», который используется для разложения матрицы документ-термин на две меньшие матрицы - матрицу «документ-тема» (U) и матрица «тема-термин» (W), каждая из которых заполняется. с ненормированными вероятностями.

Значения в V могут быть аппроксимированы посредством матричного умножения W и H. Например, серый прямоугольник в V можно найти путем матричного умножения первой строки W на первый столбец H, также выделенный серым цветом. Первая строка V может быть аппроксимирован умножением первой строки матрицы W на всю матрицу H.

V означает "видимый"

В V-матрице каждая строка представляет Документ, который состоит из частоты употребления Терминов, то есть счетчика встречаемости каждого слова. Каждый столбец представляет видимые переменные. Для обработки изображений видимыми переменными будут определенные пиксели. Вот отрывок из V-матрицы текста речи инаугурации президента:

W - вес

В матрице W каждая строка представляет документ, который состоит из ненормализованных вероятностей тем. Каждый столбец представляет семантическую функцию, которая повторяется во всем корпусе. Для обработки изображений функциями будут конкретные прототипные характеристики, такие как «усы». Вот отрывок из W-матрицы текста речи инаугурации президента:

H означает скрытый

В матрице H каждая строка представляет тему или семантическую функцию, которая состоит из частотности терминов. Каждый столбец представляет видимую переменную. Два термина, которые часто встречаются вместе, образуют тему, и каждый термин дает более контекстное значение для термина, с которым он сгруппирован. Если термин часто встречается в двух темах, то, вероятно, эти темы связаны. Вот отрывок из H матрицы текста речи инаугурации президента:

Реконструкция V

Матрицы W и H могут использоваться для приближенного восстановления V посредством умножения матриц.

Искусство тематического моделирования

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

В приведенном выше примере для Темы (p) установлено значение 6. Каждый столбец матрицы W представляет вероятность того, что тема присутствует в документе. Каждая строка матрицы W представляет собой распределение частотности тем в каждом документе. Каждая строка матрицы H представляет собой распределение частотности терминов в каждой теме, и ее можно рассматривать как степень, в которой каждый термин активен в каждой теме.

Математика NMF

Как и большинство алгоритмов машинного обучения, NMF работает, начиная с предположения значений W и H и итеративно минимизируя функцию потерь. Обычно это реализуется путем обновления одной матрицы (W или H) для каждой итерации и продолжения минимизации функции ошибок, || V - WH || = 0, а значения W и H остаются неотрицательными, пока W и H не станут стабильными. Существуют разные функции потерь, используемые для обновления матриц в зависимости от используемого вами программного пакета, но в исходной статье Ли и Сына предложена функция правила мультипликативного обновления. Честно говоря, математика довольно сложна, и мне потребовалось бы некоторое исследование, чтобы осмыслить ее и объяснить в стиле без суеты. Я собираюсь называть это выходящим за рамки этой статьи. :-).

Предостережения в отношении NMF

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

NMF и TF-IDF

Преимущество NMF по сравнению с TF-IDF состоит в том, что NMF разбивает матрицу V на две меньшие матрицы, W и H. Специалист по данным может установить количество Темы (p), чтобы определить, насколько малы эти матрицы. Специалисты по обработке данных часто используют полученную из TF-IDF матрицу «документ-термин» в качестве входной матрицы V, поскольку она дает лучшие результаты.

NMF по сравнению с другими методами разложения матриц

NMF отличается от других методов разложения матриц, таких как PCA и VQ, тем, что в нем используются только неотрицательные числа. Это позволяет каждой теме или функции быть интерпретируемой. Кроме того, W и H могут быть представлены разреженными матрицами, в которых закодированы только значения ›0, что делает меньший набор данных.

Реализация Python

Обычно это порядок операций:

  1. Импортируйте соответствующие библиотеки в Jupyter Notebook / Установите библиотеки в своей среде
  2. Выберите данные и импорт
  3. Изолировать данные от тематической модели
  4. Чистые данные
  5. Создать функцию для предварительной обработки данных *
  6. Создать матрицу терминов документа «V»
  7. Создать функцию для отображения тем *
  8. Запустите NMF по матрице терминов документа «V»
  9. Итерируйте, пока не найдете полезные темы

* Звездочка указывает на необязательные шаги

1. Импортируйте необходимые библиотеки Python.

Для работы с фреймами данных и экспорта вам понадобятся:

  • панды
import pandas as pd

Из scikit learn для моделирования вам понадобятся:

  • TfidfVectorizer
  • NMF
  • текст
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.decomposition import NMF
from sklearn.feature_extraction import text

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

  • стоп-слова
  • word_tokenize
  • pos_tag
from nltk.corpus import stopwords
from nltk import word_tokenize, pos_tag
from nltk.stem import WordNetLemmatizer

Для очистки текста вам могут понадобиться:

  • re (регулярные выражения)
  • нить
import re
import string

2. Выберите "Данные и импорт".

Затем выберите свой корпус документов. Я использую Речи при инаугурации американского президента, доступные в виде набора данных Kaggle. У меня действительно возникла ошибка, когда я попытался импортировать речи без пункта Engine, но я просто погуглил свою ошибку и воспользовался этим предложением движка, которое сработало для меня.

# expand pandas df column display width to enable easy inspection
pd.set_option('max_colwidth', 150)
# read in csv to dataframe
df = pd.read_csv('inaug_speeches.csv', engine='python')
# visually inspect dataframe
df.head()

3. Изолируйте данные в тематической модели

Я собираюсь сделать фреймворк имен и речей президента и выделить его до инаугурационной речи первого срока, потому что у некоторых президентов не было второго срока. Это создает корпус документов одинаковой длины.

# Select Rows that are first term inaugural addresses
df = df.drop_duplicates(subset=['Name'], keep='first')
# Clean Up Index
df = df.reset_index()
# Select only President's Names and their Speeches
df = df[['Name', 'text']]
# Set Index to President's Names
df = df.set_index('Name')
# Visually Inspect
df.head()

4. чистые данные

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

def clean_text_round1(text):
    '''Make text lowercase, remove text in square brackets, 
    remove punctuation, remove read errors,
    and remove words containing numbers.'''
    text = text.lower()
    text = re.sub('\[.*?\]', ' ', text)
    text = re.sub('[%s]' % re.escape(string.punctuation), ' ', text)
    text = re.sub('\w*\d\w*', ' ', text)
    text = re.sub('�', ' ', text)
    return text
round1 = lambda x: clean_text_round1(x)
# Clean Speech Text
df["text"] = df["text"].apply(round1)
# Visually Inspect
df.head()

5. Создайте функцию для предварительной обработки данных *

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

# Noun extract and lemmatize function
def nouns(text):
    '''Given a string of text, tokenize the text 
    and pull out only the nouns.'''
    # create mask to isolate words that are nouns
    is_noun = lambda pos: pos[:2] == 'NN'
    # store function to split string of words 
    # into a list of words (tokens)
    tokenized = word_tokenize(text)
    # store function to lemmatize each word
    wordnet_lemmatizer = WordNetLemmatizer()
    # use list comprehension to lemmatize all words 
    # and create a list of all nouns
    all_nouns = [wordnet_lemmatizer.lemmatize(word) \
    for (word, pos) in pos_tag(tokenized) if is_noun(pos)] 
    
    #return string of joined list of nouns
    return ' '.join(all_nouns)
# Create dataframe of only nouns from speeches
data_nouns = pd.DataFrame(df.text.apply(nouns))
# Visually Inspect
data_nouns.head()

6. Создайте матрицу терминов документа «V»

Здесь я добавил несколько игнорируемых слов в список запрещенных слов, чтобы мы не встречали такие слова, как Америка в темах, поскольку это не имеет особого смысла в данном контексте. Я также использую TF-IDF Vectorizer вместо простого Count Vectorizer, чтобы придать большее значение более уникальным терминам. Узнать больше о TF-IDF можно здесь.

# Add additional stop words since we are recreating the document-term matrix
stop_noun = ["america", 'today', 'thing']
stop_words_noun_agg = text.ENGLISH_STOP_WORDS.union(stop_noun)
# Create a document-term matrix with only nouns
# Store TF-IDF Vectorizer
tv_noun = TfidfVectorizer(stop_words=stop_words_noun_agg, ngram_range = (1,1), max_df = .8, min_df = .01)
# Fit and Transform speech noun text to a TF-IDF Doc-Term Matrix
data_tv_noun = tv_noun.fit_transform(data_nouns.text)
# Create data-frame of Doc-Term Matrix with nouns as column names
data_dtm_noun = pd.DataFrame(data_tv_noun.toarray(), columns=tv_noun.get_feature_names())
# Set President's Names as Index
data_dtm_noun.index = df.index
# Visually inspect Document Term Matrix
data_dtm_noun.head()

7. Создайте функцию для отображения тем *

Чтобы оценить, насколько полезны темы, созданные NMF, нам нужно знать, что они из себя представляют. Здесь я создаю функцию для отображения самых популярных слов, активированных для каждой темы.

def display_topics(model, feature_names, num_top_words,\ topic_names=None):
'''Given an NMF model, feature_names, and number of top words, print topic number and its top feature names, up to specified number of top words.'''
    # iterate through topics in topic-term matrix, 'H' aka
    # model.components_
    for ix, topic in enumerate(model.components_):
        #print topic, topic number, and top words
        if not topic_names or not topic_names[ix]:
            print("\nTopic ", ix)
        else:
            print("\nTopic: '",topic_names[ix],"'")
        print(", ".join([feature_names[i] \
             for i in topic.argsort()[:-num_top_words - 1:-1]]))

8. Запустите NMF на матрице терминов документа «V»

Возможно, самый простой шаг - запустить NMF в матрице терминов документа, если она у вас есть.

nmf_model = NMF(2)
# Learn an NMF model for given Document Term Matrix 'V' 
# Extract the document-topic matrix 'W'
doc_topic = nmf_model.fit_transform(data_dtm_noun)
# Extract top words from the topic-term matrix 'H' display_topics(nmf_model, tv_noun.get_feature_names(), 5)

9. Итерируйте, пока не найдете полезные темы.

Вот здесь-то и появляется искусство. В качестве базовой фиктивной модели я обычно пропускаю текст через векторизатор счетчика, а затем через NMF, чтобы получить представление о том, на что мы смотрим. Мы можем перебирать номера тем, части речи, настройки TF-IDF, добавлять стоп-слова и, вероятно, многое другое. Получить полезные темы можно на глаз, и это определенно непросто.

nmf_model = NMF(8)
doc_topic = nmf_model.fit_transform(data_dtm_noun)
display_topics(nmf_model, tv_noun.get_feature_names(), 5)

Выводы

Создавать полезные темы сложно даже с помощью алгоритмов.

Однако здесь мы видим 8 тем инаугурации, которые можно описать как: законы, мир, лидерство, расходы, справедливость, доходы, идеалы, принятие решений. Это только начало проекта по расследованию инаугурационных речей. Вот некоторые вопросы, которые мы можем задать по поводу этих результатов:

  • Какой президент сосредоточился на каких темах?
  • Какие выступления президента больше всего похожи?
  • Есть ли четкое разделение между недавними президентами-демократами и республиканцами с точки зрения тематической направленности? Есть ли четкое движение тем во времени?

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

Дальнейшее чтение

На TF-IDF



Создание системы рекомендаций на основе тем, созданных NMF



NMF по сравнению с другими методами тематического моделирования

Существует несколько распространенных способов преобразования корпуса текстов в темы - LDA, SVD и NMF. Вы можете прочитать этот документ Объяснение и сравнение алгоритмов тематического моделирования, чтобы узнать больше о различных алгоритмах тематического моделирования и оценить их эффективность. Я экспериментировал со всеми тремя методами и обнаружил, что запуск NMF на матрице TF-IDF дает наиболее интерпретируемые результаты при минимальном времени выполнения, поэтому в этой статье я углубился в NMF.

  • LDA: скрытый алгоритм Дирихле - основан на вероятности и разбивает корпус на две матрицы. Это генеративная модель, в которой вы можете использовать эти меньшие матрицы для восстановления исходного текста. Это требует очень большого набора данных и большего времени выполнения, чтобы получить полезные результаты в моем опыте.
  • SVD: скрытый семантический анализ с разложением по сингулярным значениям - способ разложения матрицы документа-термина на три меньшие матрицы, которые можно переформатировать в две матрицы, содержащие как отрицательные, так и положительные ненормализованные вероятностей, что препятствует прямой интерпретации разложенных матриц.
  • NMF: скрытый семантический анализ с неотрицательной матричной факторизацией - способ разложения матрицы документ-термин на две меньшие матрицы, содержащие только положительные значения, что позволяет прямую интерпретацию каждой матрица как ненормированные вероятности.

Оригинальная бумага NMF

Несмотря на то, что в Интернете есть масса ресурсов для изучения NMF, я думаю, что всегда лучше обратиться к источнику для более глубокого понимания, поэтому ниже приведена ссылка на исходную статью Ли и Сына о NMF:

Ли, Д., Сын, Х. Изучение частей объектов с помощью неотрицательной матричной факторизации. Nature 401, 788–791 (1999). https://doi.org/10.1038/44565

Документация по NMF scikit learn

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

NMF, контролируемый темой

Этот метод является контролируемым вращением в NMF и позволяет пользователю больше контролировать темы. Я еще не вникал в это, но хотел бы знать, есть ли у кого-нибудь!