Как разработать рекомендательную систему на основе контента для The New York Times

искусственный интеллект NLP база данных

Мы помогаем The New York Times (NYT) разработать рекомендательную систему на основе контента.Вы можете рассматривать эту систему как очень простой пример разработки рекомендательной системы. Опираясь на данные о недавнем просмотре статей пользователем, мы будем рекомендовать новые статьи, подходящие для чтения, для этого нам нужно только рекомендовать аналогичный контент пользователям на основе текстовых данных этой статьи.

Проверка данныхНиже приведен отрывок из первой статьи NYT в наборе данных, для которой мы выполнили обработку текста.

ТОКИО — Государственный Японский банк международного сотрудничества [JBIC.UL] предоставит около 4 миллиардов иен (39 миллионов долларов) российскому Сбербанку, который подчиняется западным санкции, в надежде на продвижение переговоров по территориальному спору, Nikkei деловая газета сообщила в субботу [...]»

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

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

В этой статье мы начинаем реализовывать это простое и выполнимое решение.

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

# move articles to an array
articles = df.body.values

# move article section names to an array
sections = df.section_name.values

# move article web_urls to an array
web_url = df.web_url.values

# shuffle these three arrays 
articles, sections, web_ur = shuffle(articles, sections, web_url, random_state=4)

# split the shuffled articles into two arrays
n = 10

# one will have all but the last 10 articles -- think of this as your training set/corpus 
X_train = articles[:-n]
X_train_urls = web_url[:-n]
X_train_sections = sections[:-n]

# the other will have those last 10 articles -- think of this as your test set/corpus 
X_test = articles[-n:]
X_test_urls = web_url[-n:]
X_test_sections = sections[-n:]

Система векторизации текстаВыберите одну из нескольких различных систем векторизации текста, таких как Bag-of-Words (BoW), Tf-Idf, Word2Vec и т. д.

Одна из причин, по которой мы выбираем Tf-Idf, заключается в том, что, в отличие от BoW, способ, которым Tf-Idf определяет лексическую важность, включает в себя обратную частоту документа в дополнение к частоте текста.

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

Потому что «Обама» не является ни стоп-словом, ни общеупотребительным языком (т. е. означает, что это слово имеет большое отношение к теме статьи).

Критерий подобияСуществует несколько вариантов определения критериев сходства, например, сравнение Жакарда с косинусом.

Реализация Джакара основана на сравнении двух эпизодов и выборе перекрывающихся элементов. Учитывая, что в качестве системы векторизации текста был выбран Tf-Idf, как вариант, подобие Жакара не имеет смысла. Если будет выбрана векторизация BoW, возможно, Jacard сможет сыграть свою роль.

Поэтому мы пытаемся использовать косинус в качестве критерия подобия.

Поскольку Tf-Idf присваивает вес каждому токену в каждой статье, можно получить скалярное произведение между весами токенов разных статей.

Если такие теги, как «Обама» или «Белый дом» в статье А имеют большой вес, и то же самое верно и в статье Б, то произведение сходства этих двух будет иметь большее значение.

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

def get_top_n_rec_articles(X_train_tfidf, X_train, test_article, X_train_sections, X_train_urls, n = 5):
    '''This function calculates similarity scores between a document and a corpus
    
       INPUT: vectorized document corpus, 2D array
              text document corpus, 1D array
              user article, 1D array
              article section names, 1D array
              article URLs, 1D array
              number of articles to recommend, int
              
       OUTPUT: top n recommendations, 1D array
               top n corresponding section names, 1D array
               top n corresponding URLs, 1D array
               similarity scores bewteen user article and entire corpus, 1D array
              '''
    # calculate similarity between the corpus (i.e. the "test" data) and the user's article
    similarity_scores = X_train_tfidf.dot(test_article.toarray().T)
    # get sorted similarity score indices  
    sorted_indicies = np.argsort(similarity_scores, axis = 0)[::-1]
    # get sorted similarity scores
    sorted_sim_scores = similarity_scores[sorted_indicies]
    # get top n most similar documents
    top_n_recs = X_train[sorted_indicies[:n]]
    # get top n corresponding document section names
    rec_sections = X_train_sections[sorted_indicies[:n]]
    # get top n corresponding urls
    rec_urls = X_train_urls[sorted_indicies[:n]]
    
    # return recommendations and corresponding article meta-data
    return top_n_recs, rec_sections, rec_urls, sorted_sim_scores

Ниже приведены этапы выполнения функции:

1. Рассчитать сходство между пользовательскими статьями и корпусами;

2. Отсортируйте оценки сходства от большего к меньшему;

3. Получить топ N наиболее похожих статей;

4. Получить субтитры и URL-адреса, соответствующие предыдущим N статьям;

5. Верните N лучших статей, субтитров, URL-адресов и баллов.

Проверка результатаТеперь мы можем проверить, достижимы ли результаты, рекомендуя пользователям статьи для чтения в зависимости от того, что они читают.

Далее давайте сравним пользовательские статьи и соответствующие им субтитры с рекомендуемыми статьями и соответствующими субтитрами.

Сначала посмотрите на показатель сходства.

# similarity scores
sorted_sim_scores[:5]
# OUTPUT:
# 0.566
# 0.498
# 0.479
# .
# .

Диапазон значений сходства косинуса составляет 0-1, что показывает, что его оценка невысока. Как улучшить оценку? Вы можете выбрать другую систему векторизации, например Doc2Vec, или переключиться на критерий подобия. Тем не менее, давайте посмотрим на результаты.

# user's article's section name
X_test_sections[k]
# OUTPUT:
'U.S'

# corresponding section names for top n recs 
rec_sections
# OUTPUT:
'World'
'U.S'
'World'
'World'
'U.S.'

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

#статья пользователя X_тест[к] ЛОС-АНДЖЕЛЕС — Белый дом заявил, что президент Барак Обама сообщил Министерству обороны Департамент, что он должен гарантировать, что военнослужащие проинструктированы погасить зачисление бонусы рассматриваются справедливо и оперативно.\nОфициальный представитель Белого дома Джош Эрнест говорит, что президент только недавно узнал о требованиях Пентагона, чтобы некоторые солдаты возвращают свои призывные премии после того, как проверки выявили переплаты со стороны Калифорнийская национальная гвардия. Если солдаты откажутся, им могут быть начислены проценты, наложение ареста на заработную плату и налоговые удержания.\nЭрнест говорит, что не верил, что президент готов поддержать полный отказ от этих выплат, но он сказал, что «мы не ходят на никель и десять центов" военнослужащие, когда они возвращаются с службы страны. Он говорит, что они не должны нести ответственность за мошенничество, совершенное другими.'

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

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

Проверка человеком работает нормально, но в конечном итоге нам нужна полностью автоматизированная система, которую легко встроить в модель и проверить себя.

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

Первоначальный автор — специалист по данным.Alexander Barriga, отечественной интеллектуальной рекомендательной платформойПервая рекомендация_Эксперт по персональным рекомендациямСоставлено, некоторые удалены и изменены, просьба указывать источник при перепечатке.