<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Paolo Genta on Medium]]></title>
        <description><![CDATA[Stories by Paolo Genta on Medium]]></description>
        <link>https://medium.com/@paologenta?source=rss-e229cf868246------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*3heXFjVq1Uzpg1f4.</url>
            <title>Stories by Paolo Genta on Medium</title>
            <link>https://medium.com/@paologenta?source=rss-e229cf868246------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Thu, 28 May 2026 12:17:11 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@paologenta/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Conde Nast genius() project]]></title>
            <link>https://medium.com/@paologenta/conde-nast-genius-project-807c019f5622?source=rss-e229cf868246------2</link>
            <guid isPermaLink="false">https://medium.com/p/807c019f5622</guid>
            <category><![CDATA[aws-lambda]]></category>
            <category><![CDATA[aws-kinesis]]></category>
            <category><![CDATA[genius]]></category>
            <category><![CDATA[rekognition]]></category>
            <category><![CDATA[conde-nast]]></category>
            <dc:creator><![CDATA[Paolo Genta]]></dc:creator>
            <pubDate>Mon, 08 Oct 2018 13:24:37 GMT</pubDate>
            <atom:updated>2018-10-08T13:24:37.125Z</atom:updated>
            <content:encoded><![CDATA[<h4>This is an excerpt of the speech I had the opportunity to have at the last Amazon AWS Summit in Milano, during the Machine Learning session.</h4><p>In <a href="http://www.condenast.it"><em>Condé Nast Italy</em></a>, we have wondered many times how to improve people’s browsing experience on our websites.</p><p>How can we use the growing AI tools to provide an experience based not only on captivating visual effects but providing content with a better possibility of being read?</p><h4>CN.challange().engageUsers()</h4><p>To try to achieve answers to the above questions, we reviewed our website’s traffic and identified 4 macro-areas:</p><ol><li>Behaviors: understand the user’s behaviors on our websites, to better understand what users look like to read, how they move from an article to another. These type of analysis is for both logged or not logged users.</li><li>Clustering: Can we assign people to clusters of people, to understand how we can profile them?</li><li>Tailor made: content suggested for user’s real interest, better management of ADV formats based on navigation (how often you don’t even see an ADV because there is nothing to do with what you like?), personalized newsletters tools ( how often we trash newsletters just because of poor content? )</li><li>Prediction: tools to predict which is the best moment during the day to publish fresh content, based on past user’s navigation</li></ol><h3>CN.genius()</h3><p>Based on these four interesting challenges, we build the <strong>C</strong>onde <strong>N</strong>ast <strong>genius()</strong> project, with the aim of adding intelligence and Italian geniality to the Condé Nast sites, in an evolutionary way.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/487/1*kseP_AFRdwnPH_S20NMWSw.png" /><figcaption>CN.genius() logo</figcaption></figure><p><strong>CN.genius()</strong> is, in fact, a work in progress which will allow us to move from a common news site to a complex platform that interacts with the user, serving content that is tailored made for him, using the latest cutting-edge technologies.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xYrqR5DFTCFcc5NxBS_PRA.png" /><figcaption>Evolution of CN.genius() project</figcaption></figure><h4>CN.genius().showMobile()</h4><p>What is in the real word CN.genius()? Here are two examples:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/374/1*Ms3B7x7W8FTE1ytlKijMDA.png" /></figure><p>This red box appears on the desktop version of <a href="https://www.vanityfair.it">VanityFair website</a> if you miss it for some time. <br>And the content suggested is based on your previous site navigation. Let me explain.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/224/1*OIk_Ez_WWF-eo0q8TyEu3g.png" /></figure><p>Do you read a lot of content about music, new album releases or news about your beloved artist?<br>The A.I. powered box suggest you the best article based on your taste.</p><p>On the mobile version of the site, instead, scrolling an article you can find these amazing cards that you can fold.</p><p>The cards are a mix of personal suggestion, based on your previous browsing history, and suggestion based on the top viewed articles of the same article’s category, in the last hour.</p><p>Which is the process that brings us to these kinds of visual widgets? Let’s start from the beginning, with the basics.</p><h4>CN.analyze().overview()</h4><p>A user interacts with VanityFair reading articles, browsing image galleries, searching something interesting for him: we can sum-up the interaction in the following high level / self-drawing diagram.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/391/1*TyiPY9ALr8yvIDnH7dPXDg.png" /><figcaption>Attributes of a common article</figcaption></figure><p>Focusing on articles, the user experience is composed of a mix of text, images, videos, tags. Every user can browse the website following his own path: by category, for example, of following one particular author he really likes.</p><h4>CN.analyze().overview().addAI()</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/525/1*8cueWXVljUaxqoJBRA_Dkg.png" /><figcaption>Let’s add some A.I.</figcaption></figure><p>The set of attributes of a page are the basic ingredients for an A.I. engine that, by processing the data, can suggest to the user articles or navigation paths that may be related to him.</p><p>So we have the basic ingredients to let our user evolve , from a simple reader to a happy user!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/241/1*321rkutdnJyJCHjJsRrlIQ.png" /><figcaption>A user is happy if he gets better suggestion about what to read.</figcaption></figure><p>Let’s see how Amazon’s AWS infrastructure helped us to implement data collection and how we used their different A.I. engines to create the <strong>CN.genius()</strong> experience.</p><h4>CN.genius().user().idendity()</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/388/1*U3_KeFK0YBYZDOM_AVZ_Ow.png" /><figcaption>Let’s capture the clickstream data</figcaption></figure><p>We started from the user perspective, we need to identify our audience, in a strong and secure way, so we choose <a href="https://aws.amazon.com/cognito/">AWS Cognito</a>.</p><p>AWS Cognito gives us a unique UUID, base on a combination of machine and browser.</p><p>So, different browsers mean different UUID that we can eventually merge if the user will register or log in our platform.</p><h4>CN.genius().user().clickstream()</h4><p>All information on the page — article/photo gallery/video, for now on the user’s clickstream, with the addition of the anonymous AWS Cognito token — is sent to an <a href="https://aws.amazon.com/kinesis/data-streams/">AWS Kinesis Data Streams</a> that guarantees data ingestion without limits, matching the traffic’s peaks that every news site can have (e.g.: did you hear about the new royal wedding?)</p><p>The data now follow two paths: the first one move the data in a data lake, thanks to <a href="https://aws.amazon.com/kinesis/data-firehose/">AWS Kinesis Firehose</a>, for further analysis and for marketing department’s data visualization dashboards.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/654/1*J3Lw99tROLbMdwwLo1gG3A.png" /><figcaption>First clickstream path: from ingestion to S3 for further analysis and for marketing dashboards</figcaption></figure><h4>CN.genius().suggestedArticles()</h4><p>The second path is the real-time analysis of the data and their aggregation, thanks to the analysts performed by <a href="https://aws.amazon.com/kinesis/data-analytics/">AWS Kinesis Data Analytics</a>: for example, how many sports articles were seen in the last hour? How many news? <br>The analysis is done not a posteriori, but directly on the stream, that is persistent in AWS Kinesis Data Streams for 24 hours.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/724/1*Bt0F-nLC299A8sCcKisE4g.png" /><figcaption>Clickstream is analyzed bt Kinesis Data Analytics.</figcaption></figure><p>This type of data is then saved in a data lake and inserted into the machine learning engine, installed on an AWS EC2 machine with an AMAZON Deep Learning AMI.<br>The results of the elaboration are then moved into an instance of elastic search service, which guarantees very high performance and therefore, through an AWS Lambda written in NodeJS and the related API gateways, returned to the front end of the site.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/882/1*rM7EPIA54Kio-OjymUt24g.png" /><figcaption>The elaborated date are returned to the users if for of suggested articles.</figcaption></figure><h4>CN.genius().images()</h4><p>But there’s more than articles and text.<br>Images are a great asset for Condé Nast: we have more than 10M images in our digital asset management tool, indeed.<br>Often, however, the images are not tagged correctly or even they don’t have any tag at all (lack of time, mainly)!</p><p>Try to image a photographer at a catwalk that needs to upload a bulk quantity of images as quick as he can, he simply doesn’t have time to tag every image. And this is a problem, we lose this remarkable piece of information.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/877/1*cZW43eiWTNpKOXrrmqOZDA.png" /><figcaption>Image analysis workflow</figcaption></figure><p>We have therefore developed an image analysis system, to automatically tag every image in our database and give new tools to our editors.<br>All our images and galleries of images are stored on an AWS S3 bucket.</p><p>Every time we store an image, an AWS NodeJS Lambda function is triggered and pass the image to <a href="https://aws.amazon.com/rekognition/">AWS Rekognition</a>, the Machine Learning service that detects objects in images.</p><p>The answer is a JSON that contains all the identified tags and a value that is the confidence of the tagging accuracy (e.g.: 90% is a high confidence, 30% a poor one)<br>If among all tags there are some keywords that identify a human being, like “face” or “woman”, the Lambda triggers again AWS Rekognition to understand if that face belongs to a celebrity.</p><p>The final JSON is stored in our managed RDS <a href="https://aws.amazon.com/rds/aurora/">AWS Aurora</a> and, on top of this flow, we created some serverless application to give new tools to our editor.</p><p>The serverless applications are a mix of single page application, written with the help of <a href="https://vuejs.org/">Vue.js</a> and serverless backend <a href="https://aws.amazon.com/lambda/">AWS Lambda</a> function written in Node.js.</p><p>Here’s the first three of them:</p><h4>CN.genius().tagManager()</h4><p>Depending on the quality of the pictures and the way a shot is taken, sometimes AWS Rekognition can fail: it can confuse some objects with other or it’s possible that cannot recognize some new celeb.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*K4zqb02T43VBGTIUevMtZw.png" /><figcaption>Tags found in a picture (light ones are removed)</figcaption></figure><p>So we created a tool to add or remove tags from an image, in a conservative way. We do not overwrite the original tags but we sum it with our new one, to maintain our database as clean as possible.</p><h4>CN.genius().galleryManager()</h4><p>Another application is the galleryManager(), a real gallery creator: we can create on the fly a gallery, simply searching tag like “handbag” or “skirt” or searching some celebrity, like “Scarlett Johansson” or again, search for some famous stylist, like “Giorgio Armani”</p><p>With a simple drag&amp;drop, we can reorganize images or discard some of them (e.g.: we don’t want to show someone with an old fiance!) and then save the new gallery, that the Machine Learning engine can now suggest to users interested in that tag.</p><h4>CN.genius().automaticGalleryManager()</h4><p>The automaticGalleryManager() is an idea inherited from the previous galleryManager(). Every night we consolidate in a so-called ‘last items gallery’ the more recent images of every single celeb tagged in our RDS. CN.genius() can so sometimes serve to the users the latest gallery of his starred celeb.</p><p>There’s a lot of things left to do, mistakes to fix, new technology we can integrate into our workflow: a nice refactoring is on the right path at the moment… <br>Teaser: we’re working on a new Graph database, on a new Machine Learning engine and on some voice stuffs…</p><p>But I hope to show you better some of these changes in a not so far, next chapter…</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=807c019f5622" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>