Contra el coronavirus, la inteligencia… artificial
// ------------------------------------------------------------------------------------------------------------------------------- // PHOTOSWIPE
var initPhotoSwipeFromDOM = function(gallerySelector) {
// parse slide data (url, title, size ...) from DOM elements // (children of gallerySelector) var parseThumbnailElements = function(el) { var thumbElements = el.childNodes, numNodes = thumbElements.length, items = [], figureEl, linkEl, size, item;
for(var i = 0; i < numNodes; i++) {
figureEl = thumbElements[i]; //
// include only element nodes if(figureEl.nodeType !== 1) { continue; }
linkEl = figureEl.children[0]; // element
size = linkEl.getAttribute('data-size').split('x');
// create slide object item = { src: linkEl.getAttribute('href'), w: parseInt(size[0], 10), h: parseInt(size[1], 10) };
if(figureEl.children.length > 1) {
//
if(linkEl.children.length > 0) {
// thumbnail element, retrieving thumbnail url
item.msrc = linkEl.children[0].getAttribute('src');
}
item.el = figureEl; // save link to element for getThumbBoundsFn items.push(item); }
return items; };
// find nearest parent element var closest = function closest(el, fn) { return el && ( fn(el) ? el : closest(el.parentNode, fn) ); };
// triggers when user clicks on thumbnail var onThumbnailsClick = function(e) { e = e || window.event; e.preventDefault ? e.preventDefault() : e.returnValue = false;
var eTarget = e.target || e.srcElement;
// find root element of slide var clickedListItem = closest(eTarget, function(el) { return (el.tagName && el.tagName.toUpperCase() === 'FIGURE'); });
if(!clickedListItem) { return; }
// find index of clicked item by looping through all child nodes // alternatively, you may define index via data- attribute var clickedGallery = clickedListItem.parentNode, childNodes = clickedListItem.parentNode.childNodes, numChildNodes = childNodes.length, nodeIndex = 0, index;
for (var i = 0; i < numChildNodes; i++) { if(childNodes[i].nodeType !== 1) { continue; } if(childNodes[i] === clickedListItem) { index = nodeIndex; break; } nodeIndex++; } if(index >= 0) { // open PhotoSwipe if valid index found openPhotoSwipe( index, clickedGallery ); } return false; };
// parse picture index and gallery index from URL (#&pid=1&gid=2) var photoswipeParseHash = function() { var hash = window.location.hash.substring(1), params = {};
if(hash.length < 5) { return params; } var vars = hash.split('&'); for (var i = 0; i < vars.length; i++) { if(!vars[i]) { continue; } var pair = vars[i].split('='); if(pair.length < 2) { continue; } params[pair[0]] = pair[1]; } if(params.gid) { params.gid = parseInt(params.gid, 10); } return params; }; var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) { var pswpElement = document.querySelectorAll('.pswp')[0], gallery, options, items; items = parseThumbnailElements(galleryElement); // define options (if needed) options = { // define gallery index (for URL) galleryUID: galleryElement.getAttribute('data-pswp-uid'), getThumbBoundsFn: function(index) { // See Options -> getThumbBoundsFn section of documentation for more info var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail pageYScroll = window.pageYOffset || document.documentElement.scrollTop, rect = thumbnail.getBoundingClientRect();
return {x:rect.left, y:rect.top + pageYScroll, w:rect.width}; }
};
// PhotoSwipe opened from URL if(fromURL) { if(options.galleryPIDs) { // parse real index when custom PIDs are used // http://photoswipe.com/documentation/faq.html#custom-pid-in-url for(var j = 0; j < items.length; j++) { if(items[j].pid == index) { options.index = j; break; } } } else { // in URL indexes start from 1 options.index = parseInt(index, 10) - 1; } } else { options.index = parseInt(index, 10); } // exit if index not found if( isNaN(options.index) ) { return; } if(disableAnimation) { options.showAnimationDuration = 0; } // Pass data to PhotoSwipe and initialize it gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options); gallery.init(); }; // loop through all gallery elements and bind events var galleryElements = document.querySelectorAll( gallerySelector ); for(var i = 0, l = galleryElements.length; i < l; i++) { galleryElements[i].setAttribute('data-pswp-uid', i+1); galleryElements[i].onclick = onThumbnailsClick; } // Parse URL and open gallery if it contains #&pid=3&gid=1 var hashData = photoswipeParseHash(); if(hashData.pid && hashData.gid) { openPhotoSwipe( hashData.pid , galleryElements[ hashData.gid - 1 ], true, true ); } }; // execute above function initPhotoSwipeFromDOM('.my-gallery'); // ====================================== // FIN SCRIPTS PHOTOSWIPE // ======================================
Mencionada como ingrediente para la creación de los videos manipulados conocidos como deepfakes, o como herramienta para manipular conductas sociales mediante la recolección de datos personales, esta vez se le ha señalado como actor clave para detectar la emergencia sanitaria del momento.
La información la dio a conocer el sitio web de la revista Wired. Una nota firmada por Eric Niiler revela que un algoritmo de la firma canadiense BlueDot anunció antes que nadie la existencia del coronavirus 2019nCoV.
BlueDot, de acuerdo con Wired, rastrea informes de noticias y datos sobre boletos aéreos. De esta forma puede advertir a sus clientes –gobiernos de varios países y empresas– sobre el advenimiento de nuevos padecimientos. Así como los probables sitios donde tenderían a propagarse.
Se trata, una vez más, del empleo del llamado “big data”. Esto es, la búsqueda de información relevante en medio de millones y millones de datos dispersos, aparentemente inconexos.
Entre la información que rastrea están informes de noticias en al menos 65 idiomas. También redes de datos sobre enfermedades de animales y plantas, y comunicados oficiales para anticipar a sus suscriptores de evitar zonas de riesgo.
Redes confusas
Un mérito aparte de BlueDot es que sólo toma para su análisis información de fuentes verificadas y no la de redes sociales, a las que considera confusas.
Su as bajo la manga, relata Wired, es tener acceso a los datos globales de emisión de boletos de aerolíneas, clave para predecir hacia dónde se dirigirán los infectados, y cuándo. Gracias a ese análisis, pronosticó correctamente que el virus saltaría de Wuhan a Bangkok, Seúl, Taipei y Tokio.
Wired destaca la anticipación con la que la firma canadiense informó sobre el coronavirus. Mientras la Organización Mundial de la Salud lo dio a conocer el 9 de enero y las autoridades sanitarias estadunidenses lo había anticipado tres días antes, BlueDot ya había notificado del brote a sus clientes el pasado 31 de diciembre.
“Mientras las enfermedades infecciosas se propagan rápidamente, el conocimiento puede propagarse aún más rápido”, presume BlueDot en su página web.
Su presentación alerta de cómo las enfermedades infecciosas son una amenaza planetaria que florece dentro de una nueva realidad de viajes globales, urbanización y cambio climático.
No lo dice textualmente, pero bien podría añadir “contexto geopolítico”.
Y es que buena parte del mérito del algoritmo fue haber alertado de un brote surgido justo en China, que no cuenta precisamente con la mayor reputación en materia de compartir información con el resto de los países, sobre todo en lo referente a enfermedades, contaminación o desastres naturales.
"Sabemos que no se puede confiar en que los gobiernos proporcionen información de manera oportuna", dijo a Wired Kamran Khan, fundador y CEO de BlueDot, y quien trabajó como especialista en enfermedades infecciosas en un hospital en Toronto cuando ocurrió la epidemia de SARS de 2003.
Aprender a discriminar
Por supuesto, parte de la “inteligencia” con la que funciona su maquinaria consiste en aprender consistentemente a discriminar información relevante de entre el océano de notas que selecciona.
Así ha sido capaz de reconocer entre un brote de ántrax y un concierto de la banda de rock Anthrax, relata el propio Khan.
Aún está por verse si el método de BlueDot resulta ser más consistente que su antecesor en el uso del big data: Google Flu Trends.
Aquella herramienta, que saltó a la fama en 2009 gracias a un artículo de la revista Nature, aparentaba dar datos muy precisos sobre incidencia de influenza analizando las búsquedas de la gente en internet.
Y así ocurrió al principio. Sin embargo, al cabo de unos años los datos que arrojó Google Flu Trends fueron completamente dispares de los reales, obtenidos por métodos más tradicionales.
En su momento, la empresa de Mountain View atribuyó la falla a la propia fama de ese programa. Conforme el público lo fue utilizando más, el número y variedad de búsquedas terminó por distorsionar los resultados. Al final, el proyecto fue cancelado en 2015.
Como sea, la inteligencia artificial ya se apuntó un triunfo advirtiendo del brote. Depende ahora de la inteligencia humana que no se propague.
Comentarios
// Obtener todos los elementos con clase .col-md-12 var colElements = document.querySelectorAll('.col-md-12');
// Iterar sobre cada elemento colElements.forEach(function(element) { // Verificar si tiene un hijo inmediato con clase .titulo-region var tituloRegion = element.querySelector('.titulo-region');
if (tituloRegion) { // Agregar la clase .is-sticky al elemento padre element.classList.add('is-sticky'); } });
// Obtener el elemento article dentro de .fila-especial-v2 .p50 var articleElement = document.querySelector('.home .fila-especial-v2 .p50 article');
// Obtener el texto del elemento .z-foto .bajada p var bajadaText = articleElement.querySelector('.z-foto .bajada p').textContent;
// Crear un nuevo elemento para mostrar el texto obtenido var textoElement = document.createElement('p'); textoElement.textContent = bajadaText;
// Obtener el elemento .z-txt .titulo dentro del article var tituloElement = articleElement.querySelector('.z-txt .titulo');
// Insertar el nuevo elemento al final del article articleElement.appendChild(textoElement);
Cortesía de Proceso.
Dejanos un comentario: