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

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

В этом сообщении блога описывается некоторый базовый код, который вы можете использовать для реализации (надеюсь!) полезной системы рекомендаций по статьям с использованием Pandas, TfidfVectorizer и cosine_similarity. Мы будем использовать систему рекомендаций на основе контента для создания системы рекомендаций по статьям. Это длинный пост в блоге, в котором много математики и кода, но весь процесс прост для понимания. Давайте начнем!

Система рекомендаций

Рекомендательные системы представляют собой набор алгоритмов или компьютерных программ, основной задачей которых является предоставление рекомендаций пользователям на основе набора параметров. Есть крупные компании, использующие рекомендательные системы, такие как YouTube, Netflix, Amazon, Medium.com, LinkedIn и другие.

Есть две популярные рекомендательные системы, а именно:

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

2. Контентная фильтрация
Это еще один подход к рекомендательной системе, который работает путем сравнения вещей или людей, чтобы увидеть, насколько они похожи. Например, это может быть возраст, местонахождение, пол и т. д. клиента. Если речь идет о продукте, это может быть цена, описание и т. д. потребительских предпочтений в зависимости от свойств товара.

Предварительные требования.
Чтобы приступить к технической части этой статьи, вам потребуется следующее.

1. Python 3
2. Блокнот Jupyter
3. Библиотеки Python (Pandas, NumPy, Scikit-learn)
4. Набор данных — набор данных содержит атрибуты или статьи, а также содержит целевой читатель.

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

Примечание. Код и набор данных можно найти здесь.

Давайте сначала очистим набор данных, удалив столбцы, которые нам не нужны, из набора данных.

#lets clean up the dataset by dropping columns that we don't need from the dataset
article_data.drop(['timestamp', 'contentId', 'authorSessionId', 'authorUserAgent', 'authorRegion', 'authorCountry'], axis=1, inplace=True)
#We have a cleaner data. 
article_data.head()

Основная причина, по которой нам пришлось очистить набор данных, заключается в том, что в некоторых столбцах нашего набора данных есть данные, которые бесполезны для нашей модели, и мы должны их удалить. Чистые данные повысят общую производительность и позволят вам принимать решения на основе доступных данных самого высокого качества. Мы удалили следующие столбцы: Timestamp, ContentId, AuthorSessionId, AuthorUserAgent, AuthorCountry.

Чтобы удалить несколько столбцов:

article_data.drop([‘timestamp’, ‘contentId’, ‘authorSessionId’, ‘authorUserAgent’, ‘authorRegion’, ‘authorCountry’], axis=1, inplace=True)

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

Стандартизировать управление моделями может быть сложно, но есть решение. Узнайте больше об управлении экспериментами от Николаса Ласкариса из Comet.

Мы добавим столбец в наш фрейм данных, назовем его «Добавление». По сути, это объединение всех полей функций, но на данный момент в него будут включены данные из столбца "Текст".

def create_addition(x):
    Addition = ' '.join(x['text'])
    return Addition
article_data['Addition'] = article_data.apply(create_addition, axis=1)

Двигаясь дальше, мы будем использовать векторы Term Frequency-Inverse Document Frequency (TF-IDF), чтобы создать векторизованную версию значений в столбце 'Text'. во фрейме данных. TF-IDF – это числовая метрика, которая измеряет, насколько важно слово для текстового документа в коллекции. TF-IDF рассчитывается путем деления частоты появления термина в статье на количество документов, в которых он встречается.

В результате, если термин появляется чаще в одной статье, но реже в заказах, определенно оценка TF-IDF будет высокой. К счастью для нас, библиотека scikit-learn a python имеет встроенный TfIdfVectorizer, который генерирует матрицу TF-IDF.

# Lets define a TF-IDF Vectorizer Object, we shoudl also remove all english stop words such as 'am', 'the', 'a', 'as' 
tfidf = TfidfVectorizer(stop_words='english')
# Build the required TF-IDF matrix by fitting and transforming the data
tfidf_matrix = tfidf.fit_transform(article_data['text'])

Давайте посмотрим на матрицу, хорошо?

# Output the shape of tfidf_matrix
print(tfidf_matrix.shape)
# print(tfidf.get_stop_words().pop())
# Array mapping from feature integer indices to feature name.
print(tfidf.get_feature_names()[5000:5011])

Согласно приведенному выше выводу, в 3047 статьях разбросано 72 312 слов. При этом можно сделать вывод, что вектор готов и можно обнаружить попарные общие черты между словами статьи. Есть много других способов найти сходство, но Косинус Сходство подходит лучше всего. Если два слова нанесены на многомерный график, он ищет сходства в углах между ними, а не просто в географическом расстоянии.

Косинусное сходство
Это статистика для измерения сходства двух числовых последовательностей. Как указывалось ранее, подобие косинусов не зависит от величины и просто вычисляется. Будет использоваться метод cosine_similarity() библиотеки scikit-learn python.

cos_sim = cosine_similarity(tfidf_matrix, tfidf_matrix, True)
display(cos_sim.shape)
display(cos_sim)

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

Теперь вектор подобия завершен. Мы создадим обратную карту индексов, используя индексы поля «название». Если есть дубликаты заголовков, я их тоже удалю.

# let's reset the index of main DataFrame and construct reverse mapping as before
md = article_data.reset_index()
idn = pd.Series(md.index, index=md['title']).drop_duplicates()
display(idn[:5])

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

# The function that takes in article title as input and gives an output of most similar articles
def recommend_articles(title, indices, cosine_sim, data):
    # Get the index of the article that matches the title
    idx = indices[title]
# Get the pairwsie similarity scores of all articles with that article
    sim_scores = list(enumerate(cosine_sim[idx]))
# Sort the articles based on the similarity scores
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
# Get the scores of the 10 most similar movies
    sim_scores = sim_scores[1:11]
# Get the article indices
    movie_indices = [i[0] for i in sim_scores]
# Return the top 10 most similar articles
    return data['title'].iloc[movie_indices]
print(recommend_articles('Google Data Center 360° Tour', idn, cosine_sim, md))

Вы увидите, что он обнаружил элементы, связанные с Google и I/O. Он также обнаружил элемент, который подключен к YouTube, но не содержит слова «Google». В результате становится ясно, что наша рекомендательная система может распознавать варианты продукта.

Давайте попробуем другой ввод, чтобы подтвердить тест.

Заключение

По сути, система рекомендаций статей принимает статью в качестве входных данных и выводит список наиболее сопоставимых статей, предлагая/рекомендуя пользователю до десяти статей. Чтобы продолжать тренировать и улучшать модель, вам следует попробовать собрать набор данных, который не принадлежит мне, а затем запустить на нем модель. Вы должны иметь возможность вводить данные и получать рекомендуемые статьи, используя рекомендательную систему на основе контента.

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

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

Независимая от редакции, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и командам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим нашим авторам и не продаем рекламу.

Если вы хотите внести свой вклад, перейдите к нашему призыву к участию. Вы также можете подписаться на получение наших еженедельных информационных бюллетеней (Еженедельник глубокого обучения и Информационный бюллетень Comet), присоединиться к нам в Slack и следить за Comet в Twitter и LinkedIn, чтобы получать ресурсы, события и многое другое, что поможет вам быстрее создавать лучшие модели машинного обучения.