Microsoft News-Empfehlung

Microsoft News Dataset (MIND) ist ein umfangreiches Dataset für die Recherche von News-Empfehlungen. Es wurde aus anonymisierten Verhaltensprotokollen der Microsoft News-Website gesammelt. MIND dient als Benchmark-Dataset für News-Empfehlungen und soll die Recherche im Bereich von News-Empfehlungen und Empfehlungssystemen erleichtern.

MIND umfasst etwa 160.000 englische News-Artikel und mehr als 15 Millionen Aufrufprotokolle, die von 1 Million Benutzern erzeugt wurden. Jeder News-Artikel enthält umfangreiche Textinhalte wie Titel, Zusammenfassung, Textkörper, Kategorie und Entitäten. Jedes Aufrufprotokoll enthält die Klickereignisse, Nicht-Klickereignisse und den Verlauf des News-Klickverhaltens des jeweiligen Benutzers vor dem entsprechenden Aufruf. Aus Gründen des Datenschutzes wurde jeder Benutzer aus dem Produktionssystem „abgekoppelt“, wenn er mit einer anonymisierten ID sicher hashcodiert wurde. Detailliertere Informationen zum MIND-Dataset finden Sie im Artikel MIND: A Large-scale Dataset for News Recommendation (MIND: Ein umfangreiches Dataset für News-Empfehlungen).

Volume

Sowohl die Trainings- als auch die Überprüfungsdaten sind in einem ZIP-komprimierten Ordner gespeichert, der vier verschiedene Dateien enthält:

DATEINAME DESCRIPTION
behaviors.tsv Die Klickverläufe und Aufrufprotokolle von Benutzern
news.tsv Die Informationen aus News-Artikeln
entity_embedding.vec Die Einbettungen von Entitäten in News, die aus Knowledge Graph extrahiert wurden
relation_embedding.vec Die Einbettungen von Beziehungen zwischen Entitäten, die aus Knowledge Graph extrahiert wurden

behaviors.tsv

Die Datei behaviors.tsv enthält die Aufrufprotokolle und die News-Klickverläufe der Benutzer. Sie besteht aus fünf Spalten, die durch das Registerkartensymbol unterteilt sind:

  • Aufruf-ID. Die ID eines Aufrufs.
  • Benutzer-ID. Die anonyme ID eines Benutzers.
  • Zeit. Die Uhrzeit des Aufrufs im Format „TT/MM/JJJJ HH:MM:SS AM/PM“.
  • Verlauf. Der News-Klickverlauf (ID-Liste von geklickten News) dieses Benutzers vor diesem Aufruf.
  • Aufrufe. Liste der bei diesem Aufruf angezeigten News und das Klickverhalten des Benutzers für sie (1 für Klick und 0 für kein Klick).

Ein Beispiel dafür wird in der Tabelle unten gezeigt:

COLUMN CONTENT
Aufruf-ID 123
Benutzer-ID U131
Time 13.11.2019 8:36:57 Uhr
Verlauf N11 N21 N103
Aufrufe N4-1 N34-1 N156-0 N207-0 N198-0

news.tsv

Die Datei news.tsv enthält die detaillierten Informationen zu News-Artikeln in der Datei behaviors.tsv. Sie besteht aus sieben Spalten, die durch das Registerkartensymbol unterteilt sind:

  • News-ID
  • Category
  • Unterkategorie
  • Titel
  • Zusammenfassung
  • URL
  • Titelentitäten (Entitäten, die im Titel dieser News enthalten sind)
  • Zusammenfassungsentitäten (Entitäten, die in der Zusammenfassung dieser News enthalten sind)

Aufgrund der Lizenzstruktur werden die vollständigen Textkörper des Inhalts von MSN News-Artikeln zum Herunterladen nicht zur Verfügung gestellt. Der Einfachheit halber haben wir aber ein Hilfsprogrammskript als Hilfe beim Analysieren der News-Webseite aus den MSN-URLs im Dataset bereitgestellt. Aufgrund von zeitlicher Einschränkung sind einige URLs abgelaufen, sodass darauf nicht erfolgreich zugegriffen werden kann. Wir arbeiten zur Zeit an einer Lösung dieses Problems.

