Recomendações do Microsoft Notícias

O MIND (Conjunto de dados do Microsoft Notícias) é um conjunto de dados de grande escala para a pesquisa de notícias de recomendação. Ele foi coletado de logs de comportamento anônimos do site de Microsoft Notícias. A missão do MIND é servir como um conjunto de dados de parâmetro de comparação para a recomendação de notícias e facilitar a pesquisa nessa área e nos sistemas de recomendação.

O MIND contém cerca de 160 mil artigos de notícias em inglês e mais de 15 milhões de logs de impressão gerados por 1 milhão de usuários. Cada artigo de notícias tem conteúdo textual rico, incluindo título, resumo, corpo, categoria e entidades. Cada log de impressão contém os eventos com cliques, eventos sem cliques e comportamentos históricos de cliques em notícias deste usuário antes da impressão em questão. Para proteger a privacidade do usuário, cada usuário foi dissociado do sistema de produção ao ser codificado com segurança em uma ID anônima. Para obter informações mais detalhadas sobre o conjunto de dados MIND, confira o artigo MIND: A Large-scale Dataset for News Recommendation (MIND: Um conjunto de dados de grande escala para recomendação de notícias).

Volume

Os dados de treinamento e de validação estão em uma pasta compactada em zip, que contém quatro arquivos diferentes:

NOME DO ARQUIVO DESCRIPTION
behaviors.tsv Os históricos de cliques e logs de impressão dos usuários
news.tsv As informações dos artigos de notícias
entity_embedding.vec As incorporações das entidades nas notícias extraídas do grafo de conhecimento
relation_embedding.vec As incorporações das relações entre entidades extraídas do grafo de conhecimento

behaviors.tsv

O arquivo behaviors.tsv contém os logs de impressão e os históricos de cliques de notícias dos usuários. Ele tem cinco colunas divididas pelo símbolo de tabulação:

  • ID da impressão. A ID de uma impressão.
  • ID de usuário. A ID anônima de um usuário.
  • Tempo. A hora da impressão no formato “MM/DD/YYYY HH:MM:SS AM/PM”.
  • Histórico. O histórico de clique em notícias (lista de IDs de notícias clicadas) deste usuário antes desta impressão.
  • Impressões. Lista de notícias exibidas nesta impressão e de comportamentos de cliques do usuário (1 para clique e 0 para sem clique).

Veja um exemplo na tabela abaixo:

COLUMN CONTENT
ID da impressão 123
Id de Usuário U131
Hora 13/11/2019 8:36:57
Histórico N11 N21 N103
Impressões N4-1 N34-1 N156-0 N207-0 N198-0

news.tsv

O arquivo news.tsv contém as informações detalhadas de artigos de notícias envolvidos no arquivo behaviors.tsv file. Ele tem sete colunas divididas pelo símbolo de tabulação:

  • ID de notícias
  • Categoria
  • Subcategoria
  • Título
  • Resumo
  • URL
  • Entidades de título (contidas no título dessa notícia)
  • Entidades de resumo (contidas no resumo dessa notícia)

A íntegra do conteúdo das notícias do MSN não é disponibilizada para download, devido à estrutura de licenciamento. No entanto, para sua conveniência, fornecemos um script de utilitário para ajudar a analisar a página da Web de notícias das URLs do MSN no conjunto de dados. Devido à limitação de tempo, algumas URLs expiraram e não podem ser acessadas com êxito. No momento, estamos tentando resolver esse problema.

Um exemplo é mostrado na seguinte tabela:

COLUMN CONTENT
ID de notícias N37378
Categoria esportes
SubCategory golfe
Título Vencedores do PGA Tour
Resumo Uma galeria dos vencedores recentes no PGA Tour.
URL https://www.msn.com/en-us/sports/golf/pga-tour-winners/ss-AAjnQjj?ocid=chopendata
Entidades de título [{"Rótulo": "PGA Tour", "Tipo": "O", "WikidataId": "Q910409", "Confiança": 1.0, "OccurrenceOffsets": [0], "SurfaceForms": ["PGA Tour"]}]
Entidades de resumo [{"Rótulo": "PGA Tour", "Tipo": "O", "WikidataId": "Q910409", "Confiança": 1.0, "OccurrenceOffsets": [35], "SurfaceForms": ["PGA Tour"]}]

As descrições das chaves de dicionário na coluna "Entidades" estão listadas a seguir:

CHAVES DESCRIPTION
Rótulo O nome da entidade no grafo de conhecimento do Wikidata
Digite O tipo dessa entidade no Wikidata
WikidataId A ID da entidade no Wikidata
Confiança A confiança da vinculação de entidade
OccurrenceOffsets O deslocamento da entidade no nível do caractere no texto do título ou do resumo
SurfaceForms Os nomes da entidade bruta no texto original

entity_embedding.vec e relation_embedding.vec

Os arquivos entity_embedding.vec e relation_embedding.vec contêm as incorporações de 100 dimensões das entidades e relações aprendidas do subgrafo (do grafo de conhecimento do WikiData) pelo método TransE. Nos dois arquivos, a primeira coluna é a ID da entidade/relação, e as outras colunas são os valores de vetor da incorporação. Esperamos que esses dados possam facilitar a pesquisa de recomendação de notícias ciente de conhecimento. Um exemplo é mostrado a seguir.

ID VALORES DE INCORPORAÇÃO
Q42306013 0.014516 -0.106958 0.024590 … -0.080382

Devido a alguns motivos no aprendizado da incorporação do subgrafo, algumas entidades podem não ter incorporações no arquivo entity_embedding.vec.

Local de armazenamento

Os dados são armazenados em blobs no data center da região Oeste/Leste dos EUA, no seguinte contêiner de blob: 'https://mind201910small.blob.core.windows.net/release/ '.

No contêiner, os conjuntos de treinamento e validação estão compactados em MINDlarge_train.zip e MINDlarge_dev.zip, respectivamente.

Informações adicionais

O conjunto de dados MIND pode ser baixado gratuitamente para fins de pesquisa sob os Termos de Licença de Pesquisa da Microsoft. Entre em contato com mind@microsoft.com caso tenha dúvidas sobre o conjunto de dados.

Acesso de dados

Azure Notebooks

Notebook de demonstração para acessar dados MIND no Azure

Este notebook fornece um exemplo de acesso a dados MIND do armazenamento de blob no Azure.

Os dados MIND são armazenados nos data centers do Oeste/Leste dos EUA, portanto, esse notebook será executado com mais eficiência na computação do Azure localizada no Oeste/Leste dos EUA.

Importações e ambiente

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'

Funções

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

Baixar e extrair os arquivos

# 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)

Ler os arquivos com o 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

Limpar os arquivos temporários

shutil.rmtree(temp_dir)

Exemplos

Consulte os exemplos a seguir de como usar o Conjunto de dados de recomendadores do Microsoft Notícias:

Próximas etapas

Confira os vários modelos de recomendação de notícias de linha de base desenvolvidos no MIND do Repositório de Recomendadores da Microsoft

Visualize o restante dos conjuntos de dados no Catálogo do Conjunto de Dados em Aberto no Azure.