Разработка сервиса агрегации открытых данных и данных из социальных сетей

Обзор существующих решений на основе открытых данных. Технологии обработки данных и методы их визуализации. Социальные сети для извлечения данных. Ограничение географической локации. Выбор набора и формат хранения открытых данных, архитектура системы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 09.06.2017
Размер файла 129,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

</html>

MongoConfiguration.java

package com.alexcodes.common.config;

import com.mongodb.Mongo;

import com.mongodb.MongoClient;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Configuration;

import org.springframework.data.mongodb.config.AbstractMongoConfiguration;

import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@Configuration

@EnableMongoRepositories({"com.alexcodes.common.dao"})

public class MongoConfiguration extends AbstractMongoConfiguration {

@Value("${spring.data.mongodb.host}")

private String host;

@Value("${spring.data.mongodb.port}")

private int port;

@Value("${spring.data.mongodb.database}")

private String database;

@Override

protected String getDatabaseName() {

return database;

}

@Override

public Mongo mongo() throws Exception {

return new MongoClient(host, port);

}

}

GeoPost.java

package com.alexcodes.common.domain;

import com.google.common.base.MoreObjects;

import org.springframework.data.annotation.Id;

import java.time.Instant;

public class GeoPost {

@Id

public String id;

public SourceType sourceType;

public String text;

public Location location;

public Instant timestamp;

@Override

public String toString() {

return MoreObjects.toStringHelper(this)

.add("sourceType", sourceType)

.add("text", text)

.add("location", location)

.add("timestamp", timestamp)

.toString();

}

}

Location.java

package com.alexcodes.common.domain;

import com.google.common.base.MoreObjects;

public class Location {

public Type type;

public double longitude;

public double latitude;

public Location() {}

public Location(Type type, double longitude, double latitude) {

this.type = type;

this.longitude = longitude;

this.latitude = latitude;

}

@Override

public String toString() {

return MoreObjects.toStringHelper(this)

.add("longitude", longitude)

.add("latitude", latitude)

.toString();

}

public enum Type {

POINT, CITY

}

}

AppConfig.java

package com.alexcodes.twitter.config;

import com.twitter.hbc.core.endpoint.Location;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

@Configuration

public class TwitterConfig {

@Value("${twitter.location.southwest.longitude}")

private double southWestLongitude;

@Value("${twitter.location.southwest.latitude}")

private double southWestLatitude;

@Value("${twitter.location.northeast.longitude}")

private double northEastLongitude;

@Value("${twitter.location.northeast.latitude}")

private double northEastLatitude;

@Bean

public Location location() {

return new Location(

new Location.Coordinate(southWestLongitude, southWestLatitude),

new Location.Coordinate(northEastLongitude, northEastLatitude));

}

}

LocationExtractor.java

package com.alexcodes.twitter.logic;

import com.alexcodes.common.domain.Location;

import com.google.gson.JsonArray;

import com.google.gson.JsonElement;

import com.google.gson.JsonObject;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Service;

import java.util.ArrayList;

import java.util.List;

@Service

