Введение

Модель рекомендаций, которая рекомендует на основе контента или описания, известна как система рекомендаций на основе контента. В этой статье мы узнаем, как с нуля создать модель рекомендаций по парфюмерии с использованием обработки естественного языка.

Постановка задачи

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

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

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

1. Набор данных и функции

2. Обучение модели

Мы используем векторизатор TF IDF для изучения словарного запаса и преобразования нашего целевого столбца в векторы. Это включает в себя следующие шаги.

Токенизация, т. е. разрезание входных данных на значимые части, которые можно встроить в векторное пространство.

Stemming — это метод, используемый для извлечения базовой формы слов путем удаления из них аффиксов.

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

Получение векторизатора и установка его на целевой столбец для изучения словарного запаса. Наконец, используя словарь для векторизации столбца описания.

import nltk
from nltk.tokenize import word_tokenize
from nltk.stem.snowball import SnowballStemmer
nltk.download('punkt')
stemmer = SnowballStemmer(language = "english")
from nltk.corpus import stopwords
nltk.download('stopwords')

def tokenize(text):
  return[stemmer.stem(token) for token in word_tokenize(text) if token.isalpha()]
english_stopwords = stopwords.words('english')

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

from sklearn.feature_extraction.text import TfidfVectorizer

tfv = TfidfVectorizer(tokenizer=tokenize,
                      stop_words=english_stopwords,
                      ngram_range=(1,5), max_features = 2400)

tfv_matrix = tfv.fit_transform(perfumes_df.New_Description)

from sklearn.metrics.pairwise import sigmoid_kernel

sig = sigmoid_kernel(tfv_matrix, tfv_matrix)


sig = sigmoid_kernel(tfv_matrix, tfv_matrix)




indices = pd.Series(perfumes_df.index, index = perfumes_df["Perfume_Name"]).drop_duplicates()
def give_rec(title,sig=sig):
    try:
        # Get the index correspondind to perfume name
        idx = indices[title]

        # Get the pairwise similatity scores.
        sig_scores = list(enumerate(sig[idx]))

        # sort the perfumes
        sig_scores = sorted(sig_scores,key = lambda x:x[1],reverse = True)

        # scores of the ten similar persumes
        sig_scores = sig_scores[1:51]
        #perfume indices
        Perfume_indices = [i[0] for i in sig_scores]
    except:
        # Get the index correspondind to perfume name
        idx = indices[title][0]
        # Get the pairwise similatity scores.
        sig_scores = list(enumerate(sig[idx]))

        # sort the perfumes
        sig_scores = sorted(sig_scores,key = lambda x:x[1],reverse = True)

        # scores of the ten similar persumes
        sig_scores = sig_scores[1:51]
        #perfume indices
        Perfume_indices = [i[0] for i in sig_scores]
    
    
    
    #top 10 most similar perfumes
    return perfumes_df["Perfume_Name"].iloc[Perfume_indices]

3. Прогнозы