Я задумался над тем, чтобы сделать для себя RSS-клиент с обучаемым фильтром статей на NodeJS. В принципе, под ноду есть готовые RSS ридеры, есть готовые нейронные сети с классификаторами, так что написать какой-то прототип мне показалось не особенно сложной задачей.
Я решил начать с тестирования подвернувшихся под руку нейронных сетей. Я взял небольшое количество входных данных. Позитивные данные я скопировал из статей по nodejs с хабра. Негативные данные я нашел на «ленте.ру». Задача классификатора заключалась в том, чтобы отсортировать статьи о программировании и nodejs от обычных, безынтересных для моего развития, новостей.
Результаты работы с Brain и Fann я показывать не хочу — я не считаю, что я обладаю достаточной экспертизой для того, чтобы судить о них. Скажу только что из коробки они меня не устроили совершенно — на моих входных данных они не давали адекватного количества правильных ответов. А вот библиотека Natural меня очень впечатлила.
Далее я покажу как я обучал классификатор, проверял его работу и заставлял понимать русский язык.
Входные данные
Данные, на которых я обучал и тестировал классификатор, можно просмотреть тут. Их достаточно много для статьи, по этому я их вынес отсюда.
Код
'use strict'; var data = require('./data'); var natural = require('natural'), porterStemmer = natural.PorterStemmerRu, classifier = new natural.BayesClassifier(porterStemmer); // Даем classifier'у примеры хороших и плохих данных. for (var i = 0; i < data.good.length; i++) { classifier.addDocument(data.good[i], 'good'); }; for (var i = 0; i < data.bad.length; i++) { classifier.addDocument(data.bad[i], 'bads'); }; // Запускаем обучение на переданных текстах. classifier.train(); // А теперь классифицируем тестовые тексты. console.log('START CLASSIFICATION'); console.log('Test on good'); for (var i = 0; i < data.test_good.length; i++) { console.log("> ",classifier.classify(data.test_good[i])); }; console.log('Test on bad'); for (var i = 0; i < data.test_bad.length; i++) { console.log("> ",classifier.classify(data.test_bad[i])); };
Результат
START CLASSIFICATION Test on good > good > good > good > good Test on bad > bads > bads > bads > bads > good > bads > bads > good
Поддержка русского языка
По умолчанию, классификатор не понимает русский язык. Для качественной классификации в Natural используется компонент «stemmer», который разбивает текст на массив из слов, удаляет бесполезные слова (так называемые stopwords) и обрезает окончания слов.
Чтобы включить поддержку русского языка нужно проинициализировать стиммер с поддержкой языка:
var porterStemmer = natural.PorterStemmerRu;
И передать его в классификатор, заменив используемый по-умолчанию английский стиммер:
var classifier = new natural.BayesClassifier(porterStemmer);
Теперь текст внутри классификатора будет обрабатываться правильно, с учетом особенностей русского языка.
PS
Честно говоря, у меня нет опыта классификации информации, но результаты работы Natural меня впечатлили. Правда, я не нашел какой-то более-менее серьезной документации по проекту кроме readme на github. И для того, чтобы понять как включить русский язык мне пришлось порыться в исходниках, но чего-то сверхсложного в этом не было, и, я считаю, что результат того стоил!
ссылка на оригинал статьи http://habrahabr.ru/post/193738/
Добавить комментарий