Алгоритм работы - - Кубанский государственный

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
‹‹КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ››
(ФГБОУ ВПО ‹‹КубГУ››)
Кафедра вычислительных технологий
МУЛЬТИАГЕНТНАЯ СИСТЕМА АНАЛИЗА ПОЛЬЗОВАТЕЛЕЙ
СОЦИАЛЬНЫХ СЕТЕЙ. НАИВНЫЙ БАЙЕСОВСКИЙ
КЛАССИФИКАТОР.
Белевцев Д.А
Краснодар 2014
СОДЕРЖАНИЕ
ВВЕДЕНИЕ .................................................................................................................. 3
1 Определение агента.................................................................................................. 5
2 Понятие многоагентной системы ........................................................................... 9
3. Определение наивного байесовского классификатора. .................................... 10
3.1.Оценка параметров Байесовской модели. ..................................................... 11
3.2. Разработка наивного байесовского классификатора ................................... 12
4. Моделирование мультиагентной системы. ........................................................ 13
4.1 Описание классов пакета Agent ...................................................................... 15
4.1.1 Класс «Boss» ............................................................................................... 15
4.1.2 Класс «Getter» или «Загрузчик» ............................................................. 15
4.1.3 Класс «Analize» .......................................................................................... 16
4.1.4 Класс «Server» ............................................................................................ 16
4.1.5. Класс «Includer» ........................................................................................ 16
ЗАКЛЮЧЕНИЕ ......................................................................................................... 17
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ ............................................... 18
ПРИЛОЖЕНИЕ А.Код программы ......................................................................... 19
2
ВВЕДЕНИЕ
Наверное, не для кого уже не секрет, что «Всемирная паутина» (англ.
World Wide Web) с каждым днем набирают свою популярность. И с течением
времени только укрепляет свою позицию. Так, по данным ФОМ на июнь
2013 год доля интернет аудитории - это выходящие в Сеть хотя бы раз в
сутки составляет примерно 57% населения России. А годовой прирост составил около 11%[1]. И, в связи с растущей популярность «Всемирной паутины»
становятся всё популярнее и социальные сети. Среди них vk.com - самая популярная сеть в России, по данным ФОМ[1]. Месячное число посещений
примерно равно 50 миллионов пользователей. Также ежедневно публикуются
около 10 миллионов открытых сообщений, что делает социальные сети отличным инструментом для работы с определенными группами людей.
Также стоит отметить стремительное развитие распределенных систем,
которые становятся более удобными для использования для различных задач.
В связи с этим, было принято решение о разработке системы, которая была
бы распределена на некоторые абстрактные классы. И выбор пал на «Мультиагентные системы» (англ. Multi-Agent Systems).
Так как многоагентная система - это система, образованная несколькими взаимодействующими интеллектуальными агентами, то многоагентные
системы могут быть использованы для решения таких проблем, которые
сложно или невозможно решить с помощью одного агента или монолитной
архитектуры (англ. Monolithic architecture). Примерами таких задач являются
онлайн-торговля, ликвидация чрезвычайных ситуаций, и моделирование социальных структур[2].
Таким образом, объединив многоагентные системы и социальные сети,
мы можем получить мощный инструмент для моделирования социальных
структур и их анализа.
Целью представленной курсовой работы является разработка методов и
средств работы интеллектуальных агентов, взаимодействующих с социаль3
ными сетями, а также написание пакета методов для работы с сервисом
"Вконтакте", которые бы обеспечивали интеллектуального агента всей необходимой входной информацей для последующего анализа. Также в роли анализатора данных структур был выбрал наивный байесовский классификатор(англ. Naïve Bayes Classifier)
В ходе выполнения курсовой работы была разработана МАС, успешно получающая информацию из социальных сетей и обрабатывающей её для последующего анализа классификатором.
Для разработки данной мультиагентной системы били использованы следующие
инструменты
MadKit 5.0.2 - Java-библиотека, распространяемая , как проект с открытым исходным кодом и служащая для моделирования МАС с AGR (агент/группа/роль структурой; англ Agent/Group/Role) структурой. С помощь данной структуры агенты "играют" роли , образуя тем самым искусственное общество.
ApacheHttpComponents - Java-библиотека, используемая для отправки и
получение сообщений по протоколу TCP/IPс помощью http-postили httpgetзапросов.
GoogleJSON 2.2.4 - открытая Java-библиотека, распространяемая компанией Google и позволяющая значительно облегчить и ускорить обработку
файлов в формате JSON.
MySQL - свободная реляционная база данных. Служит для хранения
обучающей выборки для классификатора, также хранит данные для текущего
пользователя
JAX-RS - свободно распространяемая библиотека, которая позволяет
моделировать Restful WebService .
4
1 Определение агента
Общепринятого определения “агента” еще не существует. Рассматриваемый в какой-либо системе мультиагент – это аппаратная или программная
сущность, способная действовать в интересах достижения целей, поставленных перед ним владельцем и/или пользователем. Таким образом, в рамках
мультиагентных систем мы рассматриваем агенты, как автономные компоненты, действующие по определенному сценарию. Классифицируются агенты на четыре основных типа: простые, умные (smart), интеллектуальные(intelligent) и действительно интеллектуальные(truly intelligent)[8].
Интерес для построения МАС в задачах инженерии знаний представляют в большей степени интеллектуальные и действительно интеллектуальные агенты, которые отличаются тем, что поддерживают помимо автономного выполнения, взаимодействия с другими агентами и слежения за окружением – способность использовать абстракции, адаптивность поведения, обучение на прецедентах и толерантность к ошибкам.
Проблемы в создании МАС на принципах искусственного интеллекта
состоит в том, что при проектировании точной и полной модели представления мира, процессов и механизмов рассуждения в нем – очень тяжело создать
адекватную и полную картину мира. Несмотря на явные трудности, идея использовать агентов для решения разноплановых задач очень популярна в последнее время. Однако задача проектирования МАС и действительно интеллектуальных агентов требует специальных знаний и является ресурсоемкой
задачей.
При определении понятия «агент» удобно опираться на представления
об объекте, развитом школой объектно-ориентированного программирования
(ООП).Тогда искусственный агент может пониматься как метаобъект,
наделенный некоторой долей субъектности, т.е. способный манипулировать
другими объектами, создавать и уничтожать их, а также имеющий развитые
5
средства взаимодействия со средой и себе подобными. Иными словами, это
«активный объект» или «искусственный деятель», находящийся на заметно
более высоком уровне сложности по отношению к традиционным объектам в
ООП и использующий их для достижения своих целей путем управления,
изменяющего их состояния. Соответственно минимальный набор базовых
характеристик произвольного агента включает такие свойства как: а) активность, способность к организации и реализации действий; б) автономность
(полуавтономность), относительная независимость от окружающей среды
или наличие некоторой «свободы воли», связанное с хорошим ресурсным
обеспечением его поведения; в) общительность, вытекающая из необходимости решать свои задачи совместно с другими агентами и обеспечиваемая
развитыми протоколами коммуникации; г) целенаправленность, предполагающая наличие собственных источников мотивации, а в более широком
плане, специальных интенциональных характеристик.
Принято различать два определения интеллектуального агента - “слабое” и “сильное”[5].
Под интеллектуальным агентом в слабом смысле понимается программно или аппаратно реализованная система, которая обладает такими свойствами:
-автономность - способность ИА функционировать без вмешательства
человека и при этом осуществлять самоконтроль над своими действиями и
внутренним состоянием;
-общественное поведение (social ability) - способность функционировать в сообществе с другими агентами, обмениваясь с ними сообщениями с
помощью некоторого общепонятного языка коммуникаций;
-реактивность (англ reactivity) - способность воспринимать состояние
среды и своевременно отвечать (реагировать) на те изменения, которые в ней
происходят;
6
-про-активность (pro-activity) - способность агента брать на себя инициативу, т.е. способность генерировать цели и действовать рационально для
их достижения, а не только реагировать на внешние события.
Сильное определение агента подразумевает дополнительно к только что
перечисленным свойствам ряда дополнительных. В частности, главным из
них является наличиеу агента хотя бы некоторого подмножества так называемых “ментальных свойств”, называемых также интенсиональными понятиями, к которым относятся следующие:
-знания (англ knowledge) - это постоянная часть знаний агента о себе,
среде и других агентах, т.е. та часть, которая не изменяется в процессе его
функционирования;
-убеждения (англ beliefs, вера) - знания агента о среде, в частности, о
других агентах; это те знания, которые могут изменяться во времени и становиться неверными, однако агент может не иметь об этом информации и продолжать оставаться в убеждении, что на них можно основывать свои выводы;
-желания (англ desires) - это состояния, ситуации, достижение которых
по разным причинам является для агента желательным, однако они могут
быть противоречивыми и потому агент не ожидает, что все они будут достигнуты;
-намерения (англ intentions) - это то, что агент или обязан сделать в силу своих обязательств по отношению к другим агентам (ему “это” поручено и
он взял эту задачу на себя), или то, что вытекает из его желаний (т.е. непротиворечивое подмножество желаний, выбранное по тем или иным причинам,
и которое совместимо с принятыми на себя обязательствами);
-цели (англ goals) - конкретное множество конечных и промежуточных
состояний, достижение которые агент принял в качестве текущей стратегии
поведения;
7
-обязательства по отношению к другим агентам (commitments) - задачи, которые агент берет на себя по просьбе (поручению) других агентов в
рамках кооперативных целей или целей отдельных агентов в рамках сотрудничества.
Первые два из перечисленных понятий называют “позицией агента”,
его “точкой зрения” (англ attitudes), остальные характеризуют в англоязычной литературе общим термином “pro-attitude”, суть которого в том, что они
“направляют” поведение агента таким образом, чтобы сделать отвечающие
данному термину содержательные и формальные утверждения истинными.
Некоторые авторы считают, что агент должен обладать также рядом
других свойств. К ним относятся
-мобильность (англ mobility) - способность агента мигрировать по сети
в поисках необходимой информации для решения своих задач, при кооперативном решении задач совместно или с помощью других агентов и т.д.,
-благожелательность (англ benevolence) - готовность агентов помочь
друг другу и готовность агента решать именно те задачи, которые ему поручает пользователь, что предполагает отсутствие у агента конфликтующих целей;
-правдивость (англ veracity) - свойство агента не манипулировать информацией, про которую ему заведомо известно, что она ложна;
-рациональность (англrationality) - свойство агента действовать так,
чтобы достигнуть своих целей, а не избегать их достижения, по крайней мере, в рамках своих знаний и убеждений.
Можно заметить, что исследователи в области многоагентных систем
заходят очень далеко в проведении антропоморфного взгляда на интеллектуальных агентов. Это сходно с позицией первых исследователей в области искусственного интеллекта в 50-60-е годы.
8
Но в то же время, объекты не могут анализировать свое поведение,
определять характер своих связей с другими объектами или природу адресованных им сообщений. Их механизм получения сообщений сводится к вызову процедуры. А главное, они не могут самостоятельно формировать цели.
2 Понятие многоагентной системы
Понятие “многоагентной системы” является видом распределенного
искусственного интеллекта, которое рассматривает решение одной задачи
несколькими интеллектуальными подсистемами. При этом задача разбивается на несколько подзадач, которые распределяются между агентами. Еще
одной областью применения МАС есть обеспечение взаимодействия между
агентами, когда один агент может выработать запрос к другому агенту на
передачу некоторых данных или выполнение определенных действий. Также
в МАС есть возможность передавать знания. Построение программных систем по принципу МАС может бытьобусловлено следующими факторами:
так, некоторые предметные области применяют МАС в тех случаях, когда
логично будет каждого из участников процесса представить в виде агента.
Например, социальные процессы, в которых каждый из участников играет свою роль; параллельным выполнением задач, т.е. если предметная область легко представляется в виде совокупности агентов, то независимые задачи могут выполняться различными агентами; устойчивостью работы системы: когда контроль и ответственность за выполняемые действия распределены между несколькими агентами. При отказе одного агента система не
перестает функционировать. Таким образом, логично поместить агентов на
различных компьютерах; модульностью МАС, что позволяет легко наращивать и видоизменять систему, т.е. легче добавить агента, чем изменить свойства единой программы. Системы, которые изменяют свои параметры со
9
временем могут быть представлены совокупностью агентов. Модульность
обуславливает легкость программирования МАС.
3. Определение наивного байесовского классификатора.
Наивный байесовский классификатор - это простой вероятностный классификатор, основанный на применении теоремы Байса со строгими предположениями о независимости.
(1)
где,
P(c|d) - вероятность, что документ d принадлежит классу c;
P(d|c) - вероятность встретить документ d среди всех документов класса с;
P(с) - безусловная вероятность встретить документ класса с в корпусе документов;
p(d) - безусловная вероятность встретить документ d в корпусе документов.
Цель классификации состоит в том, чтобы понять к какому классу принадлежит
документ, для этого используется не сама вероятность, как мы её понимаем, а
наиболее вероятных класс.
Также байесовский классификатор использует оценку апостериорного максимума, как инструмент для определения наиболее вероятного класса.
(2)
Анализируя данный метод, мы приходим к выводу, что для получения максимальной вероятности, нужно рассчитать вероятность для каждого класса. Так
(3)
10
как знаменатель является константой, то он не может повлиять на результат,
ледовательно мы его игнорируем.
Вернемся
теперь
к
байесовскому
классификатору.
Как вы знаете, в натуральном языке вероятность появления слова сильно зависит от контекста. Но в тоже время байесовский классификатор представляет
документ как набор слов, вероятности которых условно не зависят друг от дру-
(4)
га. Данный подход называется (англ. bag of words model) . Исходя из этого
предположения условная вероятность документа аппроксимируется произведением условных вероятностей всех слов входящих в документ.
Представив эту модель в формулу 3, мы получим:
(4.1)
Рассматриваю данную модель, мы приходим к выводу, что при достаточной большой длине документа придется перемножать большое количество
очень маленьких чисел. Для того, чтобы при этом избежать арифметического
переполнения снизу будет использовать такое свойство логарифма, как
log(ab) = log(a) + log(b). Так как логарифм функция монотонная и её применение к двум частям выражения изменить только его численное значение, но не
параметры, при которых достигается максимум. Перепишем нашу формулу с
использованием логарифма.
(5)
3.1.Оценка параметров Байесовской модели.
Оценка вероятностей P(c) и P(wi|c) осуществляется на обучающей выборке. Вероятность класса мы можем оценить как:
11
(6)
где, Dc – количество документов принадлежащих классу c, а D – общее количество документов в обучающей выборке.
(7)
Оценка вероятности слова в классе может делаться несколькими путями. Один
из них multinomial bayes model.


