ОБРАБОТКА ЕСТЕСТВЕННОГО ЯЗЫКА (ЧАСТЬ III)

Нижеследующее является частью серии статей по НЛП. (Отметьте Часть I и Часть II)

Вы когда-нибудь задумывались, как Spotify Discover Weekly может каждую неделю предоставлять вам настраиваемый плейлист, который соответствует вашим вкусам? Вы когда-нибудь искали видео и находили именно то, что искали, в списке рекомендуемых видео на YouTube? Разве не впечатляет то, что ваш любимый новостной веб-сайт предоставляет вам статьи, которые вас интересуют больше всего?
Я имею в виду, что это безумие, иногда даже страшно, как технологии точно знают, о чем вы думаете и что ищете. В этой статье мы собираемся получить информацию о том, как это работает, особенно о системе рекомендаций связанных статей.

Рекомендательная система

Рекомендательный движок — это система, цель которой — прогнозировать предпочтения пользователя, чтобы предоставить ему наилучший персонализированный UX. Мы можем выделить 3 типа рекомендательных систем:

  1. Совместная фильтрация
    Методы, основанные на сборе и анализе большого количества информации о поведении, действиях или предпочтениях пользователей, чтобы предсказать, что понравится пользователям, на основе их сходства с другими пользователями. Ключевое преимущество метода совместной фильтрации заключается в том, что он не зависит от содержимого, поддающегося машинному анализу, и, следовательно, способен точно рекомендовать сложные элементы, такие как фильмы, не требуя «понимания» самого элемента.
    В приведенном выше примере поясняется в простом, как работает совместная фильтрация, в частности, совместная фильтрация на основе пользователей. Представьте, что кто-то любит кино и музыку, но ненавидит живопись, поэтому, если я люблю кино и ненавижу живопись, я, вероятно, полюбил бы и музыку. Таким образом, рекомендательная система использует эту логику для создания предложений, основанных на нашем сходстве.
  2. Фильтрация на основе содержания
    Методы, основанные на описании самого элемента и профиле предпочтений пользователя. В рекомендательной системе, основанной на содержании, для описания элементов используются ключевые слова; кроме того, пользователь создан для указания типа элемента, который нравится этому пользователю.
  3. Гибридные системы рекомендаций
    Как видно из названия, система рекомендаций такого типа представляет собой комбинацию двух методов: совместной фильтрации и фильтрации на основе содержимого. В основном он используется для преодоления некоторых распространенных проблем в системах рекомендаций, таких как холодный запуск: «это касается проблемы, когда система не может связать какие-либо выводы для пользователей или элементов, о которых она еще не собрала достаточно информации».

Когда дело доходит до системы рекомендаций статей, мы можем использовать любой из этих трех типов. Сегодня мы увидим, как мы можем использовать NLP для создания рекомендательной системы Content-Based Filtering. Давайте начнем!

Скрытое распределение Дирихле

Одним из наиболее часто используемых методов обработки естественного языка является тематическое моделирование. Это статистическая модель, основанная исключительно на неконтролируемом обучении, способная обнаруживать различные темы, которые появляются в наборе документов.
В 2003 году Дэвид Блей, профессор факультетов статистики и компьютерных наук Колумбийского университета, вместе со своими коллегами разработал мощный алгоритм под названием «Скрытое распределение Дирихле». С тех пор он стал основным алгоритмом, управляющим многими областями применения, такими как: моделирование тем, классификация документов, кластеризация изображений, анализ настроений и т. д.

Но как это работает?

LDA рассматривается как «вероятностная модель с соответствующим порождающим процессом». Идея модели LDA кажется простой; он предполагает, что определенный набор тем описан заранее. Тогда единственными наблюдаемыми особенностями, которые учитывает модель, являются слова, встречающиеся в документах. Каждое из этих слов с определенной вероятностью относится к определенной теме. После различных итераций модель заканчивает тем, что каждой теме назначается набор слов. В результате каждый документ представляет собой смесь тем с различной вероятностью. Следовательно, в соответствии с термином частотность этих слов в каждом документе, он с наибольшей вероятностью присваивает каждому документу тему. Легко да??

Ну это не так просто. Ниже приведена так называемая диаграмма пластины модели LDA.

Где:
• α: распределение тем по документам
• β: распределение слов по темам
• θ: распределение тем по конкретным документам
• Z: назначение тем
• W: наблюдаемое слово

На приведенной выше диаграмме слово (W) выделено белым цветом, потому что это единственная особенность, наблюдаемая моделью, как мы уже говорили ранее, все остальное считается скрытой переменной.
В процессе оптимизации нашей модели мы можем изменить эти параметры, чтобы получить лучшие результаты. Рассмотрим, например, α и β:
- α: альфа представляет плотность темы документа. При более высоком альфа-канале документы состоят из большего количества тем, а при более низком альфа-канале документы содержат меньшее количество тем. Другими словами, чем выше альфа, тем более документы кажутся похожими.
– β: бета представляет плотность тематических слов. При высокой бете темы состоят из большей части слов корпуса, а при низкой бете — из нескольких слов. Другими словами, чем выше бета, тем больше темы кажутся похожими.