public class LocationExtractor {

private static final Logger log = LoggerFactory.getLogger(LocationExtractor.class);

private static final String COORDINATES = "coordinates";

private static final String PLACE = "place";

private static final String PLACE_TYPE = "place_type";

private static final String CITY = "city";

private static final String BOUNDING_BOX = "bounding_box";

private static final String TYPE = "type";

private static final String POLYGON = "Polygon";

public Location getLocation(JsonObject root) {

JsonElement coordinates = root.get(COORDINATES);

if (coordinates != null && !coordinates.isJsonNull())

return extractCoordinates(coordinates);

JsonElement place = root.get(PLACE);

if (place != null && !place.isJsonNull())

return extractPlace(place);

log.error("Cannot extract location from {}", root);

return null;

}

private Location extractCoordinates(JsonElement coordinates) {

JsonArray array = coordinates.getAsJsonObject().getAsJsonArray(COORDINATES);

double longitude = array.get(0).getAsDouble();

double latitude = array.get(1).getAsDouble();

return new Location(Location.Type.POINT, longitude, latitude);

}

private Location extractPlace(JsonElement place) {

String placeType = place.getAsJsonObject().get(PLACE_TYPE).getAsString();

JsonObject boundingBox = place.getAsJsonObject().getAsJsonObject(BOUNDING_BOX);

if (!placeType.equals(CITY)) {

log.warn("Unknown placeType: {}", placeType);

return null;

}

Point point = extractBoundingBox(boundingBox);

return new Location(Location.Type.CITY, point.longitude, point.latitude);

}

private Point extractBoundingBox(JsonObject boundingBox) {

String type = boundingBox.getAsJsonPrimitive(TYPE).getAsString();

switch (type) {

case POLYGON: {

JsonArray coordinates = boundingBox.getAsJsonArray(COORDINATES)

.get(0)

.getAsJsonArray();

List<Double> longs = new ArrayList<>(coordinates.size());

List<Double> lats = new ArrayList<>(coordinates.size());

for (int i = 0; i < coordinates.size(); i++) {

JsonArray point = coordinates.get(i).getAsJsonArray();

longs.add(point.get(0).getAsDouble());

lats.add(point.get(1).getAsDouble());

}

double avgLong = longs.stream()

.mapToDouble(Double::doubleValue)

.average()

.getAsDouble();

double avgLat = lats.stream()

.mapToDouble(Double::doubleValue)

.average()

.getAsDouble();

return new Point(avgLong, avgLat);

}

default:

log.error("Unknown format: {}", boundingBox);

return new Point(0.0, 0.0);

}

}

private static class Point {

public double longitude;

public double latitude;

public Point(double longitude, double latitude) {

this.longitude = longitude;

this.latitude = latitude;

}

}

}

PostConverter.java

package com.alexcodes.twitter.logic;

import com.alexcodes.common.domain.GeoPost;

import com.alexcodes.common.domain.SourceType;

import com.alexcodes.common.logic.PostConverter;

import com.google.gson.JsonElement;

import com.google.gson.JsonObject;

import com.google.gson.JsonParser;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import java.time.Instant;

import java.time.format.DateTimeFormatter;

@Service

public class TweetConverter implements PostConverter {

private static final String TEXT = "text";

private static final String CREATED_AT = "created_at";

private static final DateTimeFormatter formatter =

DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss Z yyyy");

private final LocationExtractor locationExtractor;

@Autowired

public TweetConverter(LocationExtractor locationExtractor) {

this.locationExtractor = locationExtractor;

}

@Override

public GeoPost convert(String message) {

JsonParser parser = new JsonParser();

JsonObject root = parser.parse(message).getAsJsonObject();

GeoPost post = new GeoPost();

post.sourceType = SourceType.TWITTER;

post.text = getText(root);

post.location = locationExtractor.getLocation(root);

post.timestamp = getTimestamp(root);

return post;

}

private String getText(JsonObject root) {

return root.getAsJsonPrimitive(TEXT).getAsString();

}

private Instant getTimestamp(JsonObject root) {

JsonElement createdAt = root.get(CREATED_AT);

if (createdAt == null) return null;

String timestamp = createdAt.getAsString();

return formatter.parse(timestamp).query(Instant::from);

}

}

PostProcessor.java

package com.alexcodes.twitter.logic;

import com.alexcodes.common.dao.GeoPostRepository;

import com.alexcodes.common.domain.GeoPost;

import com.alexcodes.common.logic.PostProcessor;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

@Service

public class TweetProcessor implements PostProcessor {

private static final Logger log = LoggerFactory.getLogger(TweetProcessor.class);

private final TweetConverter tweetConverter;

private final GeoPostRepository geoPostRepository;

@Autowired

public TweetProcessor(

TweetConverter tweetConverter,

GeoPostRepository geoPostRepository) {

this.tweetConverter = tweetConverter;

this.geoPostRepository = geoPostRepository;

}

@Override

public void process(String message) {

try {

GeoPost post = tweetConverter.convert(message);

log.debug("Tweet: {}", post);

geoPostRepository.save(post);

} catch (RuntimeException e) {

log.error("Exception during tweet processing:", e);

}

}

}

Listener.java

package com.alexcodes.twitter.service;

