+7 (495) 229-0436   shopadmin@itshop.ru 119334, г. Москва, ул. Бардина, д. 4, корп. 3
 
 
Вход
 
 
Каталог
 
 
Подписка на новости
Новости ITShop
Windows 7 и Office: Новости и советы
Обучение и сертификация Microsoft
Вопросы и ответы по MSSQLServer
Delphi - проблемы и решения
Adobe Photoshop: алхимия дизайна
 
Ваш отзыв
Оцените качество магазина ITShop.ru на Яндекс.Маркете. Если вам нравится наш магазин - скажите об этом Google!
 
 
Способы оплаты
 
Курс расчета
 
 1 у.е. = 91.78 руб.
 
 Цены показывать:
 
 
 
 
  
Новости, статьи, акции
 

Построение нейронных сетей в php используя FANN, пример реализации

16.11.2012 11:51
rechik

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

Поскольку данные для анализа формируются в php и мне этот язык сейчас ближе всего, то искалась библиотека с интерфейсом для php. В связи с этим мне порекомендовали FANN (Fast Artificial Neural Network) - открытое программное обеспечение для построения сетей. У этого решения есть апи для 15 языков, так что почти каждый сможет выбрать что-то для себя. 

 

Пример. Распознавание языка текста на странице

Для примера возьмем задачу легкую, но недалекую от нашей реальности и от серьезных задач. Допустим есть 1000 документов, на 3-х разных языках. Пусть это будут французский, английский и польский. Наша задача научить нейронную сеть распознавать язык документа. Для этого мы используем самый простой частотный механизм. Но тем не менее его результаты неплохи. Его суть в том, что у каждого языка с разной частотой в тексте встречаются одни и те же символы. Мы подготавливаем 3 больших куска текста для каждого из языков (английский, французкий, польский), посчитаем для каждого символа частоты. Эти данные мы передадим в нейронную сеть, с указанием какой набор частот принадлежит каждому из языков. Дальше нейронная сеть все сделает сама.

 

Начнем с установки FANN

Пример, установки привожу для Ubuntu.

1) Нужно установить пакеты libfann1 и libfann1-dev
 

apt-get install libfann* 

2) Добавить поддержку fann в php 
У меня стоит Apache и установлен модуль php5-dev, поэтому я делаю так
 


# wget http://pecl.php.net/get/fann
# tar xvfz  fann
# cd fann-0.1.1
# phpize
# ./configure
# make

Если при компиляции появиться ошибки и среди них будет вот такая 

fann.c:393: error: "zif_fannOO___set" undeclared (first use in this function)

то следует отредактировать файл php_fann.h и за комментировать строчку 28 #define PHP_FANN_OO 1
После этого заново скомпилировать.

В итоге у нас генерируются модули которые нужно подключить к php
 

sudo cp -R ./modules/* /usr/lib/php5/20090626+lfs/

И в php.ini дописать
 

extension=fann.so

Перегрузили апач и проверили что все ок
 

php -m / grep fann

 

Решение задачи

Для этого нужно выполнить 2 шага:
1) Обучить сеть (первый листинг)
2) И использовать готовую модель для классификации (второй листинг)

Приведу пример для первого этапа и сразу укажу ссылку на документацию

Код я максимально снабдил комментариями, что бы было понятно что к чему и не разбирать его отдельно.

Файл train.php
 

<?php

/*
 * Задаем параметры сети. 256 - это количество входов, оно должно равняться количеству ваших параметров,
 * По хорошему в этом примере должно быть намного меньне, равно количесству букв в алфавитах.
 * 128 - это количество нейронов в промежуточном слое. Здесь нуужно экспериментальным путем подбирать это число.
 * 3 это количество выходящих сигналов. По скольку у нас 3 языка, то для каждого будет возвращена вероятность
 * 1.0 - connection_rate - его лучше не менять
 * 0.7 - learning_rate - описано здесь хорошо http://www.basegroup.ru/glossary/definitions/learning_rate/
 * */
$ann = fann_create(array(256, 128, 3), 1.0, 0.7);

/*
 * Первый параметр - указатель на нашу сеть, второй - обучающие данные.
 * Мы загружаем 3 порции данных.Каждая порция состоит их входящих показателей и эталонных результирующих.
 * В нем мы сообщаем, что при таких показателях, как мы сейчас передаем, нужно весь вес
 * отдавать на первы нейрон (array(1, 0, 0) // Outputs). при загрузке других типов данный мы смещаем вес на другой нейрон
 * generate_frequencies - просто расчитывает частоты.
 *
 * Последние 3 параметра это
 * - максимальное кол-во итераций
 * - максимальное кол-во ошибок
 * - промежуток между выводами информации 
 * 
 * В файлах en.txt, fr.txt, pl.txt хранится текс размером где-то в 10000 символов для конкретного языка
 * */
fann_train($ann,
    array(
        array(
            generate_frequencies(file_get_contents("en.txt")), // Inputs
            array(1, 0, 0) // Outputs
        ),
        array(
            generate_frequencies(file_get_contents("fr.txt")), // Inputs
            array(0, 1, 0) // Outputs
        ),
        array(
            generate_frequencies(file_get_contents("pl.txt")), // Inputs
            array(0, 0, 1) // Outputs
        ),
    ),
    100000,
    0.00001,
    1000
);

/*
 * Сохранить нашу модель в файл. в дальнейшем ее можно использовать для класификации
 * */