Итак, имея дело с LDA в обработке естественного языка, вы можете возиться с этими параметрами, или вы можете просто использовать библиотеку Python, которая сделает всю работу за вас… здорово, правда?
Дамы и господа, позвольте представить Gensim, библиотеку с открытым исходным кодом для неконтролируемого тематического моделирования и обработки естественного языка. Эта библиотека обеспечивает быструю реализацию LDA, более того, она может позволить модели изучить альфа- и бета-значения для вас.

Хотите увидеть, как это работает? Просто продолжайте читать…

Статьи Expertime Тематическое моделирование

В настоящее время я работаю в Expertime, быстрорастущей компании, эксперте в области инноваций и консультирования по решениям на основе Azure и Office 365, таким как DevOps, данные и искусственный интеллект.
На нашем сайте есть блог, в котором наши эксперты публикуют статьи о последних новостях и инсайтах в области технологий. Я подумал, что было бы интересно применить тематическое моделирование для определения различных тем, о которых говорят мои коллеги. Я за ними не слежу.. Мне просто «страстно любопытно» 😊

Я зашел в Expertime Blog (там вы можете найти французские версии нескольких моих статей) и нашел только 3 статьи, чтобы упростить демонстрацию.
На самом деле, я провел парсинг в Интернете, чтобы получить данные. Для этого я использовал пару библиотек: requests и BeautifulSoup.

#Imports
import requests
from bs4 import BeautifulSoup
#Scraping Function
def url_to_transcript(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')
    text = soup.find(class_="wrap").find_all('p')
    print(url)
    return text
#Articles links from Expertime's Blog
urls = ["https://expertime.com/blog/a/power-bi-api-sncf/",
        "https://expertime.com/blog/a/expertech-architecture-chatbot-azure-framework/",
        "https://expertime.com/blog/a/7-malentendus-blockchain/"]

Теперь нам нужно поместить все в Pandas DataFrame, который в основном представляет собой двухмерную помеченную структуру данных, как показано ниже:

#Store the articles into a dataframe
import pandas as pd
pd.set_option('max_colwidth', 150)
df = pd.DataFrame(d)

Когда мы закончим, мы применим некоторые приемы предварительной обработки текста, которые мы изучили в предыдущей статье Это тот же гамбургер!!».. помните?
• Сделать текст строчными
• Расширить сокращения
• Удалить знаки препинания
• Орфографическая коррекция
• Удалить стоп-слова
• Часть фильтрации речи
Таким образом, мы получим чистый DataFrame, подобный этому:

В предыдущей статье мы также говорили о разнице между структурированными и неструктурированными данными и о том, что НЛП предоставляет нам процесс извлечения значимой информации из текста посредством применения различных алгоритмов. Итак, давайте преобразуем наш текст (неструктурированные данные) в более структурированную форму. Вот почему мы собираемся использовать матрицу «документ-термин», где каждая строка — это документ (в нашем случае статья), а каждый столбец — это термин. Для этого мы будем использовать CountVectorizer от Sklearn.

#Create a new document-term matrix using only nouns
from sklearn.feature._extraction import text
from sklearn.feature._extraction import CountVectorizer
#Create a new document-term matrix and remove common words that apper more than 75% with max_df
cvna = CountVectorizer(max_df = 0.75)
data_cvna = cvna.fit_transform(df.Speech)
data_dtmna = pd.DataFrame(data_cvna.toarray(), columns = cvna.get_feature_names())
data_dtmna.index = df.index
data_dtmna.head()

Теперь, когда мы преобразовали наш текст в матрицу, стало намного проще применять некоторые математические алгоритмы. Давай сделаем это! Сейчас самое время вызвать LDA с помощью Genism.

#Gensim import
from gensim import matutils, models
import scipy.sparse
#Create the gensim corpus
corpusna = matutils.Sparse2Corpus(scipy.sparse.csr_matrix(data_dtmna.transpose()))
#Create the vocabulary dictionary
id2wordna = dict((v,k) for k,v in cvna.vocabulary_.itels())

Еще одна строка кода для применения LDA, и все готово. Как вы видите ниже, все, что нам нужно сделать, это выбрать количество тем, количество слов, описывающих каждую тему, и количество проходов или количество итераций алгоритмы. Это буквально так просто. Позже вы можете возиться с параметрами alpha и beta или просто позволить Gensim сделать всю работу за вас.

#LDA model result
ldana = models.LdaModel(corpus=corpusna, num_topics=3, id2word=id2wordna, passes = 1500)
ldana.print_topics(num_words=3)

Я нашел следующие статьи:
Power BI и API SNCF: хорошая ассоциация?
Архитектура ChatBot с Microsoft Azure и Bot Framework
7 пользователей, работающих в сети. де ла Блокчейн»

И результаты действительно впечатлили!! Я позволю вам судить за себя.

Продолжение следует …