Microsoft News Recommendation

MIcrosoft News Dataset (MIND) — это крупномасштабный набор данных для исследования рекомендаций новостей. Данные для него собраны из анонимизированных журналов поведения пользователей веб-сайта Microsoft News. Задача MIND — служить эталонным набором данных для рекомендаций по новостям и содействовать исследованиям в области рекомендаций новостей и систем рекомендаций.

MIND содержит около 160 тыс. новостных статей на английском языке и более 15 млн журналов просмотров от 1 млн пользователей. Каждая новостная статья содержит расширенное текстовое содержимое, включая заголовок, аннотацию, текст, категорию и сущности. В каждом журнале просмотров содержатся события щелчка мышью, события без щелчка и исторические данные о поведении этого пользователя, касающиеся щелчков новостей, до этого просмотра. Для защиты конфиденциальности пользователей была удалена связь каждого пользователя с рабочей системой, а его данные надежно хэшированы в анонимный идентификатор. Дополнительные сведения о наборе данных MIND см. в документе MIND: масштабируемый набор данных для рекомендаций новостей.

Громкость

Данные для обучения и проверки содержатся в сжатой папке формата ZIP, состоящей из четырех разных файлов:

ИМЯ ФАЙЛА ОПИСАНИЕ
behaviors.tsv Журналы щелчков и просмотров пользователей
news.tsv Сведения из новостных статей
entity_embedding.vec Внедрение сущностей в новостях, извлеченных из графа знаний
relation_embedding.vec Внедрение отношений между сущностями, извлеченными из графа знаний

behaviors.tsv

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

  • Impression ID. Идентификатор просмотра.
  • ИД пользователя Анонимный идентификатор пользователя.
  • Время. Время просмотра в формате ММ/ДД/ГГГГ ЧЧ:ММ:СС (до полудня/после полудня).
  • Исторические данные. Журнал щелчков по новостям (список идентификаторов новостей, по которым был осуществлен щелчок) этого пользователя до этого просмотра.
  • Impressions. Список новостей, отображенных при этом просмотре, и поведение пользователя, касающееся щелчков по этим новостям (1 — щелчок, 0 — отсутствие щелчка).

Пример показан в таблице ниже.

СТОЛБЕЦ CONTENT
Impression ID 123
Идентификатор пользователя U131
Время 11/13/2019 8:36:57 AM
Журнал N11 N21 N103
Impressions N4-1 N34-1 N156-0 N207-0 N198-0

news.tsv

Файл news.tsv содержит подробную информацию о новостных статьях из файла behaviors.tsv. В нем есть семь столбцов, разделенных символами табуляции.

  • News ID
  • Категория
  • Подкатегории
  • Заголовок
  • Краткие сведения
  • URL
  • Title Entities (Сущности из заголовка) — сущности, указанные в заголовке новости;
  • Abstract Entities (Сущности из аннотации) — сущности, указанные в аннотации к новости.

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

Пример приведен в следующей таблице.

СТОЛБЕЦ CONTENT
News ID N37378
Категория sports (спорт)
SubCategory golf
Заголовок PGA Tour winners (Победители PGA Tour)
Краткие сведения A gallery of recent winners on the PGA Tour (Галерея победителей последнего соревнования PGA Tour).
URL https://www.msn.com/en-us/sports/golf/pga-tour-winners/ss-AAjnQjj?ocid=chopendata
Title Entities [{"Label": "PGA Tour", "Type": "O", "WikidataId": "Q910409", "Confidence": 1.0, "OccurrenceOffsets": [0], "SurfaceForms": ["PGA Tour"]}]
Abstract Entites [{"Label": "PGA Tour", "Type": "O", "WikidataId": "Q910409", "Confidence": 1.0, "OccurrenceOffsets": [35], "SurfaceForms": ["PGA Tour"]}]

Описания ключей словаря в столбце Entities приведены в следующем виде.

KEYS ОПИСАНИЕ
Подпись Название сущности в графе знаний Викиданных
Тип Тип этой сущности в Викиданных
WikidataId Идентификатор сущности в Викиданных
Достоверность Достоверность связывания сущностей
OccurrenceOffsets Смещение сущности на уровне символов в тексте заголовка или аннотации
SurfaceForms Необработанные имена сущностей в исходном тексте

entity_embedding.vec & relation_embedding.vec

Файлы entity_embedding.vec и relation_embedding.vec содержат 100-мерные внедрения сущностей и отношений, полученные из подграфа (из графа знаний Викиданных) методом TransE. В обоих файлах в первом столбце указывается идентификатор сущности или отношения, а в остальных столбцах — векторные значения внедрения. Мы надеемся, что эти данные помогут в исследовании рекомендаций по новостям, основанных на знаниях. Пример приведен ниже:

Идентификатор Значения внедрения
Q42306013 0,014516 –0,106958 0,024590… –0,080382

По некоторым причинам, связанным с обучением внедрению из подграфа, некоторые сущности могут не иметь внедрений в файле entity_embedding.vec.

Место хранения

Данные хранятся в виде больших двоичных объектов в центре обработки данных региона "Западная часть США" или "Восточная часть США". Адрес контейнера: "https://mind201910small.blob.core.windows.net/release/".

В этом контейнере наборы данных для обучения и проверки содержатся в сжатом виде в файлах MINDlarge_train.zip и MINDlarge_dev.zip соответственно.

Дополнительная информация:

Набор данных MIND можно скачать бесплатно для исследовательских целей согласно условиями лицензии Майкрософт для исследований. Если у вас возникли вопросы о наборе данных, напишите по адресу mind@microsoft.com.