import com.alexcodes.twitter.logic.TweetProcessor;

import com.twitter.hbc.ClientBuilder;

import com.twitter.hbc.core.Client;

import com.twitter.hbc.core.Constants;

import com.twitter.hbc.core.Hosts;

import com.twitter.hbc.core.HttpHosts;

import com.twitter.hbc.core.endpoint.Location;

import com.twitter.hbc.core.endpoint.StatusesFilterEndpoint;

import com.twitter.hbc.core.event.Event;

import com.twitter.hbc.core.processor.StringDelimitedProcessor;

import com.twitter.hbc.httpclient.auth.Authentication;

import com.twitter.hbc.httpclient.auth.OAuth1;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.boot.CommandLineRunner;

import org.springframework.stereotype.Service;

import org.springframework.util.Assert;

import java.util.Collections;

import java.util.List;

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.LinkedBlockingQueue;

@Service

public class TwitterListener implements CommandLineRunner {

private static final Logger log = LoggerFactory.getLogger(TwitterListener.class);

private static final int QUEUE_SIZE = 1000;

@Value("${twitter.consumerKey}")

private String consumerKey;

@Value("${twitter.consumerSecret}")

private String consumerSecret;

@Value("${twitter.token}")

private String token;

@Value("${twitter.tokenSecret}")

private String tokenSecret;

@Value("${twitter.client.name}")

private String clientName;

private final Location location;

private final TweetProcessor tweetProcessor;

@Autowired

public TwitterListener(Location location, TweetProcessor tweetProcessor) {

Assert.notNull(location, "Location cannot be null");

Assert.notNull(tweetProcessor, "Cannot be null");

this.location = location;

this.tweetProcessor = tweetProcessor;

}

public void run(String... strings) throws Exception {

// Set up your blocking queues: Be sure to size these properly based on expected TPS of your stream

BlockingQueue<String> msgQueue = new LinkedBlockingQueue<>(QUEUE_SIZE);

BlockingQueue<Event> eventQueue = new LinkedBlockingQueue<>(QUEUE_SIZE);

// Declare the host you want to connect to, the endpoint, and authentication (basic auth or oauth)

Hosts hosebirdHosts = new HttpHosts(Constants.STREAM_HOST);

StatusesFilterEndpoint hosebirdEndpoint = new StatusesFilterEndpoint();

// Optional: set up some followings and track terms

List<Location> locations = Collections.singletonList(location);

hosebirdEndpoint.locations(locations);

// These secrets should be read from a config file

Authentication hosebirdAuth = new OAuth1(consumerKey, consumerSecret, token, tokenSecret);

ClientBuilder builder = new ClientBuilder()

.name(clientName)

.hosts(hosebirdHosts)

.authentication(hosebirdAuth)

.endpoint(hosebirdEndpoint)

.processor(new StringDelimitedProcessor(msgQueue))

.eventMessageQueue(eventQueue);

Client hosebirdClient = builder.build();

hosebirdClient.connect();

int i = 0;

long time = System.currentTimeMillis();

// on a different thread, or multiple different threads....

while (!hosebirdClient.isDone()) {

String message = msgQueue.take();

// log.debug("Receive: {}", message);

tweetProcessor.process(message);

i++;

// if (System.currentTimeMillis() - time > 60_000L) break;

}

log.info("{} TPS", i);

hosebirdClient.stop();

}

}

В общем виде взаимодействие компонентов системы можно представить на схеме (рис.1).

Рисунок 1. Архитектура системы

ГЛАВА 3. РЕЗУЛЬТАТЫ

3.1 ОПИСАНИЕ И АНАЛИЗ ПОЛУЧЕННЫХ РЕЗУЛЬТАТОВ

После проведенного анализа предметной области и реализации системы, был разработан сервис агрегации открытых данных и данных из социальных сетей. В его основе легла техника визуализации данных с помощью тепловой карты. Сервис имеет микросервисную архитектуру, что означает наличие нескольких независимых программных модулей, работающих параллельно и составляющих единую систему.

