Навигация
Главная »  Новости 

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


Источник: habrahabr
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
 
 
В коде выше мы только сгенерили модель. А теперь проверим ее в деле, код ниже анализирует текст и выдает оценку принадлежности к тому или иному языку.  Файл run.php
 
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 dzie1o literackie, pracuje na języku. 
To w1aś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 uk1ad elementów treściowych i formalnych dzie1a dokonanych wed1ug określonych zasad konstrukcyjnych. Kszta1towanie tworzywa dzie1a literackiego jest procesem skomplikowanym i przebiegającym na wielu poziomach. Sk1ada 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-граммы и по ним классифицировать, это будет еще надежнее, можно оба варианта комбинировать. Нейронные сети мощный инструмент, нужно лишь научиться им пользоваться
 



 

 Crystal Applications экономит время и деньги.
 Специфика DDoS-атак в России.
 Тонкая оптимизация бизнес-процессов.
 MoReq: Европейские типовые требования к автоматизированным системам электронного документооборота (документация, download).
 Из "айтишников" в директора.


Главная »  Новости 

© 2017 Team.Furia.Ru.
Частичное копирование материалов разрешено.