{"id":71852,"date":"2020-02-28T20:59:58","date_gmt":"2020-02-28T17:59:58","guid":{"rendered":"https:\/\/prohoster.info\/blog\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij"},"modified":"2020-03-03T16:14:08","modified_gmt":"2020-03-03T13:14:08","slug":"kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","title":{"rendered":"Jak pracujeme na kvalit\u011b a rychlosti doporu\u010dov\u00e1n\u00ed","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Jmenuji se Pavel Parkhomenko, jsem v\u00fdvoj\u00e1\u0159 ML. V tomto \u010dl\u00e1nku bych se cht\u011bl pod\u011blit o strukturu slu\u017eby Yandex.Zen a sd\u00edlet technick\u00e1 vylep\u0161en\u00ed, jejich\u017e zaveden\u00ed zv\u00fd\u0161ilo kvalitu doporu\u010den\u00ed. Z p\u0159\u00edsp\u011bvku se dozv\u00edte, jak za pouh\u00e9 milisekundy naj\u00edt mezi miliony dokument\u016f ty nejrelevantn\u011bj\u0161\u00ed pro u\u017eivatele; jak prov\u00e1d\u011bt kontinualn\u00ed rozklad velk\u00e9 matice (s miliony sloupc\u016f a des\u00edtkami milion\u016f \u0159\u00e1dk\u016f), aby nov\u00e9 dokumenty z\u00edskaly sv\u016fj vektor b\u011bhem des\u00edtek minut; jak znovu pou\u017e\u00edt rozklad matice u\u017eivatel-\u010dl\u00e1nek, abychom z\u00edskali dobr\u00e9 vektorov\u00e9 reprezentace pro videa.<\/p>\n<p><img decoding=\"async\" alt=\"Jak pracujeme na kvalit\u011b a rychlosti doporu\u010dov\u00e1n\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/d63caf9162ca3533548fdef9cd740c24.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex> <br \/>\nNa\u0161e doporu\u010dovac\u00ed datab\u00e1ze obsahuje miliony dokument\u016f r\u016fzn\u00fdch form\u00e1t\u016f: textov\u00e9 \u010dl\u00e1nky vytvo\u0159en\u00e9 na na\u0161\u00ed platform\u011b a p\u0159evzat\u00e9 z extern\u00edch web\u016f, videa, narativy a kr\u00e1tk\u00e9 p\u0159\u00edsp\u011bvky. Rozvoj podobn\u00e9 slu\u017eby je spojen s mnoha technick\u00fdmi v\u00fdzvami. Zde jsou n\u011bkter\u00e9 z nich:<\/p>\n<ul>\n<li>Rozd\u011blit v\u00fdpo\u010detn\u00ed \u00fakoly: v\u0161echny n\u00e1ro\u010dn\u00e9 operace prov\u00e1d\u011bt offline, zat\u00edmco v re\u00e1ln\u00e9m \u010dase realizovat pouze rychl\u00e9 pou\u017eit\u00ed model\u016f, abychom odpov\u00eddali za 100-200 ms.<\/li>\n<li>Rychle zohlednit akce u\u017eivatele. K tomu je nutn\u00e9, aby v\u0161echny ud\u00e1losti okam\u017eit\u011b p\u0159ich\u00e1zely do doporu\u010dova\u010de a ovliv\u0148ovaly v\u00fdsledky pr\u00e1ce model\u016f.<\/li>\n<li>Ud\u011blat takov\u00fd feed, aby se u nov\u00fdch u\u017eivatel\u016f rychle p\u0159izp\u016fsobil jejich chov\u00e1n\u00ed. Nov\u011b p\u0159\u00edchoz\u00ed u\u017eivatel\u00e9 by m\u011bli c\u00edtit, \u017ee jejich zp\u011btn\u00e1 vazba ovliv\u0148uje doporu\u010den\u00ed.<\/li>\n<li>Rychle rozum\u011bt, komu doporu\u010dit nov\u00fd \u010dl\u00e1nek.<\/li>\n<li>Okam\u017eit\u011b reagovat na neust\u00e1l\u00fd p\u0159\u00edval nov\u00e9ho obsahu. Des\u00edtky tis\u00edc \u010dl\u00e1nk\u016f vych\u00e1z\u00ed ka\u017ed\u00fd den a mnoho z nich m\u00e1 omezenou \u017eivotnost (\u0159ekn\u011bme, zpr\u00e1vy). To je odli\u0161uje od film\u016f, hudby a jin\u00e9ho dlouhodob\u00e9ho a n\u00e1ro\u010dn\u00e9ho obsahu.<\/li>\n<li>P\u0159en\u00e1\u0161et znalosti z jedn\u00e9 dom\u00e9ny do druh\u00e9. Pokud m\u00e1 doporu\u010dovac\u00ed syst\u00e9m vy\u0161kolen\u00e9 modely pro textov\u00e9 \u010dl\u00e1nky a do n\u011bj p\u0159id\u00e1me videa, m\u016f\u017eeme znovu pou\u017e\u00edt existuj\u00edc\u00ed modely, aby se nov\u00fd typ obsahu l\u00e9pe \u0159adil.<\/li>\n<\/ul>\n<p>\nPov\u00edm v\u00e1m, jak jsme tyto \u00fakoly \u0159e\u0161ili.<\/p>\n<h2>V\u00fdb\u011br kandid\u00e1t\u016f<\/h2>\n<p>\n<b>Jak b\u011bhem n\u011bkolika milisekund drasticky zkr\u00e1tit mno\u017estv\u00ed posuzovan\u00fdch dokument\u016f na tis\u00edce, ani\u017e bychom v\u00fdznamn\u011b zhor\u0161ili kvalitu hodnocen\u00ed?<\/b><\/p>\n<p>P\u0159edpokl\u00e1dejme, \u017ee jsme vytr\u00e9novali mnoho ML model\u016f, na jejich\u017e z\u00e1klad\u011b jsme vytvo\u0159ili znaky a nau\u010dili dal\u0161\u00ed model, kter\u00fd hodnot\u00ed dokumenty pro u\u017eivatele. V\u0161echno by bylo skv\u011bl\u00e9, ale nelze prost\u011b vz\u00edt a spo\u010d\u00edtat v\u0161echny znaky pro v\u0161echny dokumenty v re\u00e1ln\u00e9m \u010dase, pokud t\u011bch dokument\u016f jsou miliony a doporu\u010den\u00ed je t\u0159eba sestavit za 100-200 ms. \u00dakolem je vybrat z milion\u016f n\u011bjak\u00fd podmno\u017einu, kter\u00e1 bude hodnocena pro u\u017eivatele. Tento krok se obvykle naz\u00fdv\u00e1 v\u00fdb\u011br kandid\u00e1t\u016f. Na n\u011bj jsou kladeny ur\u010dit\u00e9 po\u017eadavky. Zaprv\u00e9, v\u00fdb\u011br by m\u011bl prob\u00edhat velmi rychle, aby na samotn\u00e9 hodnocen\u00ed z\u016fst\u00e1valo co nejv\u00edce \u010dasu. Zadruh\u00e9, p\u0159i v\u00fdrazn\u00e9m sn\u00ed\u017een\u00ed po\u010dtu dokument\u016f k hodnocen\u00ed bychom m\u011bli co nejv\u00edce zachovat relevantn\u00ed dokumenty pro u\u017eivatele.<\/p>\n<p>N\u00e1\u0161 princip v\u00fdb\u011bru kandid\u00e1t\u016f se postupn\u011b vyv\u00edjel a v sou\u010dasn\u00e9 dob\u011b jsme dosp\u011bli k v\u00edce\u00farov\u0148ov\u00e9mu sch\u00e9matu:<\/p>\n<p><img decoding=\"async\" alt=\"Jak pracujeme na kvalit\u011b a rychlosti doporu\u010dov\u00e1n\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/ed9657ed1febe871f36dc7cf7e585963.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <br \/>\nNejprve jsou v\u0161echny dokumenty rozd\u011bleny do skupin a z ka\u017ed\u00e9 skupiny jsou vybr\u00e1ny nejobl\u00edben\u011bj\u0161\u00ed dokumenty. Skupinami mohou b\u00fdt weby, t\u00e9mata, shluky. Pro ka\u017ed\u00e9ho u\u017eivatele jsou na z\u00e1klad\u011b jeho historie vyb\u00edr\u00e1ny nejbli\u017e\u0161\u00ed skupiny a z nich se vyb\u00edraj\u00ed nejlep\u0161\u00ed dokumenty. Tak\u00e9 pou\u017e\u00edv\u00e1me kNN index pro v\u00fdb\u011br nejbli\u017e\u0161\u00edch dokument\u016f u\u017eivateli v re\u00e1ln\u00e9m \u010dase. Existuje n\u011bkolik metod pro vytv\u00e1\u0159en\u00ed kNN indexu, u n\u00e1s nejl\u00e9pe fungoval <noindex><a rel=\"nofollow\" href=\"https:\/\/arxiv.org\/abs\/1603.09320\">HNSW<\/a><\/noindex> (Hierarchical Navigable Small World graphs). To je hierarchick\u00fd model, kter\u00fd umo\u017e\u0148uje za n\u011bkolik milisekund naj\u00edt N nejbli\u017e\u0161\u00edch vektor\u016f pro u\u017eivatele z milionov\u00e9 datab\u00e1ze. Nejd\u0159\u00edve offline indexujeme celou na\u0161i datab\u00e1zi dokument\u016f. Vzhledem k tomu, \u017ee vyhled\u00e1v\u00e1n\u00ed v indexu funguje pom\u011brn\u011b rychle, je p\u0159i dostupnosti n\u011bkolika siln\u00fdch embedov\u00e1n\u00ed mo\u017en\u00e9 vytvo\u0159it n\u011bkolik index\u016f (jeden index pro ka\u017ed\u00e9 embedov\u00e1n\u00ed) a v re\u00e1ln\u00e9m \u010dase k nim p\u0159istupovat.<\/p>\n<p>Pro ka\u017ed\u00e9ho u\u017eivatele m\u00e1me des\u00edtky tis\u00edc dokument\u016f. To je st\u00e1le hodn\u011b na to, abychom spo\u010d\u00edtali v\u0161echny znaky, tak\u017ee v t\u00e9to f\u00e1zi aplikujeme lehk\u00e9 hodnocen\u00ed \u2014 zjednodu\u0161en\u00fd model t\u011b\u017ek\u00e9ho hodnocen\u00ed s ni\u017e\u0161\u00edm po\u010dtem znak\u016f. C\u00edlem je p\u0159edpov\u011bd\u011bt, kter\u00e9 dokumenty budou na vrcholu t\u011b\u017ek\u00e9ho modelu. Dokumenty s nejvy\u0161\u0161\u00edm prediktem budou pou\u017eity v t\u011b\u017ek\u00e9m modelu, tedy v posledn\u00ed f\u00e1zi hodnocen\u00ed. Tento p\u0159\u00edstup umo\u017e\u0148uje v \u0159\u00e1du milisekund z\u00fa\u017eit datab\u00e1zi dokument\u016f, kter\u00e9 se u\u017eivateli zobrazuj\u00ed, z milion\u016f na tis\u00edce.<\/p>\n<h2>Krok ALS v re\u00e1ln\u00e9m \u010dase<\/h2>\n<p>\n<b>Jak zohlednit zp\u011btnou vazbu u\u017eivatele okam\u017eit\u011b po kliknut\u00ed?<\/b><\/p>\n<p>D\u016fle\u017eit\u00fdm faktorem v doporu\u010den\u00edch je doba reakce na zp\u011btnou vazbu u\u017eivatele. To je obzvl\u00e1\u0161\u0165 d\u016fle\u017eit\u00e9 pro nov\u00e9 u\u017eivatele: kdy\u017e \u010dlov\u011bk teprve za\u010d\u00edn\u00e1 pou\u017e\u00edvat doporu\u010dovac\u00ed syst\u00e9m, dost\u00e1v\u00e1 nep\u0159izp\u016fsoben\u00fd proud r\u016fznorod\u00fdch dokument\u016f. Jakmile provede prvn\u00ed kliknut\u00ed, je nezbytn\u00e9 to okam\u017eit\u011b zohlednit a p\u0159izp\u016fsobit se jeho z\u00e1jm\u016fm. Pokud se v\u0161echny faktory po\u010d\u00edtaj\u00ed offline, rychl\u00e1 reakce syst\u00e9mu se stane nemo\u017enou kv\u016fli zpo\u017ed\u011bn\u00ed. Je tedy nutn\u00e9 zpracov\u00e1vat u\u017eivatelsk\u00e9 akce v re\u00e1ln\u00e9m \u010dase. Pro tyto \u00fa\u010dely pou\u017e\u00edv\u00e1me krok ALS v re\u00e1ln\u00e9m \u010dase pro budov\u00e1n\u00ed vektoru u\u017eivatele.<\/p>\n<p>P\u0159edpokl\u00e1dejme, \u017ee m\u00e1me pro v\u0161echny dokumenty vektorov\u00e9 zastoupen\u00ed. Nap\u0159\u00edklad m\u016f\u017eeme offline na z\u00e1klad\u011b textu \u010dl\u00e1nku vybudovat embeddingy pomoc\u00ed ELMo, BERT nebo jin\u00fdch model\u016f strojov\u00e9ho u\u010den\u00ed. Jak lze z\u00edskat vektorov\u00e9 zastoupen\u00ed u\u017eivatel\u016f ve stejn\u00e9m prostoru na z\u00e1klad\u011b jejich interakc\u00ed v syst\u00e9mu?<\/p>\n<p><b class=\"spoiler_title\">Obecn\u00fd princip formov\u00e1n\u00ed a rozkladu matice u\u017eivatel-dokument<\/b>P\u0159edstavme si, \u017ee m\u00e1me m u\u017eivatel\u016f a n dokument\u016f. U n\u011bkter\u00fdch u\u017eivatel\u016f jsou zn\u00e1my jejich preference v\u016f\u010di n\u011bkter\u00fdm dokument\u016fm. Tyto informace lze pot\u00e9 ztv\u00e1rnit v podob\u011b matice m x n: \u0159\u00e1dky odpov\u00eddaj\u00ed u\u017eivatel\u016fm a sloupce dokument\u016fm. Jeliko\u017e v\u011bt\u0161ina dokument\u016f nebyla u\u017eivateli vid\u011bna, v\u011bt\u0161ina bun\u011bk matice z\u016fstane pr\u00e1zdn\u00fdch, zat\u00edmco jin\u00e9 budou vypln\u011bny. Pro ka\u017edou ud\u00e1lost (like, dislike, kliknut\u00ed) v matici je p\u0159i\u0159azena n\u011bjak\u00e1 hodnota \u2014 av\u0161ak zjednodu\u0161en\u011b uva\u017eujme model, ve kter\u00e9m like odpov\u00edd\u00e1 1 a dislike -1.<\/p>\n<p>Rozlo\u017e\u00edme matici na dv\u011b: P (m x d) a Q (d x n), kde d je rozm\u011br vektorov\u00e9ho zobrazen\u00ed (obvykle je to mal\u00e9 \u010d\u00edslo). Ka\u017ed\u00e9mu objektu tak bude odpov\u00eddat d-rozm\u011brn\u00fd vektor (u\u017eivateli \u2014 \u0159\u00e1dek v matici P, dokumentu \u2014 sloupec v matici Q). Tyto vektory budou embedddingy p\u0159\u00edslu\u0161n\u00fdch objekt\u016f. Abychom p\u0159edpov\u011bd\u011bli, zda se u\u017eivateli dokument l\u00edb\u00ed, m\u016f\u017eeme jednodu\u0161e vyn\u00e1sobit jejich embeddingy.<\/p>\n<p><img decoding=\"async\" alt=\"Jak pracujeme na kvalit\u011b a rychlosti doporu\u010dov\u00e1n\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/a0c721bccb3806f2c4a18693a9458a89.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJedn\u00edm z mo\u017en\u00fdch zp\u016fsob\u016f rozlo\u017een\u00ed matice je ALS (Alternating Least Squares). Budeme optimalizovat n\u00e1sleduj\u00edc\u00ed ztr\u00e1tovou funkci:<\/p>\n<p><img decoding=\"async\" alt=\"Jak pracujeme na kvalit\u011b a rychlosti doporu\u010dov\u00e1n\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/aab8a1ae1cdf39de21e7469864c5190a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nZde rui p\u0159edstavuje interakci u\u017eivatele u s dokumentem i, qi je vektor dokumentu i, pu je vektor u\u017eivatele u.<\/p>\n<p>Tak\u017ee optim\u00e1ln\u00ed vektor u\u017eivatele podle st\u0159edn\u00ed kvadratick\u00e9 chyby (p\u0159i pevn\u00fdch vektorech dokument\u016f) lze analyticky nal\u00e9zt prost\u0159ednictv\u00edm \u0159e\u0161en\u00ed p\u0159\u00edslu\u0161n\u00e9 line\u00e1rn\u00ed regrese.<\/p>\n<p>Tento krok se naz\u00fdv\u00e1 \u201ekrok ALS\u201c. A samotn\u00fd algoritmus ALS spo\u010d\u00edv\u00e1 v tom, \u017ee st\u0159\u00eddav\u011b fixujeme jednu z matic (u\u017eivatel\u00e9 a \u010dl\u00e1nky) a aktualizujeme druhou, abychom na\u0161li optim\u00e1ln\u00ed \u0159e\u0161en\u00ed.<\/p>\n<p>Na\u0161t\u011bst\u00ed nalezen\u00ed vektorov\u00e9ho zobrazen\u00ed u\u017eivatele je pom\u011brn\u011b rychl\u00e1 operace, kterou lze prov\u00e1d\u011bt v re\u00e1ln\u00e9m \u010dase pomoc\u00ed vektorov\u00fdch instrukc\u00ed. Tento trik umo\u017e\u0148uje ihned zohlednit zp\u011btnou vazbu u\u017eivatele p\u0159i hodnocen\u00ed. Takov\u00fd embedding lze tak\u00e9 pou\u017e\u00edt v kNN-indexu pro zlep\u0161en\u00ed v\u00fdb\u011bru kandid\u00e1t\u016f.<\/p>\n<h2>Distribuovan\u00e1 kolaborativn\u00ed filtrace<\/h2>\n<p>\n<b>Jak prov\u00e1d\u011bt inkrement\u00e1ln\u00ed distribuovanou faktoriza\u010dn\u00ed matici a rychle nal\u00e9zt vektorov\u00e9 zobrazen\u00ed nov\u00fdch \u010dl\u00e1nk\u016f?<\/b><\/p>\n<p>Obsah nen\u00ed jedin\u00fdm zdrojem sign\u00e1l\u016f pro doporu\u010den\u00ed. Dal\u0161\u00edm d\u016fle\u017eit\u00fdm zdrojem je kolaborativn\u00ed informace. Dobr\u00e9 zn\u00e1mky v hodnocen\u00ed lze tradi\u010dn\u011b z\u00edskat z rozlo\u017een\u00ed matice u\u017eivatel-dokument. Ale p\u0159i pokusu o takov\u00e9 rozlo\u017een\u00ed jsme narazili na probl\u00e9my:<\/p>\n<p>1. M\u00e1me miliony dokument\u016f a des\u00edtky milion\u016f u\u017eivatel\u016f. Matice se na jeden stroj cel\u00e1 nevejde a rozlo\u017een\u00ed bude velmi zdlouhav\u00e9.<br \/>\n2. V\u011bt\u0161ina obsahu v syst\u00e9mu m\u00e1 kr\u00e1tkou \u017eivotnost: dokumenty z\u016fst\u00e1vaj\u00ed aktu\u00e1ln\u00ed jen n\u011bkolik hodin. Proto je nezbytn\u00e9 co nejrychleji vytvo\u0159it jejich vektorov\u00e9 zastoupen\u00ed.<br \/>\n3. Pokud provedeme rozlo\u017een\u00ed hned po publikaci dokumentu, nez\u00edsk\u00e1 dostate\u010dn\u00e9 hodnocen\u00ed od u\u017eivatel\u016f. Proto bude jeho vektorov\u00e9 zastoupen\u00ed s vysokou pravd\u011bpodobnost\u00ed m\u00e9n\u011b kvalitn\u00ed.<br \/>\n4. Pokud u\u017eivatel d\u00e1 palec nahoru nebo dol\u016f, nem\u016f\u017eeme to okam\u017eit\u011b zohlednit v rozlo\u017een\u00ed.<\/p>\n<p>Abychom vy\u0159e\u0161ili uveden\u00e9 probl\u00e9my, implementovali jsme distribuovan\u00e9 rozlo\u017een\u00ed matice u\u017eivatel-dokument s \u010dast\u00fdmi inkrement\u00e1ln\u00edmi aktualizacemi. Jak to vlastn\u011b funguje?<\/p>\n<p>P\u0159edpokl\u00e1dejme, \u017ee m\u00e1me klastr N stroj\u016f (N se po\u010d\u00edt\u00e1 na stovky) a chceme prov\u00e9st distribuovan\u00e9 rozlo\u017een\u00ed matice, kter\u00e1 se na jeden stroj nevejde. Ot\u00e1zka zn\u00ed \u2013 jak toto rozlo\u017een\u00ed prov\u00e9st tak, aby na ka\u017ed\u00e9m stroji byly dostate\u010dn\u00e9 \u00fadaje a z\u00e1rove\u0148 aby v\u00fdpo\u010dty byly nez\u00e1visl\u00e9? <\/p>\n<p><img decoding=\"async\" alt=\"Jak pracujeme na kvalit\u011b a rychlosti doporu\u010dov\u00e1n\u00ed\" src=\"\/wp-content\/uploads\/2020\/02\/9170b0fecb6efcd41754ec20ee539a15.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPou\u017eijeme v\u00fd\u0161e popsan\u00fd algoritmus rozlo\u017een\u00ed ALS. Poj\u010fme se pod\u00edvat, jak distribuovat jeden krok ALS \u2013 ostatn\u00ed kroky budou podobn\u00e9. P\u0159edpokl\u00e1dejme, \u017ee m\u00e1me fixn\u00ed matici dokument\u016f a chceme vytvo\u0159it matici u\u017eivatel\u016f. K tomu ji rozd\u011bl\u00edme na N \u010d\u00e1st\u00ed podle \u0159\u00e1dk\u016f, ka\u017ed\u00e1 \u010d\u00e1st bude obsahovat p\u0159ibli\u017en\u011b stejn\u00e9 mno\u017estv\u00ed \u0159\u00e1dk\u016f. Odes\u00edl\u00e1me na ka\u017ed\u00fd stroj nepr\u00e1zdn\u00e9 bu\u0148ky odpov\u00eddaj\u00edc\u00edch \u0159\u00e1dk\u016f, stejn\u011b jako matici embedding\u016f dokument\u016f (celou). Proto\u017ee jej\u00ed velikost nen\u00ed p\u0159\u00edli\u0161 velk\u00e1 a matice u\u017eivatel-dokument je obvykle siln\u011b \u0159\u00eddk\u00e1, tato data se vejdou na b\u011b\u017en\u00fd stroj.<\/p>\n<p>Tento trik lze opakovat po mnoho epoch a\u017e do konvergence modelu, p\u0159i\u010dem\u017e se st\u0159\u00eddav\u011b m\u011bn\u00ed fixn\u00ed matice. I tak m\u016f\u017ee rozklad matice trvat n\u011bkolik hodin. A to ne\u0159e\u0161\u00ed probl\u00e9m, \u017ee je nutn\u00e9 rychle z\u00edsk\u00e1vat embeddingy nov\u00fdch dokument\u016f a aktualizovat embeddingy t\u011bch, kter\u00e9 m\u011bly m\u00e1lo informac\u00ed p\u0159i vytv\u00e1\u0159en\u00ed modelu. <\/p>\n<p>Pomohla n\u00e1m implementace rychl\u00e9 inkrement\u00e1ln\u00ed aktualizace modelu. P\u0159edpokl\u00e1dejme, \u017ee m\u00e1me aktu\u00e1ln\u011b nau\u010den\u00fd model. Od jeho tr\u00e9nov\u00e1n\u00ed se objevily nov\u00e9 \u010dl\u00e1nky, se kter\u00fdmi na\u0161i u\u017eivatel\u00e9 interagovali, a tak\u00e9 \u010dl\u00e1nky, kter\u00e9 m\u011bly p\u0159i tr\u00e9nov\u00e1n\u00ed m\u00e1lo interakc\u00ed. K rychl\u00e9mu z\u00edsk\u00e1n\u00ed embeddingu t\u011bchto \u010dl\u00e1nk\u016f pou\u017e\u00edv\u00e1me embeddingy u\u017eivatel\u016f z\u00edskan\u00e9 b\u011bhem prvn\u00edho velk\u00e9ho tr\u00e9nov\u00e1n\u00ed modelu a prov\u00e1d\u00edme jeden krok ALS, abychom vypo\u010d\u00edtali matici dokument\u016f p\u0159i fixn\u00ed matici u\u017eivatel\u016f. To umo\u017e\u0148uje z\u00edsk\u00e1vat embeddingy docela rychle \u2014 b\u011bhem n\u011bkolika minut po zve\u0159ejn\u011bn\u00ed dokumentu \u2014 a \u010dasto aktualizovat embeddingy nov\u00fdch dokument\u016f.<\/p>\n<p>Aby byly p\u0159i doporu\u010den\u00ed okam\u017eit\u011b zohledn\u011bny akce u\u017eivatele, v runtime nepou\u017e\u00edv\u00e1me embeddingy u\u017eivatel\u016f z\u00edskan\u00e9 offline. M\u00edsto toho prov\u00e1d\u00edme krok ALS a z\u00edsk\u00e1v\u00e1me aktu\u00e1ln\u00ed vektor u\u017eivatele.<\/p>\n<h2>P\u0159enos do jin\u00e9 dom\u00e9nov\u00e9 oblasti<\/h2>\n<p>\n<b>Jak vyu\u017e\u00edt zp\u011btnou vazbu u\u017eivatel\u016f k textov\u00fdm \u010dl\u00e1nk\u016fm pro vytvo\u0159en\u00ed vektorov\u00e9ho reprezentace videa?<\/b><\/p>\n<p>P\u016fvodn\u011b jsme doporu\u010dovali pouze textov\u00e9 \u010dl\u00e1nky, tak\u017ee mnoho na\u0161ich algoritm\u016f je zam\u011b\u0159eno na tento typ obsahu. Av\u0161ak p\u0159i p\u0159id\u00e1n\u00ed obsahu jin\u00e9ho typu jsme \u010delili pot\u0159eb\u011b p\u0159izp\u016fsobit modely. Jak jsme tento \u00fakol \u0159e\u0161ili na p\u0159\u00edkladu videa? Jednou z mo\u017enost\u00ed je p\u0159e\u0161kolit v\u0161echny modely od nuly. Ale to trv\u00e1 dlouho, nav\u00edc n\u011bkter\u00e9 algoritmy jsou n\u00e1ro\u010dn\u00e9 na objem tr\u00e9novac\u00ed sady, kterou v po\u010d\u00e1te\u010dn\u00edch chv\u00edl\u00edch existence nov\u00e9ho typu obsahu na slu\u017eb\u011b je\u0161t\u011b nem\u00e1me v pot\u0159ebn\u00e9m mno\u017estv\u00ed.<\/p>\n<p>Zvolili jsme jinou cestu a znovu pou\u017eili textov\u00e9 modely pro videa. P\u0159i vytv\u00e1\u0159en\u00ed vektorov\u00fdch reprezentac\u00ed vide\u00ed n\u00e1m pomohl stejn\u00fd trik s ALS. Vzali jsme vektorovou reprezentaci u\u017eivatel\u016f na z\u00e1klad\u011b textov\u00fdch \u010dl\u00e1nk\u016f a provedli krok ALS, vyu\u017e\u00edvaj\u00edc\u00ed informace o zhl\u00e9dnut\u00edch vide\u00ed. Takto jsme bez obt\u00ed\u017e\u00ed z\u00edskali vektorovou reprezentaci vide\u00ed. A v runtime prost\u011b vypo\u010d\u00edt\u00e1v\u00e1me bl\u00edzkost mezi vektorem u\u017eivatele z\u00edskan\u00fdm na z\u00e1klad\u011b textov\u00fdch \u010dl\u00e1nk\u016f a vektorem videa.<\/p>\n<h2>Z\u00e1v\u011br<\/h2>\n<p>\nV\u00fdvoj j\u00e1dra re\u00e1ln\u00e9ho syst\u00e9mu doporu\u010den\u00ed je spojen s mno\u017estv\u00edm \u00fakol\u016f. Je pot\u0159eba rychle zpracov\u00e1vat data a aplikovat metody strojov\u00e9ho u\u010den\u00ed pro efektivn\u00ed vyu\u017eit\u00ed t\u011bchto dat; budovat slo\u017eit\u00e9 distribuovan\u00e9 syst\u00e9my, schopn\u00e9 za minim\u00e1ln\u00ed \u010das zpracov\u00e1vat u\u017eivatelsk\u00e9 sign\u00e1ly a nov\u00e9 kusy obsahu; a mnoho dal\u0161\u00edch \u00fakol\u016f.<\/p>\n<p>V aktu\u00e1ln\u00edm syst\u00e9mu, jeho\u017e strukturu jsem popsal, kvalita doporu\u010den\u00ed pro u\u017eivatele roste spolu s jeho aktivitou a d\u00e9lkou pobytu na slu\u017eb\u011b. Ale samoz\u0159ejm\u011b, zde se skr\u00fdv\u00e1 i hlavn\u00ed obt\u00ed\u017e: syst\u00e9mu se t\u011b\u017eko hned poda\u0159\u00ed pochopit z\u00e1jmy \u010dlov\u011bka, kter\u00fd m\u00e1lo interagoval s obsahem. Zlep\u0161en\u00ed doporu\u010den\u00ed pro nov\u00e9 u\u017eivatele je na\u0161\u00edm kl\u00ed\u010dov\u00fdm \u00fakolem. Pokra\u010dujeme v optimalizaci algoritm\u016f, aby se relevantn\u00ed obsah rychleji dostal do jejich feedu a nerelevantn\u00ed se nezobrazoval.<br \/>\n<br \/>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/yandex\/blog\/490140\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439. \u0418\u0437 \u043f\u043e\u0441\u0442\u0430 \u0432\u044b \u0443\u0437\u043d\u0430\u0435\u0442\u0435, \u043a\u0430\u043a \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0441\u0440\u0435\u0434\u0438 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f; \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0435 \u0440\u0430\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b (\u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0435\u0439 \u0438\u0437 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":71853,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-71852","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-28T17:59:58+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-03T13:14:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Jak pracujeme na kvalit\u011b a rychlosti v\u00fdb\u011bru doporu\u010den\u00ed | ProHoster","description":"Jmenuji se Pavel Parchomenko, jsem v\u00fdvoj\u00e1\u0159 strojov\u00e9ho u\u010den\u00ed. V tomto \u010dl\u00e1nku bych cht\u011bl popsat strukturu slu\u017eby Yandex Zen a pod\u011blit se o technick\u00e9 vylep\u0161en\u00ed, jeho\u017e implementace zv\u00fd\u0161ila kvalitu doporu\u010den\u00ed.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043d\u0430\u0434 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439 | ProHoster","og:description":"\u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041f\u0430\u0432\u0435\u043b \u041f\u0430\u0440\u0445\u043e\u043c\u0435\u043d\u043a\u043e, \u044f ML-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0431 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u042f\u043d\u0434\u0435\u043a\u0441.\u0414\u0437\u0435\u043d \u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u044f\u043c\u0438, \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0430\u0446\u0438\u0439.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-my-rabotaem-nad-kachestvom-i-skorostyu-podbora-rekomendaczij","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-28T17:59:58+00:00","article:modified_time":"2020-03-03T13:14:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"71852","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:55:28","updated":"2022-10-09 15:47:56","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/71852","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=71852"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/71852\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/71853"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=71852"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=71852"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=71852"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}