Общий вид сервиса представляет собой веб-сайт, центральной сущностью которого является тепловая карта активности пользователей социальных сетей. Стоит отметить, что практическую значимость сервиса сложно переоценить. Карта может показывать, какие участки города Москвы чаще всего оказываются в центре внимания среди пользователей социальных сетей. Глядя на карту, можно сказать, какие достопримечательности и объекты всегда пользуются спросом, по количеству сообщений и постов с меткой о расположении, сделанных в этих местах. Еще одним применением сервиса может быть выявление явных статистических отклонений от среднего количества сообщений в каждом конкретном объекте из набора открытых данных. Разберем подробнее этот способ на примере праздника Дня победы 9 мая. На этом случае стоит остановиться, поскольку он является наглядным примером того, как визуализация данных помогает выявлять резкие всплески активности пользователей. На рис. 3 изображена активность пользователей социальных сетей 9 мая 2017 года в период с 22:00 до 23:59. На изображении четко видно, что в «Парке Победы» на Поклонной горе было сделано множество постов в социальных сетях. Это объясняется тем, что городские власти в честь праздника устраивали салют в нескольких точках Москвы, в частности в этом месте.

Скорее всего, данный всплеск активности связан с тем, что люди хотели запечатлеть салют в честь Дня Победы и поделиться своим постом со своими друзьями в сети. Тем не менее, это стоит проверить. На следующий день, 10 мая, ровно в точно такой же временной период было установлено, что количество сообщений с географической меткой из этого места было в 17 раз меньше. Дело в том, что, судя по собранным данным, это обычная активность в это время суток в этом месте. Количество постов здесь колеблется в среднем от 30 до 50 единиц. Вероятнее всего, москвичи и гости столицы делятся здесь впечатлениями непосредственно о самом парке. В случае же салюта, такое событие собирает множество людей, но интерес для них представляет не сам парк, а именно особенное событие в нем.

Еще одним способом применения данного сервиса является тот факт, что его можно использовать для выявления корреляции активности пользователей с месторасположением объектов из набора открытых данных. Это можно объяснить на примере парков и скверов. В Москве существуют более 650 официальных парковых территорий. Из них лишь несколько являются действительно крупными и популярными среди посетителей. В частности, к ним можно отнести ЦПКиО им. Горького и Измайловский парк, которые ежедневно собирают в себе тысячи людей. Тем не менее, для проявления пользовательской активности важен не размер парковых территорий, а то, какие впечатления можно оттуда вынести. Так, парк Царицыно ежедневно открыт для всех посетителей. Судя по тепловой карте сервиса и среднему значению количества сообщений, он вызывает больше эмоций, нежели Измайловский парк. Скорее всего, это вызвано тем, что там располагается красивый и ухоженный пруд, а также Большой дворец, который изначально был спроектирован для царицы в 18 веке, а сейчас является музеем. Очевидно, наличие таких отличительных особенностью привлекает посетителей, а также вызывает у них желание поделиться своими фотографиями или мыслями на этот счет. В этом случае сервис даст понять, какие парки и скверы люди находя наиболее интересными. С другой стороны, это также дает понимание менее популярным паркам, что для того, чтобы там было больше посетителей и пользовательской активности, необходимо завлекать людей с помощью необычных арт-объектов, памятников и прочих заслуживающих внимания вещей.

Более того, разработанный сервис позволяет изучать такое понятие, как сезонность. Дело в том, что пользователи проявляют свою активность в социальных сетях крайне неравномерно по времени и по месторасположению. Разберем этот случай на примере тех же парков и скверов. Рассматривая суточную сезонность на тепловой карте, можно заметить, что количество постов в парках в ночное и утреннее время крайне мало. В то время как это количество постепенно возрастает в течение дня, вечером оно достигает своего суточного максимального значения и к ночи опять идет на спад. Тем не менее, существует еще и недельная сезонность, которая во многом появляется из-за наличия будних и выходных дней. Стоит отметить, что пользовательская активность в выходные дни значительно превышает в остальные дни. Такая сезонность обусловлена тем, что множество людей в свободные от работы или учебы дни посещают различного рода заведения или парки, где можно отдохнуть и весело провести время. Таким образом, можно сказать, что сервис способен также и выявлять сезонность пользовательской активности среди объектов из набора открытых данных.

