Microsoft Haber Önerisi

Microsoft News Dataset (MIND), haber önerisi araştırması için büyük ölçekli bir veri kümesidir. Microsoft News web sitesinin anonimleştirilmiş davranış günlüklerinden derlenmiştir. MIND'ın misyonu, haber önerileri için bir karşılaştırma veri kümesi olarak hizmet sunmak, haber önerileri ve öneri sistemleri alanında aramayı kolaylaştırmaktır.

MIND, 1 milyon kullanıcı tarafından oluşturulan yaklaşık 160 bin İngilizce haber makalesi ve 15 milyondan fazla gösterim günlüğü içerir. Her haber makalesi başlık, soyut, gövde, kategori ve varlıklar gibi zengin metin içeriği içerir. Her gösterim günlüğü, tıklama olaylarını, tıklanmayan olayları ve bu izlenimden önce bu kullanıcının geçmiş haber tıklama davranışlarını içerir. Kullanıcı gizliliğini korumak için, anonimleştirilmiş bir kimliğe güvenli olarak karma değerleri oluşturulduğunda kullanıcıların üretim sistemi ile bağları kesilmiştir. MIND veri kümesi hakkında daha ayrıntılı bilgi için MIND: A Large-scale Dataset for News Recommendation makalesine bakabilirsiniz.

Hacim

Gerek eğitim gerekse doğrulama verileri ZIP ile sıkıştırılmış, dört farklı dosya içeren bir klasördedir:

DOSYA ADı AÇIKLAMA
behaviors.tsv Kullanıcıların tıklama geçmişleri ve gösterim günlükleri
news.tsv Haber makalelerinin bilgileri
entity_embedding.vec Bilgi grafından ayıklanmış varlıkların haberlerdeki eklemeleri
relation_embedding.vec Bilgi grafından ayıklanmış varlıklar arasındaki ilişkilerin eklemeleri

behaviors.tsv

behaviors.tsv dosyası gösterim günlüklerini ve kullanıcıların haber tıklama geçmişlerini içerir. Sekme simgesine bölünmüş beş sütunu vardır:

  • Gösterim Kimliği. Gösterimin kimliği.
  • Kullanıcı kimliği. Kullanıcının anonim kimliği.
  • Zaman. "AA/GG/YYYY HH:MM:SS AM/PM" biçimindeki gösterim süresi.
  • Geçmiş. Bu kullanıcının bu gösterimden önceki haber tıklama geçmişi (tıklanan haberlerin kimlik listesi).
  • Gösterimler. Bu gösterimde görüntülenen haberlerin listesi ve kullanıcının bu gösterimlerdeki tıklama davranışları (tıklama için 1 ve tıklama dışı için 0).

Aşağıdaki tabloda bir örnek gösterilmiştir:

SÜTUN İÇERİK
Gösterim Kimliği 123
Kullanıcı kimliği U131
Zaman 11/13/2019 8:36:57 ÖÖ
Geçmiş N11 N21 N103
Gösterimler N4-1 N34-1 N156-0 N207-0 N198-0

news.tsv

news.tsv dosyası, behaviors.tsv dosyasında yer alan haber makalelerinin ayrıntılı bilgilerini içerir. Sekme simgesine bölünmüş yedi sütunu vardır:

  • Haber Kimliği
  • Kategori
  • Alt kategori
  • Başlık
  • Abstract
  • URL
  • Başlık Varlıkları (bu haberin başlığında bulunan varlıklar)
  • Özet Varlıkları (bu haberin özetinde bulunan varlıklar)

MSN haber makalelerinin tam içerik gövdeleri, lisanslama yapısı nedeniyle indirilemez. Ancak size kolaylık sağlamak amacıyla, veri kümesindeki MSN URL'lerinden haber web sayfasını ayrıştırmaya yardımcı olması için bir yardımcı betik sağladık. Zaman sınırlaması nedeniyle bazı URL'lerin süresi dolar ve bunlara başarılı olarak erişilemez. Şu anda bu sorunu çözmek için yoğun bir şekilde çalışıyoruz.