Wic — количество раз сколько i-ое слово встречается в документах класса
c;
V — словарь корпуса документов (список всех уникальных слов).
Другими словами, числитель описывает сколько раз слово встречается в документах класса (включая повторы), а знаменатель – это суммарное количество
слов во всех документах этого класса.
В итого, после применения адаптивное сглаживания, получается формула, удовлетворяющая всем условиям, для построения классификатора.
(8)
3.2. Разработка наивного байесовского классификатора
Для реализации Байесовского классификатора нам необходима обучающая выборка в которой проставлены соответствия между текстовыми документами и их классами. Затем нам необходимо собрать следующую статистику из
выборки, которая будет использоваться на этапе классификации:

относительные частоты классов в корпусе документов. То есть, как часто
встречаются документы того или иного класса;

суммарное количество слов в документах каждого класса;

относительные частоты слов в пределах каждого класса;
12
размер словаря выборки. Количество уникальных слов в выборке.

Совокупность этой информации мы будем называть моделью классификатора.
Затем на этапе классификации необходимо для каждого класса рассчитать значение следующего выражения и выбрать класс с максимальным значением.
(9)
в этой формуле:
Dc — количество документов в обучающей выборке принадлежащих

классу c;

D — общее количество документов в обучающей выборке;

|V| — количество уникальных слов во всех документах обучающей выборки;
Lc — суммарное количество слов в документах класса c в обучающей

выборке;
Wic — сколько раз i-ое слово встречалось в документах класса c в обуча-

ющей выборке;
Q – множество слов классифицируемого документа (включая повторы).