3.2 ОБОБЩЕНИЕ РЕЗУЛЬТАТОВ И ПРАКТИЧЕСКИЕ РЕКОМЕНДАЦИИ

Помимо выполнения всех поставленных задач, попутно были решены также и задачи, которые не были поставлены изначально. К ним относятся такие результаты, которые вытекают из выбора гибких и современных технологий, которым сейчас стараются придерживаться многие передовые корпорации. Речь идет о кроссплатформенной разработке, а именно о языке программирования Java. За счет использования этого языка в создании сервиса, удалось достичь независимости от платформы, на котором необходимо развертывать приложения. Благодаря этому, становится возможным запускать сервис на любой операционной системе, где была предустановлена виртуальная машина JRE (Java Runtime Environment). Помимо этого, микросервисная архитектура позволяет выделять отдельные независимые программные компоненты. Из этого следует, что каждый программный модуль может быть запущен более чем в одном экземпляре. Таким образом, становится возможным горизонтальное масштабирование системы. Другими словами, с ростом количества посетителей на сайт или с ростом количества сообщений из социальных сетей можно почти линейно увеличивать вычислительные мощности. Более того, из-за того, что в системе выделены отдельные модули, становится простым процесс их контейнеризации. В качестве этой технологии можно выбрать самый популярный фреймворк для создания и запуска контейнером - Docker. Все это сделало данных сервис более гибким к развертыванию и устойчивым к нагрузкам, что является важной деталью для систем мониторинга в реальном времени.

На данный момент в сервисе реализованы клиенты для двух социальных сетей: Twitter и Instagram. Это одни из самых популярных на сегодняшний день платформ в мире. Они имеют развитый и технически сложный программный интерфейс, позволяющие выстраивать гибкие запросы к своим базам данных. Интеграция с другими сетями была осложнена рядом факторов, которые ранее уже были описаны в данной работе. Тем не менее, ограничение клиентов было вызвано только ограничением по времени написания сервиса. Стоит отметить, что количество клиентов под разные социальные сети является хорошей точкой роста и развития для сервиса. Дело в том, что чем больше сообщений будет обрабатывать и сервис агрегации, тем точнее должна получаться визуализация активности пользователей. В последствие можно будет добавить другие социальные сети, например, мирового лидера в лице Facebook и более успешного игрока на российском рынке - Вконтакте.

Использование современных технологий разработки оставляет возможность для расширения функционала. Есть масса идей, которые позволят качественно улучшить сервис и развить в нем свой потенциал. Каждый день или любой другой отрезок времени отслеживать, где пользователи наиболее активно себя проявляют в социальных сетях. Далее с помощью загруженных наборов открытых данных можно сопоставлять их географическое положение и определять, какой объект является самым популярным на это время. Это может послужить своего рода рекомендательной системой для отслеживания трендов посещений пользователями различных заведений, музеев или выставок.

3.3 НОВИЗНА И ПРАКТИЧЕСКАЯ ЗНАЧИМОСТЬ ИССЛЕДОВАНИЯ

Отличительной особенностью среди всех сервисов на основе открытых данных является тот факт, что визуализация информации является динамической. Это достигается за счет агрегации потоков данных из социальных сетей в реальном времени. Недостатком сервисов, которые основываются только лишь на открытых данных, является их редкое обновление на порталах. Как правило, такие наборы данных статические и модифицируются крайне редко. Это влечет за собой такие последствия, как проблемы с удержанием интернет аудитории у веб-ресурса. Большинство пользователей, которые заходят на подобные сайты, редко возвращаются или пользуются им повторно. Это объясняется тем, что сервис был спроектирован таким образом, чтобы обратить внимание на какую-либо проблему или явление. После того, как люди, пришедшие на интернет портал, изучили поднятый вопрос, необходимость в нем сразу отпадает. Примером может послужить проект, участвовавший в хакатоне по открытым данным. Проект заключается в том, чтобы показать общественности и властям, что некоторые велодорожки были проложены не там, где движутся велосипедисты в реальной жизни. Такие проекты можно считать одноразовыми, поскольку они полностью статичны. После посещения такого сайта интерес к данной теме теряется, а в случае повторного посещения ресурса пользователь не обнаружит ничего нового.