Доступ к данным

Записные книжки Azure

Демонстрационная записная книжка для доступа к данным MIND в Azure

В этой записной книжке представлен пример доступа к данным MIND из хранилища BLOB-объектов в Azure.

Данные MIND хранятся в центре обработки данных в западной или восточной части США, поэтому эта записная книжка будет работать эффективнее на основе вычислительных ресурсов Azure, расположенных в регионе "Западная часть США" или "Восточная часть США".

Импортируемые файлы и среда

import os
import tempfile
import shutil
import urllib
import zipfile
import pandas as pd

# Temporary folder for data we need during execution of this notebook (we'll clean up
# at the end, we promise)
temp_dir = os.path.join(tempfile.gettempdir(), 'mind')
os.makedirs(temp_dir, exist_ok=True)

# The dataset is split into training and validation set, each with a large and small version.
# The format of the four files are the same.
# For demonstration purpose, we will use small version validation set only.
base_url = 'https://mind201910small.blob.core.windows.net/release'
training_small_url = f'{base_url}/MINDsmall_train.zip'
validation_small_url = f'{base_url}/MINDsmall_dev.zip'
training_large_url = f'{base_url}/MINDlarge_train.zip'
validation_large_url = f'{base_url}/MINDlarge_dev.zip'

Функции

def download_url(url,
                 destination_filename=None,
                 progress_updater=None,
                 force_download=False,
                 verbose=True):
    """
    Download a URL to a temporary file
    """
    if not verbose:
        progress_updater = None
    # This is not intended to guarantee uniqueness, we just know it happens to guarantee
    # uniqueness for this application.
    if destination_filename is None:
        url_as_filename = url.replace('://', '_').replace('/', '_')
        destination_filename = \
            os.path.join(temp_dir,url_as_filename)
    if (not force_download) and (os.path.isfile(destination_filename)):
        if verbose:
            print('Bypassing download of already-downloaded file {}'.format(
                os.path.basename(url)))
        return destination_filename
    if verbose:
        print('Downloading file {} to {}'.format(os.path.basename(url),
                                                 destination_filename),
              end='')
    urllib.request.urlretrieve(url, destination_filename, progress_updater)
    assert (os.path.isfile(destination_filename))
    nBytes = os.path.getsize(destination_filename)
    if verbose:
        print('...done, {} bytes.'.format(nBytes))
    return destination_filename

Скачивание файлов и извлечение их содержимого

# For demonstration purpose, we will use small version validation set only.
# This file is about 30MB.
zip_path = download_url(validation_small_url, verbose=True)
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
    zip_ref.extractall(temp_dir)

os.listdir(temp_dir)

Чтение файлов с помощью Pandas

# The behaviors.tsv file contains the impression logs and users' news click histories. 
# It has 5 columns divided by the tab symbol:
# - Impression ID. The ID of an impression.
# - User ID. The anonymous ID of a user.
# - Time. The impression time with format "MM/DD/YYYY HH:MM:SS AM/PM".
# - History. The news click history (ID list of clicked news) of this user before this impression.
# - Impressions. List of news displayed in this impression and user's click behaviors on them (1 for click and 0 for non-click).
behaviors_path = os.path.join(temp_dir, 'behaviors.tsv')
pd.read_table(
    behaviors_path,
    header=None,
    names=['impression_id', 'user_id', 'time', 'history', 'impressions'])
# The news.tsv file contains the detailed information of news articles involved in the behaviors.tsv file.
# It has 7 columns, which are divided by the tab symbol:
# - News ID
# - Category
# - Subcategory
# - Title
# - Abstract
# - URL
# - Title Entities (entities contained in the title of this news)
# - Abstract Entities (entities contained in the abstract of this news)
news_path = os.path.join(temp_dir, 'news.tsv')
pd.read_table(news_path,
              header=None,
              names=[
                  'id', 'category', 'subcategory', 'title', 'abstract', 'url',
                  'title_entities', 'abstract_entities'
              ])
# The entity_embedding.vec file contains the 100-dimensional embeddings
# of the entities learned from the subgraph by TransE method.
# The first column is the ID of entity, and the other columns are the embedding vector values.
entity_embedding_path = os.path.join(temp_dir, 'entity_embedding.vec')
entity_embedding = pd.read_table(entity_embedding_path, header=None)
entity_embedding['vector'] = entity_embedding.iloc[:, 1:101].values.tolist()
entity_embedding = entity_embedding[[0,
                                     'vector']].rename(columns={0: "entity"})
entity_embedding
# The relation_embedding.vec file contains the 100-dimensional embeddings
# of the relations learned from the subgraph by TransE method.
# The first column is the ID of relation, and the other columns are the embedding vector values.
relation_embedding_path = os.path.join(temp_dir, 'relation_embedding.vec')
relation_embedding = pd.read_table(relation_embedding_path, header=None)
relation_embedding['vector'] = relation_embedding.iloc[:,
                                                       1:101].values.tolist()
relation_embedding = relation_embedding[[0, 'vector'
                                         ]].rename(columns={0: "relation"})
relation_embedding

Очистка временных файлов

shutil.rmtree(temp_dir)

Примеры

См. следующие примеры использования набора данных Microsoft News Recommender:

Следующие шаги

Ознакомьтесь с несколькими базовыми моделями рекомендаций в отношении новостей, разработанными в MIND, в репозитории Microsoft Recommenders.

Ознакомьтесь с другими наборами в каталоге Открытых наборов данных.