Microsoft News rekommendation

Misoft N ews D ataset (MIND) är en storskalig datamängd för nyhetsrekommendation. Den har samlats in från anonyma beteendeloggar på webbplatsen för Microsoft News. Syftet med MIND är att fungera som en benchmark-datamängd för nyhetsrekommendationer och underlätta sökning i nyhetsrekommendationer och rekommendationssystem.

MIND innehåller cirka 160  000 engelska nyhetsartiklar och drygt 15 miljoner loggar som genererats av 1 miljon användare. Varje nyhetsartikel innehåller textinnehåll som rubrik, abstrakt, brödtext, kategori och entiteter. Varje visningslogg innehåller klickhändelser, icke-klickade händelser och historiska nyhetsklicksbeteenden för den här användaren före denna visning. För att skydda användarsekretessen har varje användarlänk tagits bort från produktionssystemet och skyddats med en hashkodning i ett anonymt ID. Mer detaljerad information om MIND-datamängden finns i dokumentet MIND: En datamängd i stor skala för nyhetsrekommendationer.

Volym

Både tränings- och valideringsdata finns i en komprimerad mapp som innehåller fyra olika filer:

FILNAMN BESKRIVNING
behaviors.tsv Klickhistorik och visningsloggar för användare
news.tsv Information om nyhetsartiklar
entity_embedding.vec Inbäddade entiteter i nyheter som extraherats från en kunskapsgraf
relation_embedding.vec Inbäddade relationer mellan entiteter som extraherats från en kunskapsgraf

behaviors.tsv

Filen behaviors.tsv innehåller visningsloggarna och användarnas klickhistorik för nyheter. Den har fem kolumner dividerat med tabbsymbolen:

  • Visnings-ID. ID för en visning.
  • Användar-ID. Anonymt ID för användaren.
  • Tid. Visningstiden med formatet "MM/DD/YYYY HH:MM:SS AM/PM".
  • Historik. Klickhistorik för nyheterna (ID-lista med klickade nyheter) från aktuell användare före denna visning.
  • Visningar. Lista över nyheter som visas i denna visning och användarens klickbeteenden på dem (1 för klickning och 0 för icke-klick).

Ett exempel visas i tabellen nedan:

Kolumn Innehåll
Visnings-ID 123
Användar-ID U131
Tid 11/13/2019 8:36:57 AM
Historik N11 N21 N103
Visningar N4-1 N34-1 N156-0 N207-0 N198-0

news.tsv

Filen news.tsv innehåller detaljerad information om nyhetsartiklar som ingår i filen behaviors.tsv. Den har sju kolumner, som divideras med tabbsymbolen:

  • Nyhets-ID
  • Kategori
  • Underkategori
  • Rubrik
  • Sammanfattning
  • URL
  • Rubrikentiteter (entiteter i nyheternas rubrik)
  • Sammanfattningsentiteter (entiteter i nyheternas sammanfattning)

Hela innehållsinnehållet i MSN-nyhetsartiklar görs inte tillgängliga för nedladdning på grund av licensstrukturen. Men vi har ett verktygsskript som kan hjälpa dig att parsa nyhetswebbsidan från MSN:s webbadresser i datamängden. På grund av tidsbegränsningar har vissa webbadresser upphört att gälla och går inte att öppna. Vi försöker för närvarande att lösa det här problemet.

Ett exempel visas i följande tabell:

Kolumn Innehåll
Nyhets-ID N37378
Kategori sport
SubCategory golf
Rubrik Vinnare på PGA-touren
Sammanfattning Ett galleri med de senaste vinnarna på PGA-touren.
URL https://www.msn.com/en-us/sports/golf/pga-tour-winners/ss-AAjnQjj?ocid=chopendata
Rubrikentiteter [{"Label": "PGA Tour", "Type": "O", "WikidataId": "Q910409", "Confidence": 1.0, "OccurrenceOffsets": [0], "SurfaceForms": ["PGA Tour"]}]
Sammanfattningsentiteter [{"Label": "PGA Tour", "Type": "O", "WikidataId": "Q910409", "Confidence": 1.0, "OccurrenceOffsets": [35], "SurfaceForms": ["PGA Tour"]}]

Beskrivningarna av ordlistenycklarna i kolumnen "Entiteter" visas på följande sätt:

Nycklar BESKRIVNING
Etikett Entitetsnamnet i Wikidata-kunskapsdiagrammet
Typ Typ av entitet i Wikidata
WikidataId Entitets-ID i Wikidata
Konfidensbedömning Konfidens för entitetslänkningen
OccurrenceOffsets Entitetsförskjutning på teckennivå för text i rubrik eller sammanfattning
SurfaceForms Rådatans entitetsnamn i originaltexten

entity_embedding.vec & relation_embedding.vec

Filerna entity_embedding.vec och relation_embedding.vec innehåller de 100-dimensionella inbäddningar av entiteter och relationer som lärts in från subgrafen (från WikiData-kunskapsdiagram) av TransE-metoden. I båda filerna är den första kolumnen ID:t för entiteten/relationen och de andra kolumnerna är inbäddade vektorvärden. Vi hoppas att dessa data kan underlätta sökningen i nyhetsrekommendationer. Ett exempel visas nedan:

ID INBÄDDNINGSVÄRDEN
Q42306013 0.014516 -0.106958 0.024590 ... -0.080382

På grund av vissa orsaker till inbäddning från subgrafen kanske några entiteter inte har inbäddningar i entity_embedding.vec-filen.

Lagringsplats

Data lagras i blobar i datacentret för USA, västra/östra i följande blobcontainer: https://mind201910small.blob.core.windows.net/release/ ' '.

I containern komprimeras tränings- och valideringsuppsättningen till MINDlarge_train.zip respektive MINDlarge_dev.zip.

Ytterligare information

MIND-datamängden är kostnadsfri att ladda ner för forskningssyften enligt licensvillkoren för Microsoft Research. Kontakta mind@microsoft.com om du har frågor om datauppsättningen.

Dataåtkomst

Azure Notebooks

Demo-notebook-fil för åtkomst till MIND-data i Azure

Den här notebook-datorn innehåller ett exempel på åtkomst till MIND-data från bloblagring i Azure.

MIND-data lagras i datacentret för USA, västra/östra, så den här notebook-datorn körs effektivare på Azure-beräkningen i USA, västra/östra.

Importer och miljö

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'

Functions

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

Ladda ned och extrahera filerna

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

Läsa filerna med 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

Rensa tillfälliga filer

shutil.rmtree(temp_dir)

Exempel

Se följande exempel på hur du använder datauppsättningen Microsoft News Recommender:

Nästa steg

Kolla in flera baslinjemodeller för nyhetsrekommendation som utvecklats på MIND från Microsoft Recommenders Repository

Visa resten av datauppsättningarna i Open Datasets katalogen.