Иначе дело обстоит с сервисом агрегации данных. Дело в том, что сама природа социальных сетей автоматически избавляет данный сервис от подобных недостатков. Благодаря тому, что все наполнение сетей целиком и полностью генерируется пользователями, такая экосистема сразу становится динамической. Соответственно, все сервисы, которые используют пользовательскую активность в своей работе, также становятся динамическими. Все это ведет к тому, что в каждый момент времени состояние сервиса уникально. Именно это и дает преимущество перед статическими веб ресурсами, ограниченных определенным набором открытых данных. Дело в том, что с точки зрения пользователей гораздо выше вероятность повторного посещения подобного рода сайтов, поскольку они не знают наверняка, что там увидят. Изучение активности пользователей в привязке к наборам открытых данных теперь может быть растянуто по времени. Другими словами, можно выявлять значимые тренды поведения пользователей в социальных сетях, определять связь между местами скопления пользователей и объектами города, такими как парки, скверы, места общественного питания и прочие. На момент написания работы разработанный сервис не имеет аналогов.

ЗАКЛЮЧЕНИЕ

В результате выполнения выпускной квалификационной работы был реализован сервис агрегации открытых данных и данных из социальных сетей. При этом была достигнута основная цель данной работы. Стоит отметить, что автором были решены все поставленные задачи. Данная система состоит из ряда отдельных независимых модулей, выполненных согласно микросервисной архитектуре. Это клиенты под каждую поддерживаемую социальную сеть, адаптеры для конвертации сообщений в единый универсальный формат, сервис базы данных и веб-сервер для предоставления доступа к данным пользователю. Сервис представляет собой веб-сайт, который можно использовать с помощью браузера. Разработанный программный комплекс, сочетающий в себе средства для визуализации и агрегации открытых данных и данных из социальных сетей, не имеет аналогов на момент написания данной работы.

Главной особенностью данного проекта является тот факт, что с помощью сервиса можно выявлять зависимости между географическим положением пользовательской активности, ее интенсивностью и объектами из набора открытых данных. Так, благодаря интуитивно понятной визуализации вышеперечисленных данных, можно анализировать места скопления людей, которые являются пользователями социальных сетей. С помощью данного сервиса можно выявлять закономерности в расположении объектов города, например парков и музеев, и пользовательской активностью. Благодаря ему можно понять, какие места пользуются спросом у людей, а какие являются непопулярными. Например, каким паркам, помимо ухода за территорией, стоит обратить внимание на наполнение запоминающимися объектами. К ним можно отнести арт-объекты или памятники. Все это будет вести к повышению вовлеченности посетителей, что в свою очередь приведет к их желанию поделиться своими впечатлениями со своими друзьями и знакомыми в социальных сетях. Более того, данный сервис поможет выявить такое явление как сезонность. Такая информация может быть полезна во многих сферах жизни, например, представителям рекламных агентств или сетей общественного питания.

Также следует обратить внимание, что в связи с использованием самых современных инструментов и технологий индустрии разработки программного обеспечения, разработанный сервис получился очень гибким в плане поддержки и развертывания. Дело в том, что система является независимой от платформы. Другими словами, она может выполняться на любой операционной системе, где есть виртуальная машина Java. Также в виду использования микросервисной архитектуры, отдельные независимые сервисы легко поддаются контейнеризации. Такой подход сейчас стараются поддерживать все передовые корпорации, занимающиеся разработкой программного обеспечения и облачными технологиями. Самым распространенным способом является использование технологии Docker, позволяющей без проблем производить горизонтальное масштабирование приложений и удобное администрирование систем.

Несмотря на то, что сервис представляет собой готовый к использованию программный продукт, существует несколько способов для его улучшения. В первую очередь, в систему может быть добавлена автоматическая рекомендательная система, которая способна распознавать тренды активности пользователей в социальных сетях, сопоставлять с наборами открытых данных и делать выводы о том, какие места в данный момент пользуются популярностью. Также стоит отметить, что с помощью добавления в систему новых клиентов для других социальны сетей, точность работы сервиса должна увеличиться. Это можно объяснить тем, что такая тепловая карта будет еще более показательная, а визуализация даст наиболее полную картину. Таким образом, у проекта существует потенциал для развития и роста.

СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ

1. Boyd D., Ellison N.B. Social Network sites: Definition, history and scholarship // Journal of Computer-Mediated Communication, 2011, №11.

2. Chan Y. “A Distributed Stream Library for Java 8,” Ph.D. dissertation, University of York, 2016.

3. Chowdhury M., Zaharia M., Stoica I., Performance and Scalability of Broadcast in Spark. 2010.

4. Dewire D.T. Client-server computing. McGrawHill, Singapore, 1993.

5. Digital Fuel of the 21st Century: Innovation through Open Data and the Network Effect, Harvard University, 2011.

6. Eur-Lex, Open data An engine for innovation, growth and transparent governance, 2011.

7. Google Maps Documentation [Электронный ресурс] // URL:https://developers.google.com/maps/documentation (Дата обращения 02.03.2017).

8. Grosso W. Java RMI. First Edition. O'Reilly and Associates, USA, 2001.

9. Kumar K., Liu J., Lu Y., Bhargava B., “A survey of computation offloading for mobile systems,” Mobile Networks and Applications, vol. 18, no. 1, pp. 129-140, 2013.

10. Lahiri M., Berger-Wolf T., “Mining Periodic Behavior in Dynamic Social Networks,” Proceedings of the 8th IEEE Inter-national Conference on Data Mining, 2008, pp. 373-382.

11. Microservices [Электронный ресурс] // URL: http://microservices.io/patterns/microservices.html (Дата обращения 20.04.2017).

12. O'Reilly T., What Is Web 2.0 [Электронный ресурс] // URL: http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html (Дата обращения 16.02.2017).

13. Open Data Incubator Europe [Электронный ресурс] // URL: https://opendataincubator.eu/ (Дата обращения 16.02.2017).

14. OpenData 500 [Электронный ресурс] // URL: http://www.opendata500.com/ (Дата обращения 16.02.2017).

15. OpenStreetMap [Электронный ресурс] // URL: https://www.openstreetmap.org/ (Дата обращения 02.03.2017).

16. Ricardo T., Marco T.V., Roberto S.B. An approach for extracting modules from monolithic software architectures. Workshop, pages 1-18, 2012.

17. Scharl, A. Towards the Geospatial Web: Media Platforms for Managing Geotagged Knowledge Repositories. The Geospatial Web Geobrowsers, Social Software and the Web 2.0 are Shaping the Network Society (pp. 3-14). London: Springer, 2007.

18. Twitter Developer Documentation [Электронный ресурс] // URL: https://dev.twitter.com/overview/api/tweets (Дата обращения 18.04.2017).

19. Venner J., Pro Hadoop. Apress, June 22, 2009.

20. Wang G., Xiong Y., Yun J., Cavallaro J. “Accelerating computer vision algorithms using OpenCL framework on the mobile GPU--a case study,” in Proceedings of the 38th IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP '13), IEEE, Vancouver, Canada, May 2013.

21. Бегтин И.В. Проблема открытых данных в России // Земля из космоса. 2011. №11. С.20-25.

22. Борисенко О.Д., Турдаков Д. Ю., Кузнецов С. Д., Автоматическое создание виртуальных кластеров Apache Spark в облачной среде OpenStack. Труды Института системного программирования РАН, том 17, 2009 г. Стр 31-50.

23. Катков Е.В., Сорочайкин А.Н. Моедирование процессов инновационного развития предприятий // Вестник Самарского государственного университета. 2012. №10. С.33-39.

24. Остервальдер А., Пинье И. Построение бизнес-моделей. Настольная книга стратега и новатора. -- М.: Альпина Паблишер, 2011.

25. Открытые государственные финансовые данные [Электронный ресурс] // URL: http://budgetapps.ru (Дата обращения 16.02.2017).

26. Парамонов В., ГОС: Объем информации в интернете удваивается каждые полтора года [Электронный ресурс] // URL: http://www.newsland.ru/news/detail/id/367158/ (Дата обращения 15.02.2017).