4. Моделирование мультиагентной системы.
После того, как была завершена разработка наивного байесовского
классификатора, необходимо обучить его. Для этого нам понадобится реализовать агетские структуры и методы для получения данных из социальных
сетей.
Пусть МАС состоит из 5 независимых интеллектуальных агентов.
13
- «Босс» - агент, являющийся неким агрегатором, который собирает
информации от других агентов и группирует её в информацию более высокого уровня.
- «Загрузчик» ( Getter ) - служебный агент, который несет ответственность за сбор и передачу информации из социальной сети, другим агентам.
- «Анализатор» - это блок различный по типу классификаторов, в данном случае является наивным байесовским классификатором.
Приступая к моделированию, была изучена многоагентная платформа
MadKit, которая предоставляет разработчику широкий спектр решений для
построения МАС. Данная платформа будет использоваться для моделирование данной системы.
После определения условий моделирования данной системы, был составлен пакет классов Agent .
Рисунок 1 - Cостав пакета Agent
В данном пакете(см. рисунок 2) представле»ны агенты, требуемые для
данной МАС.
Класс «Society» является открытым и служит для хранения обществ,
групп, ролей для агентов, соответствующих AGR .
Класс «Operations» является открытым и служит для хранения операций, доступных агентам.
14
Класс «MsgTypes» является открытым и служит для хранения типов
сообщений, которые передают агенты.
В соответствие с техническими стандартами платформы Madkit , каждый агент имеет следующую структуру:
protected void activate() - данный метод отвечает за "начало жизни"
агента и получение им группы, определяющей его статус.
protected void live() - данный метод отвечает для "жизненный цикл"
агента и в нем следует выполнять основные действия, которые должен совершить агент
protected void end() - данный метод отвечает за период после команды
на уничтожение агента и его окончательного уничтожения.
4.1 Описание классов пакета Agent
4.1.1 Класс «Boss»
Алгоритм работы:
После запуска программы, путем выполнения процедуры получения
роли агента(requestRole) , данный агент узнает свое назначение. Исходя из
этого, им принимаются решения, соответствующие его роли. Для данного
агента это получение токена, с помощью соответствующего метода, описанного ранее. Если токен был получен успешно, то он отправляет его в «Загрузчик», чтобы то смогло приступить к своей работе. После успешной отправки, агент начинает ждать отклика от «Сервера», для получения очередного сообщения. После получения id , «Босс» дает команду агенту «Загрузчик» на начало загрузки данных на очередного пользователя и начинает ожидать результаты работы «Загрузчика»
4.1.2 Класс «Getter» или «Загрузчик»
Алгоритм работы:
15
После запуска программы, путем выполнения процедуры получения
роли агента(requestRole) , данный агент узнает свое назначение. Исходя из
этого, им принимаются решея, соответствующие его роли.
Для данного
агента это ожидание команды от «Босса» и загрузка данных из социальных
сетей для конкретного пользователя
4.1.3 Класс «Analize»
Алгоритм работы:
При запуске МАС агент инициализирует данные обучающей выборки,
произведенной заранее и начинает ожидание запроса от «Босса» на выполнение
классификации очередного пользователя. При получении очередного id, выполняется загрузка данных, полученных «Загрузчиком» . Далее выполняется
классификация по алгоритму наивного классификатора Байеса. После классификации результат отправляется «Боссу» .
4.1.4 Класс «Server»
Алгоритм работы:
При запуске МАС агент запускает сервер JAX-RS, который является модификацией обычного http-сервера. И начинает прием пользовательских идентификаторов по протоколу http. После получении очередного идентификатора
он помещается в очередь , которая в дальнейшем отправляется агенту «Босс».
4.1.5. Класс «Includer»
Алгоритм работы:
При запуске МАС агент начинает ожидание команды от агента «Загрузчик» на добавление полученных данных в базу данных. После получения им
данных он преобразует их в удобный формат хранения и подключается к базе
данных и пересылает пользовательскую информацию.
16
ЗАКЛЮЧЕНИЕ
В результате выполнения курсовой работы были изучены принципы
построения мультиагентны систем. Разработана мультиагентная система,
способная обрабатывать данные, полученные из социальной сети и классифицировать их с помощью наивного байесовского классификатора. Также
был реализован веб-сервис для доступа к данной системе из «Всемирной паутины», что дает большие возможности для улучшений. Улучшения могут
заключатся в том, что каждое обращение к классификатору будет увеличивать его способности за счет добавления данных в обучающую выборку. В
дальнейшем планируется реализация полноценного веб-сервиса для классификации различных групп пользователей.
17
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Фонд Общественное мнение. Интернет в России: динамика проникновения,
2013,
ресурс]
[Электронный
http://runet.fom.ru/Proniknovenie-
interneta/10950 [Дата обращения: 12.05.2014]
2. Городецкий В.И., Грушинский М.С., Хабалов А.В. Многоагентные системы (обзор)// Новости искусственного интеллекта, C. 13. –1998. – №2. –
3. Тарасов В.Б. Системно-организационный подход в искусственном интеллекте// Программные продукты и системы. - 1997. – №3. – C.6-13.
4. Тарасов В.Б. От многоагентных систем к интеллектуальным организациям: философия, психология, информатика. – М.: Эдиториал УРСС, 543 С
2002.
5. Michael Wooldbridge, An Introduction to MultiAgent System, John Wille &
Sons Ltd, 2002,paperblack, C. 150-170, ISBN 0-471-49691-X
6. Jacques Ferber, Multi-Agent Systems, A Modern Approach to Distributed Artificial Intelligence, Addison-Wensley, 1999, 126 pages ISBN 0-201-36048-0.
7. Boyd, D and Ellison, N. Social Network Sites: Definition, History and Scholarship // Journal of Computer-Mediated Communication. – 2007. – T. 13. - № 1.
– C. 210-230. – ISSN 10836101
8. Библиотека
методов
API
«Вконтакте»,2013
[Электронный
ресурс]
https://vk.com/dev [Дата обращения: 01.04.2014]
9. Программная платформа для работы с агентскими структурами , 2014,
[Электронный ресурс] http://www.madkit.net/docs/api/ [Дата обращения:
13.02.2014]
10.Библиотека методов Apache HttpComponents, 2010 [Электронный ресурс]
http://hc.apache.org/httpclient-3.x/ [Дата обращения: 11.03.2014]
18
ПРИЛОЖЕНИЕ А
Код программы.
package Agent;
import madkit.kernel.Agent;
import madkit.kernel.AgentAddress;
import madkit.message.ObjectMessage;
import Сlassifier.computing;
import Сlassifier.types
import java.io.IOException;
import java.util.logging.Level;
@SuppressWarnings("serial")
public class Analize extends Agent {
private types.diffClass simple = new types.diffClass(2460);
private types.diffClass programmer = new types.diffClass(1900);
private types.diffClass uniq = new types.diffClass(4360);
private types.diffClass currentUser = new types.diffClass(1);
private ObjectMessage<MsgTypes.Message> msgClass = null;
private MsgTypes.Message message = null;
private AgentAddress boss = null;
protected void activate()
{
setLogLevel(Level.INFO);
logger.info("Анализатор запущен");
requestRole(Society.COMMUNITY,Society.GROUP,Society.ROLEANALIZE);
logger.info("Получил роль:" + Society.ROLEANALIZE);
simple.loadBD("simplePeople");
programmer.loadBD("programmer");
uniq.loadBD("uniq_learn");
simple.printCount();
programmer.printCount();
uniq.printCount();
logger.info("Инициализировал обучающую выборку!");
}
protected void live()
{
while(true){
19
while(boss == null) {
boss = getAgentWithRole(Society.COMMUNITY,Society.GROUP,Society.ROLEBOSS);
}
msgClass = (ObjectMessage) waitNextMessage();
if(msgClass.getSender().getRole() == Society.ROLEBOSS) {
message = msgClass.getContent();
if(message.operation == Operations.OPERATION_GET_CLASS) {
String id = message.data.toString();
currentUser.loadUser(id);
currentUser.printCount();
double result1 = 0.0,result2 = 0.0;
try {
result1
=
computing.getCoef(simple,
currentUser,
simple.CountUsers
+
programmer.CountUsers,
uniq.words.size());
result2
=
computing.getCoef(programmer,
currentUser,
simple.CountUsers
+
programmer.CountUsers,
uniq.words.size());
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(result1+">"+result2);
currentUser.deluser(id);
currentUser = new types.diffClass(1);
if(result1 > result2) {
message
=
new
MsgTypes.Message("["+message.data.toString()+"]определен
как
простой
человек",Operations.OPERATION_GET_CLASS);
}
else
message
=
new
MsgTypes.Message("["+message.data.toString()+"]определен
шник",Operations.OPERATION_GET_CLASS);
logger.info("Получил от босса ид и обработал его!");
logger.info("Результат: "+message.data);
sendReply(msgClass,new ObjectMessage<MsgTypes.Message>(message));
}
}
}
}
protected void end() {
if(logger != null)
logger.info("Все сообщения обработаны. Заканчиваю свою работу..");
pause(10000);
}
}
package Agent;
20
как
ИТ-
import madkit.kernel.Agent;
import madkit.kernel.AgentAddress;
import madkit.message.ObjectMessage;
import java.io.IOException;
import java.util.IllegalFormatCodePointException;
import java.util.logging.Level;
@SuppressWarnings("serial")
public class Boss extends Agent {
private String token = "-1"; //Токен, служебная структура, для доступа к API Vk.com
private ObjectMessage<MsgTypes.Message> msgClass = null; // Вид сообщения, передаваемого между агентами.
private MsgTypes.Message<String> message = null;
private AgentAddress includer = null;
private AgentAddress excluder = null;
private AgentAddress getter = null;
private AgentAddress analize = null;
private AgentAddress server = null;
@Override
// 1-й этап работы агента. Создание структур для работы системы.
protected void activate() {
setLogLevel(Level.INFO);
createGroupIfAbsent(Society.COMMUNITY,Society.GROUP);
requestRole(Society.COMMUNITY,Society.GROUP,Society.ROLEBOSS);
if(logger!=null){
logger.info("Получил роль: "+Society.ROLEBOSS);
}
pause(500);
}
@Override
//2-й этап работы агента. Время жизни. Т.е те методы, которые должен выполнить агент.
protected void live() {
SearchForAgents();
try {
sendTokenToGetter();
} catch (IOException e) {
e.printStackTrace();
}
while(true) {
msgClass = (ObjectMessage) waitNextMessage();
if (msgClass != null) {
if (msgClass.getSender().getRole().equals(Society.ROLESERVER)) {
message = msgClass.getContent();
String id = message.data;
logger.info("Получил id:" + id + ", начинаю обработку:");
21
message = new MsgTypes.Message("Получил id, начинаю обработку...", Operations.OPERATION_RESPONSE);
sendReply(msgClass, new ObjectMessage<MsgTypes.Message>(message));
ProcessingId(id);
}
if(msgClass.getSender().getRole().equals(Society.ROLEGETTER)) {
message = msgClass.getContent();
if(message.operation.equals(Operations.OPERATION_SEND_ID)) {
String id = message.data.toString();
message = new MsgTypes.Message(id, Operations.OPERATION_GET_CLASS);
ObjectMessage<MsgTypes.Message> msgClass2 = (ObjectMessage) sendMessageAndWaitForReply(analize,
new ObjectMessage<MsgTypes.Message>(message),100000);
if (msgClass2 == null) {
if (logger != null)
logger.info("Анализатор не ответил на запрос..");
} else if (logger != null) {
message = msgClass2.getContent();
logger.info("[" + msgClass2.getSender().getRole() + "]: - " + message.data);
}
}
}
}
}
}
@Override
//3-й этап работы. Завершение работы. Отчистка памяти от созданных структур.
protected void end() {
if(logger != null)
logger.info("Я заканчиваю свою работу..");
pause(2000);
}
private void sendTokenToGetter() throws IOException { //Отправка токена в хранилище, для работы с данными социальной сети Vk.com
//Получаем токен
try {
token = "6098a426eeebb9f0f503e8eeb67352060d0721cf6621e8c3f28fd99b5bd9f05d0f9e224419dfe255491bd";
//token = vk.Token.GetToken();
if(token=="-1") killAgent(this);
} catch (IllegalFormatCodePointException e) {
logger.warning("IO EXCEPTION CAPTURED");
}
message = new MsgTypes.Message(token,Operations.OPERATION_TOKEN_SEND);
msgClass
=
(ObjectMessage)sendMessageAndWaitForReply(getter,new
sage<MsgTypes.Message>(message),10000); //Отправляем ему токен и ждем ответа
if(msgClass==null) {
22
ObjectMes-
if(logger!=null){
logger.info("Хранилище не ответило на запросы...");
end();
}
}
else
if(logger!=null) {
message = msgClass.getContent();
logger.info("["+msgClass.getSender().getRole() + "]: - " + message.data);
}
msgClass = null;
}
private void ProcessingId(String id) {
message = new MsgTypes.Message(id,Operations.OPERATION_GET_INFO_FROM_NETWORK);
msgClass = (ObjectMessage) sendMessageAndWaitForReply(getter,new ObjectMessage<MsgTypes.Message>(message));
if(msgClass==null) {
if(logger!=null)
logger.info("Выкачеватель не ответил на запрос..");
}
else
if(logger!=null) {
message = msgClass.getContent();
logger.info("["+msgClass.getSender().getRole() + "]: - " + message.data);
}
}
private void SearchForAgents() {
while((getter==null)){//||(includer==null)||(excluder==null)||(analize==null)){
getter = getAgentWithRole(Society.COMMUNITY, Society.GROUP, Society.ROLEGETTER);
includer = getAgentWithRole(Society.COMMUNITY, Society.GROUP, Society.ROLEINCLUDER);
// excluder = getAgentWithRole(Society.COMMUNITY, Society.GROUP, Society.ROLEEXCLUDER);
analize = getAgentWithRole(Society.COMMUNITY, Society.GROUP, Society.ROLEANALIZE);
server = getAgentWithRole(Society.COMMUNITY, Society.GROUP, Society.ROLESERVER);
}
pause(1000);
if(logger!=null) {
logger.info("Система полна! Начинаю работу..");
}
}
}
package Agent;
import madkit.kernel.Agent;
import madkit.kernel.AgentAddress;
import madkit.message.ObjectMessage;
import java.util.logging.Level;
23
/**
* Created by Fixit on 30.05.2014.
*/
public class Excluder extends Agent {
private ObjectMessage<String> msg = null; //Структура сообщения, при общении между агентами.
private AgentAddress boss = null; // Переменная, содержащая адрес "Босса"
@Override
protected void activate() {
setLogLevel(Level.INFO);
createGroupIfAbsent(Society.COMMUNITY,Society.GROUP);
requestRole(Society.COMMUNITY,Society.GROUP,Society.ROLEEXCLUDER);
logger.info("Получил роль: "+Society.ROLEEXCLUDER);
pause(500);
}
@Override
protected void live() {
while (true) {
msg = (ObjectMessage) waitNextMessage();
if(msg!=null) {
}
}
}
@Override
protected void end() {
if(logger != null)
logger.info("Заканчиваю свою работу.");
pause(10000);
}
}
package Agent;
import madkit.kernel.Agent;
import madkit.kernel.AgentAddress;
import madkit.message.ObjectMessage;
import vk.VkWall;
import vk.vkPhoto;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
@SuppressWarnings("serial")
24
public class Getter extends Agent {
private ObjectMessage<MsgTypes.Message> msgClass = null; //Структура сообщения, при общении между агентами.
private MsgTypes.Message message = null;
private AgentAddress boss = null; // Переменная, содержащая адрес "Босса"
private ArrayList<String> msgList = new ArrayList<String>(); //Расширяемый список для хранения объектов.
private String token = "-1"; // Токен для работы с API Vk.com
private AgentAddress includer;
@Override
protected void activate() {
setLogLevel(Level.INFO);
createGroupIfAbsent(Society.COMMUNITY,Society.GROUP);
//Получение роли хранилища
requestRole(Society.COMMUNITY,Society.GROUP,Society.ROLEGETTER);
logger.info("Получил роль: "+Society.ROLEGETTER);
pause(500);
}
@Override
protected void live() {
while((includer==null)&(boss == null)) {
includer = getAgentWithRole(Society.COMMUNITY, Society.GROUP, Society.ROLEINCLUDER);
boss = getAgentWithRole(Society.COMMUNITY,Society.GROUP,Society.ROLEBOSS);
}
while (true) {
msgClass = (ObjectMessage) waitNextMessage();
if (msgClass != null) {
message = msgClass.getContent();
if (msgClass.getSender().getRole().equals(Society.ROLEBOSS)) {
if(message.operation == Operations.OPERATION_TOKEN_SEND) {
token = message.data.toString();
message = new MsgTypes.Message("Получил токен! Спасибо!",Operations.OPERATION_RESPONSE);
sendReply(msgClass, new ObjectMessage<MsgTypes.Message>(message));
logger.info("[I] - Получил token <<"+token+">> от ["+msgClass.getSender().getRole()+"]");
}
if(message.operation == Operations.OPERATION_GET_INFO_FROM_NETWORK) {
String id = message.data.toString();
message = new MsgTypes.Message("Начинаю загрузку!",Operations.OPERATION_RESPONSE);
sendReply(msgClass,new ObjectMessage<MsgTypes.Message>(message));
logger.info("[I] - получил id от "+msgClass.getSender().getRole());
AddInformation(id);
}
}
if(msgClass.getSender().getRole().equals(Society.ROLEINCLUDER)) {
MsgTypes.Message<String> msg2 = msgClass.getContent();
System.out.println("2@"+msg2.operation);
if (message.operation.equals(Operations.OPERATION_SEND_ID)) {
25
String id = msg2.data;
msg2 = new MsgTypes.Message(id, Operations.OPERATION_SEND_ID);
System.out.println("2@" + id);
sendMessage(boss, new ObjectMessage<MsgTypes.Message>(msg2));
}
}
}
}
}
@Override
protected void end() {
if(logger != null)
logger.info("Заканчиваю свою работу.");
pause(10000);
}
private void AddInformation(String id) {
// sendPhotoList(includer,id);
sendWallList(includer,id);
}
private void sendPhotoList(AgentAddress agent,String id) {
MsgTypes.Message<ArrayList<vkPhoto.items>> photoList = getPhotoList(id);
if(logger!=null) {
logger.info("Получил данные по фото для id"+id);
logger.info("Начинаю отправку Агенту-Includer");
}
msgClass
=
(ObjectMessage)
sendMessageAndWaitForReply(agent,new
sage<MsgTypes.Message<ArrayList<vkPhoto.items>>>(photoList));
if(msgClass==null) {
if(logger!=null)
logger.info("Нет ответа от БАЗЫ ДАННЫХ!!!!");
}
else {
if(logger!=null) {
message = msgClass.getContent();
logger.info("Получен ответ от АГЕНТА-БД <<"+message.data);
}
}
}
private void sendWallList(AgentAddress agent,String id) {
26
ObjectMes-
MsgTypes.Message<VkWall.result> wallClass = getWallList(id);
wallClass.data.owner_id = id;
if(logger!=null) {
logger.info("Получил данные по cтене для id = "+id);
logger.info("Начинаю отправку to [Includer]");
}
msgClass
=
(ObjectMessage)
sendMessageAndWaitForReply(agent,new
ObjectMes-
sage<MsgTypes.Message<VkWall.result>>(wallClass));
if(msgClass==null) {
if(logger!=null)
logger.info("Нет ответа от БАЗЫ ДАННЫХ!!!!");
}
else {
if(logger!=null) {
message = msgClass.getContent();
logger.info("["+msgClass.getSender().getRole() + "]: - " + message.data);
}
}
}
private MsgTypes.Message<VkWall.result> getWallList(String id) {
MsgTypes.Message<VkWall.result> wall = null;
try {
wall
=
new
MsgTypes.Message<VkWall.result>(VkWall.getWallById(id,token),Operations.OPERATION_PUT_INTO_DB_WALL);
} catch (IOException e) {
e.printStackTrace();
logger.info("ERROR GET_INFO_WALL");
}
return wall;
}
private MsgTypes.Message<ArrayList<vkPhoto.items>> getPhotoList(String id) {
MsgTypes.Message<ArrayList<vkPhoto.items>> photoList = null;
try {
photoList
=
new
MsgTypes.Message<ArrayList<vkPhoto.items>>(vkPhoto.getAllPhotoById(id,token),Operations.OPERATION_PUT_INTO_D
B_PHOTO);
} catch (IOException e) {
e.printStackTrace();
logger.info("ERROR GET_INFO_PHOTO");
}
return photoList;
}
}
package Agent;
import db.Mysql;
27
import madkit.kernel.Agent;
import madkit.kernel.AgentAddress;
import madkit.message.ObjectMessage;
import vk.VkWall;
import vk.vkPhoto;
import Сlassifier.learn;
import java.util.ArrayList;
import java.util.logging.Level;
/**
* Created by Fixit on 31.05.2014.
*/
public class Includer extends Agent {
private ObjectMessage<MsgTypes.Message> msgClass = null; //Структура сообщения, при общении между агентами.
private AgentAddress boss = null; // Переменная, содержащая адрес "Босса"
private MsgTypes.Message message = null;
private AgentAddress getter = null;
@Override
protected void activate() {
setLogLevel(Level.INFO);
createGroupIfAbsent(Society.COMMUNITY,Society.GROUP);
requestRole(Society.COMMUNITY,Society.GROUP,Society.ROLEINCLUDER);
logger.info("Получил роль: "+Society.ROLEINCLUDER);
pause(500);
}
@Override
protected void live() {
while(getter == null) {
getter = getAgentWithRole(Society.COMMUNITY,Society.GROUP,Society.ROLEGETTER);
}
while (true) {
msgClass = (ObjectMessage) waitNextMessage();
if(msgClass!=null) {
if(msgClass.getSender().getRole().equals(Society.ROLEGETTER)) {
message = msgClass.getContent();
if(message.operation==Operations.OPERATION_PUT_INTO_DB_PHOTO) {
MsgTypes.Message<ArrayList<vkPhoto.items>> msg2 = message;
message = new MsgTypes.Message("Получил фото! Спасибо!",Operations.OPERATION_RESPONSE);
sendReply(msgClass,new ObjectMessage<MsgTypes.Message>(message));
logger.info("Получил данные фото, начинаю добавление в БД");
Mysql sql = new Mysql("root","");
sql.AddPhotoListToDb(msg2.data);
logger.info("ФОТО Добавлены в БД!");
}
28
if(message.operation==Operations.OPERATION_PUT_INTO_DB_WALL) {
MsgTypes.Message<VkWall.result> msg2 = message;
message = new MsgTypes.Message("Получил данные, спасибо!",Operations.OPERATION_RESPONSE);
sendReply(msgClass,new ObjectMessage<MsgTypes.Message>(message));
logger.info("Получил данные стены от [GETTER], начинаю добавление в БД");
Mysql sql = new Mysql("root","");
sql.addCurrentUser(learn.WallToWords(msg2.data), msg2.data.owner_id);
logger.info("СТЕНА Пользователя Добавлена в БД");
message = new MsgTypes.Message(msg2.data.owner_id,Operations.OPERATION_SEND_ID);
System.out.println("1@"+msg2.data.owner_id);
sendMessage(getter,new ObjectMessage<MsgTypes.Message>(message));
}
}
}
}
}
@Override
protected void end() {
if(logger != null)
logger.info("Заканчиваю свою работу.");
pause(10000);
}
}
package Agent;
/**
* Created by Fixit on 31.05.2014.
*/
public class Operations {
final public static String OPERATION_GET_INFO_FROM_NETWORK = "get_info";
final public static String OPERATION_GET_PHOTO_LIST_FROM_DB = "get_photoDB";
final public static String OPERATION_GET_WALL_LIST_FROM_DB = "get_wallDB";
final public static String OPERATION_PUT_INTO_DB_PHOTO = "put_photoDb";
final public static String OPERATION_PUT_INTO_DB_WALL = "put_wallDb";
final public static String OPERATION_TOKEN_SEND = "token";
final public static String OPERATION_RESPONSE = "resp";
final public static String OPERATION_SEND_ID = "id";
final public static String OPERATION_GET_CLASS = "class";
}
package Agent;
import RestServer_Jax.ServerClass;
import madkit.kernel.Agent;
import madkit.kernel.AgentAddress;
import madkit.message.ObjectMessage;
29
import java.util.logging.Level;
/**
* Created by Fixit on 19.05.2014.
*/
@SuppressWarnings("serial")
public class Server extends Agent {
// private ObjectMessage<String> msg = null; //Структура сообщения, при общении между агентами.
private ObjectMessage<MsgTypes.Message> msgClass = null;
private MsgTypes.Message message = null;
private AgentAddress boss = null;
protected void activate()
{
setLogLevel(Level.INFO);
requestRole(Society.COMMUNITY,Society.GROUP,Society.ROLESERVER);
if(logger!=null){
logger.info("Получил роль: "+Society.ROLESERVER);
}
ServerClass.start();
logger.info("Сервер запущен");
}
protected void live()
{
int i = 0;
while(boss == null) {
i++;
logger.info("Пытаюсь найти босса.. Попытка:"+i);
boss = getAgentWithRole(Society.COMMUNITY,Society.GROUP,Society.ROLEBOSS);//Находим агента-boss
pause(3000);
}
logger.info("Босс найден! Начинаю прием заявок..");
while(true) {
String id = waitforNextId();
logger.info("Получен id:"+id);
sendIdToBoss(id);
}
}
protected void end() {
if(logger != null)
logger.info("Пришел приказ на завершения работы. Заканчиваю свою работу..");
ServerClass.stop();
pause(10000);
}
30
private String waitforNextId() {
while(ServerClass.ids.size() == 0){}
String result = ServerClass.ids.firstElement();
ServerClass.ids.remove(ServerClass.ids.firstElement());
return result;
}
private void sendIdToBoss(String id) {
message = new MsgTypes.Message(id,Operations.OPERATION_SEND_ID);
msgClass
=
(ObjectMessage)sendMessageAndWaitForReply(boss,new
sage<MsgTypes.Message>(message),100000);
if(msgClass==null) {
if(logger!=null){
logger.info("Босс не ответил на запросы... Помешаю id обратно в очередь");
ServerClass.ids.add(id);
pause(5000);
}
}
else
if(logger!=null) {
message = msgClass.getContent();
logger.info("["+msgClass.getSender().getRole() + "]: - " + message.data);
}
}
}
package Agent;
public class Society {
final static public String COMMUNITY="communication";
final static public String GROUP="social";
final static public String ROLEBOSS="boss";
final static public String ROLEGETTER="getter";
final static public String ROLEINCLUDER="includer";
final static public String ROLEEXCLUDER="excluder";
final static public String ROLEANALIZE="analyzer";
final static public String ROLESERVER="server";
}
package db;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import vk.VkWall;
31
ObjectMes-
import vk.vkPhoto;
import vk.vkProfile;
import yandex.geocode;
import yandex.types;
import Сlassifier.types.diffClass;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class Mysql {
String user;
String password;
String host;
private static Connection cnt = null;
///////////////////////////////Constructors/////////////////////////////////////
public Mysql(String user, String password, String host) {
this.user = user;
this.password = password;
this.host = host;
try {
cnt = (Connection) DriverManager.getConnection("jdbc:mysql://"+host, user, password);
} catch (SQLException e) {
System.out.println("Connection to MySQL Error(1)");
}
}
public Mysql(String user, String password) {
this.user = user;
this.password = password;
try {
cnt = (Connection) DriverManager.getConnection("jdbc:mysql://localhost", user, password);
} catch (SQLException e) {
System.out.println("Connection to MySQL Error(1)");
}
}
////////////////////////////////////////////////////////////////////////////////
public static String getMsgById(String id) {
String msg = "";
try {
PreparedStatement pst = (PreparedStatement) cnt.prepareStatement("select body from test.messages where id = ?");
pst.setString(1, id);//установление значения параметра. Обратите внимание: нумерация параметров начинается не с
0, а с 1!
// System.out.println(pst.getPreparedSql());
ResultSet prs = pst.executeQuery();
32
try {
while(prs.next()) {
msg=prs.getString("body");
}
} catch (SQLException e) {
msg="0";
} finally {
if(msg.isEmpty()) {
msg="0";
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return msg;
}
public static ArrayList<String> getMsgByUserId(String id) {
ArrayList<String> msg = new ArrayList<String>();
try {
PreparedStatement pst = (PreparedStatement) cnt.prepareStatement("select body from test.messages where user_id = ?");
pst.setString(1,id);
ResultSet prs = pst.executeQuery();
while (prs.next()) {
if(!prs.getString("body").equals(""))
msg.add(prs.getString("body"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return msg;
}
public static void AddPhotoListToDb(ArrayList<vkPhoto.items> it) {
for (int i=0;i<it.size();i++) {
try {
PreparedStatement
pst
=
(PreparedStatement)
test.photo(id,owner_id,lon,lat,text,Country,city,street,Num) values (?,?,?,?,?,?,?,?,?);");
pst.setString(1,it.get(i).id);
pst.setString(2,it.get(i).owner_id);
pst.setString(3,it.get(i).lon);
pst.setString(4,it.get(i).lat);
pst.setString(5,it.get(i).text);
types.GetData geo = geocode.getAdr(it.get(i).lon + "," + it.get(i).lat);
pst.setString(6, geo.Country);
pst.setString(7, geo.City);
pst.setString(8, geo.Street);
33
cnt.prepareStatement("insert
into
pst.setString(9, geo.Num);
pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
public static void AddPeopleListToDb(vkProfile.ProfileJson list) {
for (int i=0;i<list.response.length;i++) {
try {
PreparedStatement pst = (PreparedStatement) cnt.prepareStatement("insert into test.people(id,fname,lname,city) values
(?,?,?,?);");
pst.setString(1,list.response[i].id);
pst.setString(2,list.response[i].first_name);
pst.setString(3,list.response[i].last_name);
pst.setString(4,list.response[i].city.title);
pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
public static void AddWallInfoToDb(VkWall.result input) {
for(int i = 0;i<input.items.size();i++) {
try {
PreparedStatement pst = (PreparedStatement) cnt.prepareStatement("insert into test.Wall(id,owner_id,text,from_id)
values (?,?,?,0)");
pst.setString(1,input.items.get(i).id);
pst.setString(2,input.items.get(i).owner_id);
pst.setString(3,input.items.get(i).text);
pst.executeUpdate();
}
catch (SQLException e) {
e.printStackTrace();
}
}
for (int i = 0;i<input.hist.size();i++) {
try {
PreparedStatement pst = (PreparedStatement) cnt.prepareStatement("insert into test.Wall(id,owner_id,from_id,text)
values (?,?,?,?)");
pst.setString(1,input.hist.get(i).id);
pst.setString(2,input.hist.get(i).owner_id);
pst.setString(3,input.hist.get(i).from_id);
pst.setString(4,input.hist.get(i).text);
pst.executeUpdate();
}
34
catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void addSimpleList(diffClass ListClass,String table) {
for (int i=0;i<ListClass.words.size();i++) {
try {
PreparedStatement pst = (PreparedStatement) cnt.prepareStatement("insert into classifier."+table+"(word,Count) values
(?,?);");
pst.setString(1,ListClass.words.get(i).text);
pst.setString(2, String.valueOf(ListClass.words.get(i).Count));
pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
public static void addCurrentUser(diffClass ListClass,String id) {
for (int i=0;i<ListClass.words.size();i++) {
try {
PreparedStatement
pst
=
(PreparedStatement)
cnt.prepareStatement("insert
er.currentUser(word,Count,owner_id) values (?,?,?);");
pst.setString(1,ListClass.words.get(i).text);
pst.setString(2, String.valueOf(ListClass.words.get(i).Count));
pst.setString(3,id);
pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
public static diffClass loadSimpleList(String table) {
diffClass mass = new diffClass(10000);
try {
PreparedStatement pst = (PreparedStatement) cnt.prepareStatement("select * from classifier."+table);
ResultSet rst = pst.executeQuery();
while(rst.next()) {
Сlassifier.types.Word word = new Сlassifier.types.Word(rst.getString("word"));
word.Count = rst.getInt("count");
mass.words.add(word);
}
} catch (SQLException e) {
e.printStackTrace();
}
return mass;
35
into
classifi-
}
public static diffClass loadCurrentUser(String id) {
diffClass mass = new diffClass(10000);
try {
PreparedStatement pst = (PreparedStatement) cnt.prepareStatement("select * from `classifier`.`currentUser` where `owner_id`= ?;");
pst.setString(1,id);
ResultSet rst = pst.executeQuery();
while(rst.next()) {
Сlassifier.types.Word word = new Сlassifier.types.Word(rst.getString("word"));
word.Count = rst.getInt("count");
mass.words.add(word);
}
} catch (SQLException e) {
e.printStackTrace();
}
return mass;
}
public static void deluser(String id) {
try {
PreparedStatement pst = (PreparedStatement) cnt.prepareStatement("DELETE FROM `classifier`.`currentUser` WHERE
`owner_id`= ?;");
pst.setString(1,id);
pst.executeUpdate();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
package RestServer_Jax;
import java.util.Vector;
/**
* Created by Fixit on 19.05.2014.
*/
public class ServerClass {
public static Vector<String> ids = new Vector<String>();
private static com.sun.net.httpserver.HttpServer server;
public static void start() {
try {
System.out.println("Server is running");
server = com.sun.jersey.api.container.httpserver.HttpServerFactory.create("http://localhost:9998/");
server.start();
System.out.println("Server is working! Visit http://localhost:9998/");
36
} catch (java.io.IOException ioe) {
ioe.printStackTrace(System.err);
}
}
public static void stop() {
server.stop(0);
System.out.println("Server stopped");
}
}
package RestServer_Jax;
/**
* Created by Fixit on 19.05.2014.
*/
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@Path("/req/{req_data}")
public class req {
@GET
// @Produces("application/json"+";charset=utf-8")
public String getClichedMessage(@PathParam("req_data") String id) {
if(idCheck(id)) {
ServerClass.ids.add(id);
return "Retrived";
}
else return "Error id";
}
private boolean idCheck(String id) {
boolean result = true;
for (int i=0;i<id.length();i++) {
if((id.charAt(i)>='0')&&(id.charAt(i)<='9'))
result = true;
else {
result = false;
break;
}
}
return result;
}
}
package vk;
import javafx.beans.value.ChangeListener;
37
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
/*
* Данный класс отвечает за визуальную авторизацию в социальной сети Vk.com
* Также используется для получение токена, при успешной авторизации.
*/
class Browser extends Region {
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
public static String Access_Token = "";
String app_id="3985695", // id-приложения, зарегистрированного в сети зарание, для получение доступа к пользовательской информации.
scope="friends,wall,status,messages,photos,groups,music", // Права доступа.
redirect_uri="https://oauth.vk.com/blank.html",
display="popup",
//страница переадресации после успешной авторизации.
//Вид окна при авторизации
response_type="token";
//Тип ответа: токен гарантирует доступ к данным пользователя в течение
определенного времени ( ~ 1 день )
public static String parsToken(String URL) {
String result=URL.substring(URL.indexOf("access_token=")+"access_token=".length(),URL.indexOf("&expires_in"));
return result;
}
public Browser() {
//Подключаем стили
getStyleClass().add("browser");
// Загружаем страницу авторизации
webEngine.load("http://oauth.vk.com/authorize?" +"client_id=" + app_id +"&scope=" + scope +"&redirect_uri=" + redirect_uri +"&display=" + display +"&response_type=" + response_type);
//Открываем окно WebView
getChildren().add(browser);
//Добавляем слуховой аппарат, для определения того момента, когда будет выведен токен в адресную строку.
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<Worker.State>() {
@Override
38
public void changed(ObservableValue<? extends Worker.State> observableValue, Worker.State state, Worker.State
state2) {
if(state == state2.SUCCEEDED) {
if(webEngine.getLocation().indexOf("oauth.vk.com/blank.html#access_token=")>0){
Access_Token = parsToken(webEngine.getLocation());
webEngine.executeScript("location.replace('localhost')");
//todo исправить вход, должно перекидовать на страницу.
}
}
}
}
);
}
private Node createSpacer() {
Region spacer = new Region();
HBox.setHgrow(spacer, Priority.ALWAYS);
return spacer;
}
@Override protected void layoutChildren() {
double w = getWidth();
double h = getHeight();
layoutInArea(browser,0,0,w,h,0, HPos.CENTER, VPos.CENTER);
}
@Override protected double computePrefWidth(double height) {
return 750;
}
@Override protected double computePrefHeight(double width) {
return 500;
}
}
package vk;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
39
*
* Данный класс используется для обработки http-запросов.
* Также используется для парсинга токена из адресной строки браузера и последующей его обработки.
*/
class HttpGetter {
private static String getContent(HttpResponse resp) throws IOException {
BufferedReader rd = new BufferedReader(
new InputStreamReader(resp.getEntity().getContent())
);
StringBuffer result = new StringBuffer();
String line ="";
while((line = rd.readLine()) != null) {
result.append(line);
}
return result.toString();
}
public static String sendGet(String command,String token) throws IOException {
String url = "https://api.vk.com/method/"+command+"&access_token="+token;
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
return getContent(response);
}
}
package vk;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
/*
* Класс, выполняющий инициализацию формы Browser с последующей обработкой полученных данных.
*/
public class Token extends Application {
@Override
public void start(final Stage stage) throws Exception {
Scene scene = new Scene(new Browser(), 600, 400);
stage.setScene(scene);
stage.setResizable(false);
stage.show();
}
public static String GetToken() throws IOException {
String[] args=new String[10];
40
Application.launch(args);
if(Browser.Access_Token!="")
return Browser.Access_Token;
else
{
return "-1";
}
}
}
package vk;
import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created with IntelliJ IDEA.
* User: Fixit
* Date: 25.03.14
* Time: 18:23
* To change this template use File | Settings | File Templates.
*/
public class vkPhoto {
public class items {
public String id="";//id фото
public String owner_id="";
public String text="";
public String lat="";
@SerializedName("long") public String lon="";
}
private static class response{
private int count = 0;
private items[] items = new items[0];
}
private static class PhotoJson {
private response response = new response();
}
public static ArrayList<items> getAllPhotoById(String vkid, String token) throws IOException {
int offset = 0; // Данная переменая используется для сдвига массива сообщений при запросе с vk.com
int count = 0; //Общее число сообщений
ArrayList<items> mass= new ArrayList<items>();
Gson gson = new Gson(); // JSON Парсер
41
String
str
=
HttpGet-
ter.sendGet("photos.getAll?owner_id="+vkid+"&offset="+offset+"&count=0&extended=0&photo_sizes=0&no_service_albums
=0&v=5.16",token);
PhotoJson PhotoObj = gson.fromJson(str,PhotoJson.class);
count = PhotoObj.response.count;
System.out.println(count);
System.out.println(token);
if(count!=0) {
if(count<=200) {
str
=
HttpGet-
ter.sendGet("photos.getAll?owner_id="+vkid+"&offset="+offset+"&count="+count+"&extended=0&photo_sizes=0&no_service
_albums=0&v=5.16",token);
PhotoObj = gson.fromJson(str,PhotoJson.class);
for (items i : PhotoObj.response.items) {
if(i.lat!=null)
mass.add(i);
}
}
else {
if(count%200== 0) {
int size = count / 200;
for (int i = 0; i < size; i++) {
str
=
HttpGet-
ter.sendGet("photos.getAll?owner_id="+vkid+"&offset="+offset+"&count=200&extended=0&photo_sizes=0&no_service_albu
ms=0&v=5.16",token);//Запрос на получение фото.
PhotoObj = gson.fromJson(str, PhotoJson.class);
for (items k : PhotoObj.response.items) {
if(k.lat!=null)
mass.add(k);
}
offset=offset+200;
}
}
if(count%200!=0) {
int size = count / 200;
int last = count % 200;
for (int i = 0; i < size; i++) {
str
=
HttpGet-
ter.sendGet("photos.getAll?owner_id="+vkid+"&offset="+offset+"&count=200&extended=0&photo_sizes=0&no_service_albu
ms=0&v=5.16",token);//Запрос на получение фото.
PhotoObj = gson.fromJson(str, PhotoJson.class);
for (items k : PhotoObj.response.items) {
if(k.lat!=null)
mass.add(k);
}
offset=offset+200;
42
}
str
=
HttpGet-
ter.sendGet("photos.getAll?owner_id="+vkid+"&offset="+offset+"&count="+last+"&extended=0&photo_sizes=0&no_service_
albums=0&v=5.16",token);//Запрос на получение фото.
PhotoObj = gson.fromJson(str,PhotoJson.class);
for (items k : PhotoObj.response.items) {
if(k.lat!=null)
mass.add(k);
}
}
}
}
return mass;
}
}
package vk;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.ArrayList;
public class VkWall {
public class groups {
public String id = "";
public String name = "";
}
public class attachments {
public String type="";
public String id="";
public String owner_id="";
public String title="";
public String desctiption="";
}
public class copy_history {
public String id = "";
public String owner_id = "";
public String from_id = "";
public String text = "";
}
public class items {
public String id="";//id фото
public String owner_id="";
public String text="";
public copy_history[] copy_history = new copy_history[0];
43
public attachments[] attachments = new attachments[0];
}
private static class response{
public int count = 0;
public items[] items = new items[0];
public groups[] groups = new groups[0];
}
private static class WallJson {
private response response = new response();
}
public static class result {
public ArrayList<items> items = new ArrayList<VkWall.items>();
public ArrayList<groups> groups = new ArrayList<VkWall.groups>();
public ArrayList<copy_history> hist = new ArrayList<copy_history>();
public String owner_id = "";
public int error_code = 0;
}
public static result getWallById(String vkid, String token) throws IOException {
int offset = 0; // Данная переменая используется для сдвига массива сообщений при запросе с vk.com
int count = 0; //Общее число сообщений
result rslt = new result();
ArrayList<items> mass = new ArrayList<items>();
ArrayList<groups> groupsArrayList = new ArrayList<groups>();
ArrayList<copy_history> hist = new ArrayList<copy_history>();
Gson gson = new Gson(); // JSON Парсер
String
str
=
HttpGetter.sendGet("wall.get?owner_id="
+
vkid
+
"&offset="
+
offset
+
"&count=0&extended=1&filter=all&v=5.7", token);
if (!str.contains("error_msg: 'User was deleted or banned'")) {
WallJson WallObj = gson.fromJson(str, WallJson.class);
count = WallObj.response.count;
// System.out.println("Ожидается получение стены:" + count);
// if ((count < 2000)&(count>100)) { // Искуственный счетчик для увелечения производительности
if (count != 0) {
if (count <= 200) {
str = HttpGetter.sendGet("wall.get?owner_id=" + vkid + "&offset=" + offset + "&count=" + count +
"&extended=1&filter=all&v=5.7", token);
WallObj = gson.fromJson(str, WallJson.class);
for (items i : WallObj.response.items) {
if ((i.text.length() > 0)) {
mass.add(i);
} else if (i.copy_history != null) {
if (i.copy_history[0].text.length() > 0)
hist.add(i.copy_history[0]);
}
44
}
if (WallObj.response.groups.length > 0)
for (groups g : WallObj.response.groups) {
groupsArrayList.add(g);
}
} else {
if (count % 200 == 0) {
int size = count / 200;
for (int i = 0; i < size; i++) {
str = HttpGetter.sendGet("wall.get?owner_id=" + vkid + "&offset=" + offset + "&count=" + count +
"&extended=1&filter=all&v=5.7", token);//Запрос на получение фото.
WallObj = gson.fromJson(str, WallJson.class);
for (items k : WallObj.response.items) {
if ((k.text.length() > 0))
mass.add(k);
else if (k.copy_history != null) {
if (k.copy_history[0].text.length() > 0)
hist.add(k.copy_history[0]);
}
}
if (WallObj.response.groups.length > 0)
for (groups g : WallObj.response.groups) {
groupsArrayList.add(g);
}
offset = offset + 200;
}
}
if (count % 200 != 0) {
int size = count / 200;
int last = count % 200;
for (int i = 0; i < size; i++) {
str
=
HttpGetter.sendGet("wall.get?owner_id="
+
vkid
"&count=200&extended=1&filter=all&v=5.7", token);//Запрос на получение фото.
WallObj = gson.fromJson(str, WallJson.class);
for (items k : WallObj.response.items) {
if ((k.text.length() > 0))
mass.add(k);
else if (k.copy_history != null) {
if (k.copy_history[0].text.length() > 0)
hist.add(k.copy_history[0]);
}
}
if (WallObj.response.groups.length > 0)
for (groups g : WallObj.response.groups) {
groupsArrayList.add(g);
}
45
+
"&offset="
+
offset
+
offset = offset + 200;
}
str = HttpGetter.sendGet("wall.get?owner_id=" + vkid + "&offset=" + offset + "&count=" + last +
"&extended=1&filter=all&v=5.7", token);//Запрос на получение фото.
WallObj = gson.fromJson(str, WallJson.class);
for (items k : WallObj.response.items) {
if ((k.text.length() > 0))
mass.add(k);
else if (k.copy_history != null) {
if (k.copy_history[0].text.length() > 0)
hist.add(k.copy_history[0]);
}
}
if (WallObj.response.groups.length > 0)
for (groups g : WallObj.response.groups) {
groupsArrayList.add(g);
}
}
}
}
rslt.groups = groupsArrayList;
rslt.items = mass;
rslt.hist = hist;
} else {
//System.out.println("Отмена получения!");
rslt.error_code = 1;
}
return rslt;
}
}
package Сlassifier;
import java.io.IOException;
/**
* Created by Fixit on 06.06.2014.
*/
public class computing {
public
static
double
getCoef(types.diffClass
list1,types.diffClass
Uniq_word_count) throws IOException {
Double result = 0.0;
double Dc = list1.CountUsers;
result += Math.log(Dc/All_User_Count);
for (int i = 0; i < currentUser.words.size();i++) {
46
currentUser,double
All_User_Count,double
double pos = list1.getCount(currentUser.words.get(i).text);
double listSize = list1.words.size()
;
result += Math.log((pos + 1.0)/(Uniq_word_count + listSize));
}
return result;
}
private static double max(double one, double two) {
if(one>two)
return two;
else
return one;
}
public static double getPersentFromLog(double one,double two) {
int max = (int) max(one,two);
one -= max;
two -= max;
double result = (Math.exp(one)/(Math.exp(one)+Math.exp(two)));
return result;
}
}
package Сlassifier;
import vk.VkWall;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by Fixit on 04.06.2014.
*/
public class helper {
public static String deleteAllSymbols(String input) {
String result = "";
input = input.toLowerCase();
for (int i = 0;i<input.length();i++) {
if(((input.charAt(i)>='a')&(input.charAt(i)<='z'))|(input.charAt(i)==' ')|((input.charAt(i)>='а')&(input.charAt(i)<='я'))) {
result = result + input.charAt(i);
}
}
return result;
}
public static String generateId(int Min,int Max) {
String id = "";
int idint = Min + (int)(Math.random() * ((Max - Min) + 1));
id = id + idint;
return id;
47
}
public static types.diffClass generateWords(VkWall.result input) {
types.diffClass mass = new types.diffClass(1);
for (int i = 0;i < input.items.size();i++) {
String[] parts = helper.deleteAllSymbols(input.items.get(i).text).split(" ");
for (int j = 0; j<parts.length;j++) {
mass.addToList(parts[j]);
//
System.out.print(parts[j]+" ");
}
// System.out.println();
}
for (int i = 0;i < input.hist.size();i++) {
String[] parts = helper.deleteAllSymbols(input.hist.get(i).text).split(" ");
for (int j = 0;j<parts.length;j++) {
mass.addToList(parts[j]);
// System.out.print(parts[j]+" ");
}
//System.out.println();
}
return mass;
}
public static String getRandomGroupId(ArrayList<String> ids) throws IOException {
String result;
int index = Integer.parseInt(generateId(0,ids.size()));
result = ids.get(index);
return result;
}
}
package Сlassifier;
import vk.FileWorker;
import vk.VkWall;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by Fixit on 04.06.2014.
*/
public class learn {
public static types.diffClass getRandomPeople(int Count) throws IOException {
types.diffClass result = new types.diffClass(Count);
int i = 0;
while(i<Count) {
String id = helper.generateId(1, 200000000);
48
String token = getToken();
VkWall.result wall = VkWall.getWallById(id, token);
int size = wall.items.size()+wall.hist.size();
//System.out.println("Получено сообщений с текстом:"+size);
if((wall.error_code == 0)&(size>50)&(size < 2000)) {
result.concatination(helper.generateWords(wall));
i++;
System.out.println("Получил "+(i)+" пользователя!");
}
}
return result;
}
public static types.diffClass getProgrammerList(int Count) throws IOException {
types.diffClass result = new types.diffClass(Count);
int i = 0;
ArrayList<String> ids = FileWorker.read2("C://ids.txt");
while(i < Count) {
String token = getToken();
String id = helper.getRandomGroupId(ids);
VkWall.result wall = VkWall.getWallById(id, token);
int size = wall.items.size()+wall.hist.size();
if((wall.error_code == 0)&(size>50)&(size < 2000)) {
result.concatination(helper.generateWords(wall));
i++;
System.out.println("Получил "+(i)+" пользователя!");
}
}
return result;
}
public static String getToken() {
ArrayList<String> token = new ArrayList<String>();
token.add("4b9b61404c950be22b29cd78b2f2f937949ed43edf155dd4da737d87a4db6ede271eb011500039a10487c");
token.add("c507d0dc1098aa7aa58fd204792f8a61e609af2969a2e31fb7b6c3cd757b896f2012368cd06b3d43a5903");
token.add("ff3268281e3a246ca1221f28ee4d50dab71fab123bf7e6edb52e4aecd074e05a50a5946c2ef1355a072a1");
token.add("ebbdd31b68220ba4808e887aa88ce10b1b0143c190cb62128aa4760b58d52032ca5820c475d5cd02960eb");
token.add("15f9366e0ec0c980449933e6436f7dbd89ef8320eeab80eecaf1ada3a721ac960db10529e1bc0c328365a");
token.add("e11444cadde61ab887797608cca37fde94764583b652acac3a95580c267387f74df780fc66ff3ed02cd11");
int idint = 1 + (int)(Math.random() * ((5 - 1) + 1));
return token.get(idint);
}
public static types.diffClass WallToWords(VkWall.result input) {
types.diffClass result = new types.diffClass(1);
result.concatination(helper.generateWords(input));
return result;
}
49
}
package Сlassifier;
import db.Mysql;
import vk.FileWorker;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by Fixit on 16.05.2014.
*/
public class types {
public static class diffClass {
public ArrayList<Word> words;
public int CountUsers;
public diffClass(int CountUsers) {
this.CountUsers = CountUsers;
words = new ArrayList<Word>();
}
public int getId(String word) {
int pos = -1;
for (int i = 0;i<words.size();i++) {
if(words.get(i).text.equals(word)) {
pos = i;
break;
}
}
return pos;
}
public void addToList(String word) {
if(getId(word)!=-1) {
words.get(getId(word)).inc();
}
else {
Word wordClass = new Word(word);
words.add(wordClass);
}
}
private void addToList(Word word) {
if(getId(word.text)!=-1) {
words.get(getId(word.text)).Count += word.Count;
50
}
else {
words.add(word);
}
}
public void concatination(diffClass LitleBro) {
for (int i = 0;i<LitleBro.words.size();i++) {
//addToList(LitleBro.words.get(i));
words.add(LitleBro.words.get(i));
//System.out.println(i+"/"+LitleBro.words.size());
}
}
public int getCount(String word) {
if(getId(word)!=-1) {
return words.get(getId(word)).Count;
}
else {
return 0;
}
}
public void printAll() {
System.out.println("Частоты класса:"+CountUsers+" Cуммарное количество слов:"+words.size());
for (int i = 0;i<words.size();i++) {
System.out.println(words.get(i).text+" "+words.get(i).Count);
}
}
public void saveTxt(String Path) {
String temp = "";
temp = "Частоты класса:"+CountUsers+" Cуммарное количество слов:"+words.size()+System.lineSeparator();
for (int i = 0;i<words.size();i++) {
temp = temp + words.get(i).text+" "+words.get(i).Count + System.lineSeparator();
System.out.println(i + " /"+words.size()+"[OUTPUT]");
}
FileWorker.write(Path,temp);
}
public void printCount() {
System.out.println("Частоты класса:"+CountUsers+" Cуммарное количество слов:"+words.size());
}
public void loadTxt(String Path) {
try {
BufferedReader in = new BufferedReader(new FileReader( new File(Path).getAbsoluteFile()));
try {
String StrLine;
int i = 0;
while ((StrLine = in.readLine()) != null) {
if(StrLine!="") {
51
String[] parts = StrLine.split(" ");
Word word = new Word(parts[0]);
word.inc(Integer.parseInt(parts[1]));
addToList(word);
//words.add(word);
System.out.println(i + " /2043333[INPUT]");
if(i == 2043331) {
System.out.println(parts[1]+" "+parts[0]);
}
i++;
}
}
} finally {
in.close();
}
} catch(IOException e) {
throw new RuntimeException(e);
}
catch (ArrayIndexOutOfBoundsException f) {
System.out.println();
}
}
public void loadBD(String table) {
Mysql sql = new Mysql("root","");
words = sql.loadSimpleList(table).words;
}
public void loadUser(String id) {
Mysql sql = new Mysql("root","");
words = sql.loadCurrentUser(id).words;
}
public void deluser(String id) {
Mysql sql = new Mysql("root","");
sql.deluser(id);
}
}
public static class Word {
public String text = "";
public int Count = 0;
public Word(String word) {
this.text = word;
this.Count = 1;
}
private void inc () {
this.Count = this.Count + 1;
}
private void inc(int count) {
52
this.Count +=count;
}
}
}
import madkit.kernel.Madkit;
import Сlassifier.helper;
import Сlassifier.learn;
import Сlassifier.types;
import java.io.IOException;
public class Main {
static AffableThread[] mass;
public static void main(String[] args) throws IOException {
new Madkit("-launchAgents","Agent.Boss,true,1;Agent.Getter,true,1;Agent.Server,true,1;Agent.Includer,true,1;Agent.Analize,true,1");
}
}
53
Download