Введение
Модель рекомендаций, которая рекомендует на основе контента или описания, известна как система рекомендаций на основе контента. В этой статье мы узнаем, как с нуля создать модель рекомендаций по парфюмерии с использованием обработки естественного языка.
Постановка задачи
Наш проект основан на рекомендации парфюмерии, основанной на содержании, т.е. рекомендации, основанные на содержании парфюма. Факторами, отличающими духи, являются их ноты и аккорды. Ноты состоят из верхних, средних и базовых нот. Ноты — это, по сути, различные ароматические слои, из которых состоит окончательный аромат. Аккорды – это сочетание ингредиентов, создающих желаемый запах.
Чтобы порекомендовать духи, требуется их описание, поэтому мы возьмем описания духов из 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]