Ein Beispiel dafür wird in der folgenden Tabelle gezeigt:

COLUMN CONTENT
News-ID N37378
Category Sport
SubCategory Golf
Titel PGA Tour-Gewinner
Zusammenfassung Ein Katalog der aktuellen Gewinner der PGA Tour.
URL https://www.msn.com/en-us/sports/golf/pga-tour-winners/ss-AAjnQjj?ocid=chopendata
Titelentitäten [{“Label”: “PGA Tour”, “Type”: “O”, “WikidataId”: “Q910409”, “Confidence”: 1.0, “OccurrenceOffsets”: [0], “SurfaceForms”: [“PGA Tour”]}]
Zusammenfassungsentitäten [{“Label”: “PGA Tour”, “Type”: “O”, “WikidataId”: “Q910409”, “Confidence”: 1.0, “OccurrenceOffsets”: [35], “SurfaceForms”: [“PGA Tour”]}]

Die Beschreibungen der Wörterbuchschlüssel in der Spalte „Entitäten“ werden folgendermaßen aufgelistet:

SCHLÜSSEL DESCRIPTION
Bezeichnung Der Entitätsname im Wikidata-Knowledge Graph
type Der Typ dieser Entität in Wikidata
WikidataId Die Entitäts-ID in Wikidata
Confidence Die Konfidenz der Entitätsverknüpfung
OccurrenceOffsets Das Entitätsoffset auf Zeichenebene im Text des Titels oder der Zusammenfassung
SurfaceForms Die „rohen“ Entitätsnamen im Originaltext

entity_embedding.vec & relation_embedding.vec

Die Dateien entity_embedding.vec und relation_embedding.vec enthalten die 100-dimensionalen Einbettungen der Entitäten und Beziehungen, die durch die TransE-Methode aus dem Unterdiagramm (von WikiData-Knowledge Graph) erlernt wurden. In beiden Dateien enthält die erste Spalte die ID von Entität/Beziehung, und die anderen Spalten enthalten die Werte des Einbettungsvektors. Wir hoffen, dass diese Daten die Recherche in wissensintensiven News-Empfehlungen erleichtern können. Ein Beispiel sieht folgendermaßen aus:

id EINBETTUNGSWERTE
Q42306013 0.014516 -0.106958 0.024590 … -0.080382

Infolge einiger Gründe beim Erlernen der Einbettung aus dem Unterdiagramm enthalten ein paar Entitäten in der Datei entity_embedding.vec möglicherweise keine Einbettungen.

Speicherort

Die Daten werden in Blobs in einem Rechenzentrum der Region „USA, Westen/Osten“ gespeichert. Dazu wird folgender Blobcontainer verwendet: https://mind201910small.blob.core.windows.net/release/.

Innerhalb des Containers werden das Trainings- und Überprüfungsset in MINDlarge_train.zip bzw. MINDlarge_dev.zip komprimiert.

Zusätzliche Informationen

Das MIND-Dataset kann zu Recherchezwecken unter Microsoft-Software-Lizenzbedingungen kostenlos heruntergeladen werden. Wenden Sie sich an mind@microsoft.com, wenn Sie Fragen zum Dataset haben.

Datenzugriff

Azure Notebooks

Demonotebook für den Zugriff auf MIND-Daten in Azure

Dieses Notebook enthält ein Beispiel für den Zugriff auf MIND-Daten aus Blob Storage in Azure.

MIND-Daten werden im Rechenzentrum „USA, Westen/Osten“ gespeichert, sodass dieses Notebook effizienter auf dem Azure-Compute in der Region „USA, Westen/Osten“ ausgeführt wird.

Importe und Umgebung

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

Herunterladen und Extrahieren der Dateien

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

Lesen der Dateien mit 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

Bereinigen der temporären Dateien

shutil.rmtree(temp_dir)

Beispiele

Sehen Sie sich die folgenden Beispiele für die Verwendung des Microsoft News Recommender-Datasets an:

Nächste Schritte

Sehen Sie sich verschiedene Baselinemodelle für Nachrichtenempfehlungen an, die für MIND aus dem Microsoft Recommenders-Repository entwickelt wurden.

Machen Sie sich mit den restlichen Datasets im Open Datasets-Katalog vertraut.