fann_save($ann,"classify.txt");


/*
 * Функция расчета частот
 * */
function generate_frequencies($text){
    // Удалим все кроме букв
    $text = preg_replace("/[^\p{L}]/iu", "", strtolower($text));

    // Найдем параметры для расчета частоты
    $total = strlen($text);
    $data = count_chars($text);

    // Ну и сам расчет
    array_walk($data, function (&$item, $key, $total){
        $item = round($item/$total, 3);
    }, $total);

    return array_values($data);
}

?>

В коде выше мы только сгенерили модель. А теперь проверим ее в деле, код ниже анализирует текст и выдает оценку принадлежности к тому или иному языку. 

Файл run.php
 

<?php

/*
 * Загружаем модель из файла. Эту модель мы создали на предыдущем шаге.
 * */
$ann = fann_create("classify.txt");


/*
 * Ниже я в нашу сеть передаю 3 текста на разных языках
 * Смотрим результат
 * */

$output = fann_run($ann, generate_frequencies("ANN are slowly adjusted so as to produce the same output as in
            the examples. The hope is that when the ANN is shown a new
            X-ray images containing healthy tissues"));

var_dump($output);

$output = fann_run($ann, generate_frequencies("Voyons, Monsieur, absolument pas, les camions d"aujourd"hui ne se traînent pas, bien au contraire. 
Il leur arrive même de pousser les voitures. Non, croyez moi, ce qu"il vous faut, c"est un camion !
     - Vous croyez ? Si vous le dites. Est-ce que je pourrais l"avoir en rouge ?
     - Bien entendu cher Monsieur,vos désirs sont des ordres, vous l"aurez dans quinze jours clé en main. 
Et la maison sera heureuse de vous offrir le porte-clé. Si vous payez comptant. Cela va sans dire, ajouta Monsieur Filou.
     - Ah, si ce "));

var_dump($output);

$output = fann_run($ann, generate_frequencies("tworząc dzieło literackie, pracuje na języku. 
To właśnie język stanowi tworzywo, dzięki któremu powstaje tekst. Język literacki 
( lub inaczej artystyczny) powstaje poprzez wybór odpowiednich środków i przy wykorzystaniu odpowiednich zabiegów technicznych.
            Kompozycja - jest to układ elementów treściowych i formalnych dzieła dokonanych według określonych zasad konstrukcyjnych.
            Kształtowanie tworzywa dzieła literackiego jest procesem skomplikowanym i przebiegającym na wielu poziomach.
            Składa się na nie:"));

var_dump($output);

?>

 

Результат

Наша модель сгенерировала следующие ответы по текстам. 
В первом случае модель решила что ей на вход передали английский язык (98%) и она права
 


array(3) {
  [0]=>
  float(0.98745632171631)
  [1]=>
  float(0.0094089629128575)
  [2]=>
  float(0)
}

Во втором тексте она приняла решение в пользу французского и снова оказалась права
 


array(3) {
  [0]=>
  float(0)
  [1]=>
  float(0.99334162473679)
  [2]=>
  float(0)
}

Третий текст она тоже правильно распознала, как польский
 


array(3) {
  [0]=>
  float(0.015697015449405)
  [1]=>
  float(0)
  [2]=>
  float(1)
}

Некоторые пользователи жалуются что нейронные сети выдают вероятности, а не конкретный ответ. Для тех кто в танке добавлю, что в нашем мире все основано на вероятностях. За правильный ответ нужно считать тот который верен хотя бы на 90%, если меньше то сеть нужно до обучать, что бы улучшить классификацию.

Не смотря на такую простую систему нейронная сеть дает хорошие показатели. Можно сделать n-граммы и по ним классифицировать, это будет еще надежнее, можно оба варианта комбинировать. Нейронные сети мощный инструмент, нужно лишь научиться им пользоваться
 

Ссылки по теме

  
Помощь
Задать вопрос
 программы
 обучение
 экзамены
 компьютеры
Бесплатный звонок
ICQ-консультанты
Skype-консультанты

Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 
Бестселлеры
Курсы обучения "Atlassian JIRA - система управления проектами и задачами на предприятии"
Microsoft Windows 10 Профессиональная 32-bit/64-bit. Все языки. Электронный ключ
Microsoft Office для Дома и Учебы 2019. Все языки. Электронный ключ
Курс "Oracle. Программирование на SQL и PL/SQL"
Курс "Основы TOGAF® 9"
Microsoft Office 365 Персональный 32-bit/x64. 1 ПК/MAC + 1 Планшет + 1 Телефон. Все языки. Подписка на 1 год. Электронный ключ
Курс "Нотация BPMN 2.0. Ее использование для моделирования бизнес-процессов и их регламентации"
 

О нас
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.

На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям.

Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе.

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



 

О нас

 
Главная
Каталог
Новинки
Акции
Вакансии
 

Помощь

 
Общая справка
Как оформить заказ
Тарифы доставки
Способы оплаты
Прайс-лист
Карта сайта
 

Способы оплаты

 

Проекты Interface Ltd.

 
Interface.ru   ITShop.ru   Interface.ru/training   Olap.ru   ITnews.ru  
 

119334, г. Москва, ул. Бардина, д. 4, корп. 3
+7 (495) 229-0436   shopadmin@itshop.ru
Проверить аттестат
© ООО "Interface Ltd."
Продаем программное обеспечение с 1990 года