Rekommendation för Microsoft News

Microsoft News Dataset (MIND) är en storskalig datamängd för nyhetsrekommendationsforskning. 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 RTF-innehåll, inklusive 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 det här intrycket. 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 artikeln MIND: A Large-scale Dataset for News Recommendation (Mind: A Large-scale Dataset for News Recommendation).

Volume

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 nyhetsklickshistorik. Den har fem kolumner dividerade med fliksymbolen:

  • Visnings-ID. ID för en visning.
  • Användar-ID. Anonymt ID för användaren.
  • Tid. Visningstiden med formatet "MM/DD/ÅÅÅÅÅ 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 det här intrycket och användarens klickbeteenden på dem (1 för klick 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 delas med fliksymbolen:

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

De fullständiga innehållsorganen i MSN-nyhetsartiklar görs inte tillgängliga för nedladdning på grund av licensieringsstrukturen. 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
Underkategori golf
Title Vinnare på PGA-touren
Sammanfattning Ett galleri med de senaste vinnarna på PGA-touren.
webbadress 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 kunskapsdiagrammet Wikidata
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äddningarna av entiteter och relationer som lärts från undergrafen (från WikiData-kunskapsdiagrammet) med 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 att lära sig inbäddning från undergrafen kanske några entiteter inte har inbäddningar i filen entity_embedding.vec.

Lagringsplats

Data lagras i blobar i datacentret 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 några frågor om datauppsättningen.

Dataåtkomst

Azure Notebooks

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

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

MIND-data lagras i datacentret usa, västra/östra, så den här notebook-filen körs mer effektivt 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'

Funktioner

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äs 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 temporära 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 nyhetsrekommendationer som utvecklats på MIND från Microsoft Recommenders Repository

Visa resten av datauppsättningarna i katalogen Öppna datamängder.