Aşağıdaki tabloda bir örnek gösterilmektedir:

SÜTUN İÇERİK
Haber Kimliği N37378
Kategori spor
Alt Kategori golf
Başlık PGA Turnuvasını kazananlar
Abstract PGA Turnuvası'nı son kazananları gösteren galeri.
URL https://www.msn.com/en-us/sports/golf/pga-tour-winners/ss-AAjnQjj?ocid=chopendata
Başlık Varlıkları [{"Label": "PGA Tour", "Type": "O", "WikidataId": "Q910409", "Confidence": 1.0, "OccurrenceOffsets": [0], "SurfaceForms": ["PGA Tour"]}]
Özet Varlıkları [{"Label": "PGA Tour", "Type": "O", "WikidataId": "Q910409", "Confidence": 1.0, "OccurrenceOffsets": [35], "SurfaceForms": ["PGA Tour"]}]

"Varlıklar" sütunundaki sözlük anahtarlarının açıklamaları aşağıdaki gibi listelenir:

ANAHTAR AÇIKLAMA
Etiket Wikidata bilgi grafiğindeki varlık adı
Tür Bu varlığın Wikidata'daki türü
WikidataId Wikidata'daki varlık kimliği
Güven Varlık bağlamanın güvenilirliği
OccurrenceOffsets Varlığın başlık veya özetin metninde karakter olarak uzaklığı
SurfaceForms Özgün metindeki ham varlık adları

entity_embedding.vec ve relation_embedding.vec

entity_embedding.vec ve relation_embedding.vec dosyaları, TransE yöntemiyle alt yazıdan (WikiData bilgi grafından) öğrenilen varlıkların ve ilişkilerin 100 boyutlu eklemelerini içerir. Her iki dosyada da ilk sütun varlığın/ilişkinin kimliği, diğer sütunlar ise ekleme vektörü değerleridir. Bu verilerin bilgiye duyarlı haber önerilerinin araştırılmasını kolaylaştırmasını umuyoruz. Aşağıda bir örnek gösterilmiştir:

Kimlik DEĞER EKLEME
Q42306013 0.014516 -0.106958 0.024590 ... -0.080382

Alt yazıdan ekleme öğrenmenin bazı nedenlerinden dolayı, birkaç varlık entity_embedding.vec dosyasında eklemeler olmayabilir.

Depolama konumu

Veriler, Batı/Doğu ABD veri merkezindeki bloblarda, şu blob kapsayıcısında depolanır: 'https://mind201910small.blob.core.windows.net/release/'.

Kapsayıcı içinde eğitim ve doğrulama kümesi sırasıyla MINDlarge_train.zip ve MINDlarge_dev.zip olarak sıkıştırılır.

Ek bilgi

MIND veri kümesi, Microsoft Research Lisans Koşulları uyarınca araştırma amacıyla ücretsiz olarak indirilebilir. Veri kümesiyle ilgili sorularınız varsa iletişime geçin mind@microsoft.com .

Veri erişimi

Azure Notebooks

Azure'da MIND verilerine erişmek için tanıtım not defteri

Bu not defteri, Azure'da blob depolamadan MIND verilerine erişme örneği sağlar.

MIND verileri Batı/Doğu ABD veri merkezinde depolandığından, bu not defteri Batı/Doğu ABD'de bulunan Azure işlem üzerinde daha verimli çalışır.

İçeri aktarmalar ve ortam

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'

İşlevler

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

Dosyaları indirme ve ayıklama

# 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 ile dosyaları okuma

# 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

Geçici dosyaları temizleme

shutil.rmtree(temp_dir)

Örnekler

Microsoft Haber Recommender veri kümesinin nasıl kullanılacağına ilişkin aşağıdaki örneklere bakın:

Sonraki adımlar

Microsoft Recommenders Repository'den MIND üzerinde geliştirilen çeşitli temel haber öneri modellerine göz atın

Açık Veri Kümeleri kataloğundaki diğer veri kümelerini görüntüleyin.