27. Портал открытых данных правительства Москвы [Электронный ресурс] // URL: https://data.mos.ru/ (Дата обращения 18.04.2017).

28. Портал открытых данных Российской Федерации [Электронный ресурс] // URL: http://data.gov.ru/ (Дата обращения 18.04.2017).

29. Хакатон портала открытых данных data.gov.ru [Электронный ресурс] // URL: http://data.gov.ru/hackathon (Дата обращения 16.02.2017).

30. Число пользователей Facebook превысило 1,71 миллиарда [Электронный ресурс] // URL: https://rg.ru/2016/07/28/chislo-polzovatelej-facebook-prevysilo-171-milliarda.html (Дата обращения 16.02.2017).

31. Что такое открытые данные? [Электронный ресурс] // URL: https://opengovdata.ru/definition/ (Дата обращения 16.02.2017).

32. Яндекс. API карт. Документация. [Электронный ресурс] // URL: https://tech.yandex.ru/maps/doc/jsapi/2.1/quick-start/tasks/quick-start-docpage/ (Дата обращения 02.03.2017).

Размещено на Allbest.ru


Подобные документы

  • Обзор существующих решений на основе открытых данных. Выбор социальных сетей для извлечения данных. Ограничение геолокации сообщений из социальных сетей. Разработка формата хранения. Визуализация собранных данных методом теплой карты. Архитектура системы.

    дипломная работа [1,0 M], добавлен 18.11.2017

  • Определение базы данных и банков данных. Компоненты банка данных. Основные требования к технологии интегрированного хранения и обработки данных. Система управления и модели организации доступа к базам данных. Разработка приложений и администрирование.

    презентация [17,1 K], добавлен 19.08.2013

  • Открытые данные - машиночитаемые данные доступные для широкого круга лиц. Государство - один из самых больших потенциальных генераторов данных в сеть. Некоммерческие международные и российские негосударственные проекты, посвящённые открытым данным.

    реферат [667,0 K], добавлен 25.12.2012

  • Концепции хранилищ данных для анализа и их составляющие: интеграции и согласования данных из различных источников, разделения наборов данных для систем обработки транзакций и поддержки принятия решений. Архитектура баз для хранилищ и витрины данных.

    реферат [1,3 M], добавлен 25.03.2013

  • Изучение существующих методов и программного обеспечения для извлечения числовых данных из графической информации. Программное обеспечение "graphtrace", его структура и методы обработки данных. Использование этой системы для данных различного типа.

    дипломная работа [3,9 M], добавлен 06.03.2013

  • Обзор рынка мобильных приложений, социальных сетей, аналогов. Обзор инструментов разработки: Android Studio, Microsoft visual С# 2012, PostgreeSQL, API Открытых данных Вологодской области, API Социальных сетей. Программный код, разработка интерфейса.

    дипломная работа [2,6 M], добавлен 10.07.2017

  • Уровневая архитектура компьютерных ресурсов CMS. Поток данных от детекторов для анализа. Сокращение размера событий: CMS форматы данных и форматы Тир-данных. Иерархия CMS данных. Средства удаленной работы на LINUX машинах в CERN: PUTTY, WinSCP и Xming.

    курсовая работа [3,1 M], добавлен 17.02.2014

  • Основные понятия базы данных. Разработка сложной формы для обработки данных. Модели организации данных. Архитектура Microsoft Access. Реляционные связи между таблицами баз данных. Проектирование базы данных. Модификация данных с помощью запросов действий.

    лабораторная работа [345,5 K], добавлен 20.12.2011

  • Эволюция памяти компьютеров на основе оптических носителей. Организация записи данных на компакт-диски. Локальные компьютерные сети. Формат кадра технологии Ethernet. Многоуровневая модель взаимодействия открытых систем ISO/OSI. Прикладные протоколы.

    курсовая работа [988,0 K], добавлен 02.12.2012

  • Особенности организации передачи данных в компьютерной сети. Эталонная модель взаимодействия открытых систем. Методы передачи данных на нижнем уровне, доступа к передающей среде. Анализ протоколов передачи данных нижнего уровня на примере стека TCP/IP.

    курсовая работа [1,0 M], добавлен 07.08.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.