Сделал библиотеку для предобработки текстов, формирования term-text матрицы

Вероятно, доделал основу библиотеки для предобработки текстов, нужную мне периодически. Надоело каждый раз писать одно и то же — решил сделать библиотеку. Функционал ее очень простой — на вход ей подаются тексты — например, их можно импортировать из txt файлов. В одном файле может быть несколько текстов, разделенных заранее определенной последовательностью символов. Далее задается список операций, которые можно произвести над текстом в любом количестве и любой последовательности. Сейчас доступны следующие операции:

  • токенизация (на слова, предложения, абзацы)
  • стемминг (для русского языка)
  • удаление email
  • удаление URL
  • хештегов
  • удаление JS и HTML
  • удаление пунктуации
  • удаление коротких слов
  • удаление самостоятельных чисел (в строке «по небу летело 5 пингвинов» будет удалено «5»)
  • удаление стоп слов (для русского языка)
  • формирование n-грамм

Применив операции к текстам, получаем очищенные от ненужного хлама тексты. Каждый текст представлен объектом класса Token (даже исходный нетокенизированный). При этом Token включает в себя список токенов (по умолчанию он null). Допустим, текст был подвергнут токенизации, в результате чего мы получили список слов — эти токены можно (но не обязательно) сделать дочерними токенами объекта текста.

Далее из полученных токенов (хранящих в себе id текста) или токенов + текстов можно сформировать term-text матрицу. Матрицу можно выгрузить в csv (реализацию для других форматов пока не сделал — собственно, думаю, и этого достаточно, и только это мне и нужно было). Подумал, что и импорт, и экспорт тоже стоит добавить в библиотеку.

Библиотека находится на гитхабе ТУТ. Вероятно, многое еще придется подправить и добавить: подправлю и добавлю.

Разрабатывая ее, попробовал немного TDD. Библиотека сделана на C#, .NET Standart. Тесты на XUnit. В солюшене есть небольшое консольное демо приложение.

По плану дальше сделать WPF и/или ASP.NET CORE MVC приложение, где будет использоваться эта библиотека (так как не пробовал ранее писать ничего ни на WPF ни на ASP.NET CORE). Для десктопных приложений использовал только WinForms (ну и Swing и JAVA FX на джава больше года назад)  — надо заполнить этот пробел.

Баг в инверсии матриц

В библиотеке для машинного обучения, которую сейчас пишу, кажется, косяк в расчете инверсии для матрицы. Очень странно. Может быть, буду искать баг, а может и забью. Может быть, как-нибудь потом поразбираюсь дальше… Может быть, какие-то особенности инверсии, которые я не знаю. Хотя странно очень — раньше не наблюдались проблемы… Как бы то ни было — начинаю разбирать F#. Для работы с матрицами, пожалуй, буду использовать не свою библиотеку (просто для верности и из нежелания искать баг в инверсии, если дело вообще в ней). В общем-то, свою цель библиотека частично выполнила — я разобрал основы работы с матрицами и написал несколько методов регрессии… По большому счету — на этом можно и остановиться в разработке этой библиотеки. Хотя… хз…

Парная регрессия — параболы второго, третьего и пр порядка

В библиотеку машинного обучения добавил еще одну регрессию — парную регрессию n-порядка. Класс ВОТ ТУТ. Формат использования такой же, как и у других регрессий. Вот пример:

Matrix mParabolaRegression = Matrix.GetMatrixFromTXT("data\\parabola_regression.txt", '\t');
            NOrderSimpleParabolaRegression nospr = new NOrderSimpleParabolaRegression();
            Matrix z = nospr.GetRegressionCoefficients(mParabolaRegression, 2);
            double yVal = nospr.GetYForVectorX(z, 84.0);

GetMatrixFromTXT — статический метод получения матрицы из файла. Указывается путь к файлу и разделитель столбцов.

Далее создается объект парной регрессии параболы n-порядка.

Далее получаем коэффициенты для формулы расчета зависимой переменной y: y = a + bx + cx^2

Используя коэффициенты рассчитываем y для заданного предиктора x:

double yVal = nospr.GetYForVectorX(z, 84.0);

То есть в примере ищем y для x = 84.

Множественная линейная регрессия на C#

Поскольку на прошлой неделе сделал реализацию работу с матрицами на c# — самое время ими воспользоваться. Собственно, пока что сделал только множественную линейную регрессию. Класс для работы с ней находится ВОТ ТУТ.

Для начала создаем объект множественной линейной регрессии: Читать далее Множественная линейная регрессия на C#

C#. Матрицы: Умножение на скаляр. Инвертирование, транспонирование, детерминант. Сложение, вычитание и умножение

Для реализации множественной линейной регрессии потребовалось поработать с матрицами — а именно, научиться их перемножать, транспонировать и инвертировать. Поскольку ничего такого раньше делать не умел, решил самостоятельно реализовать это в библиотеке машинного обучения, которую сейчас пишу (такой вот способ изучения машинного обучения с нуля придумал для себя).

Библиотека находится на github ВОТ ТУТ. Пока что всё в ней написано на c#. Может быть, еще добавится что-то функциональное — но никак не могу выбрать между F# и всем остальным… По уму-то — нужен F#, так как всё же это у меня .NET. Но вот F#, кажется, сейчас уже никому не нужен, поэтому не знаю, какой язык осваивать.

Итак, создаем матрицу. Конструктор принимает двухмерный массив double — собственно, саму матрицу:

double[,] a = new double[3, 3];
            sqvArr[0, 0] = -1;
            sqvArr[0, 1] = -2;
            sqvArr[0, 2] = 2;
            sqvArr[1, 0] = 2;
            sqvArr[1, 1] = 1;
            sqvArr[1, 2] = 1;
            sqvArr[2, 0] = 3;
            sqvArr[2, 1] = 4;
            sqvArr[2, 2] = 5;

            Matrix matrixA = new Matrix(a);

Читать далее C#. Матрицы: Умножение на скаляр. Инвертирование, транспонирование, детерминант. Сложение, вычитание и умножение

Простая линейная регрессия на C#

Как уже писал, занимаюсь освоением самых- самых основ machine learning. В курсах и литературе по ML обычно начинают с простой линейной регрессии. Предварительно обучив по массиву значений одной независимой переменной (X) и массиву значений зависимой от ней второй переменной (Y), можно для какого-либо x получить предположительное y. Например, по росту предположить вес.

Код написал на c#. Он находится на гитхабе — ВОТ ТУТ . Это библиотека, в которой на настоящий момент нет ничего, кроме класса простой линейной регрессии 🙂 Читать далее Простая линейная регрессия на C#

создал-таки блог для заметок по изучению программирования

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

На текущий момент занимаюсь разработкой всего полтора года. За это время постоянно метался — от PHP в самом начале, к JAVA чуть позже и потом к C#. Сейчас что-то серверное пишу на C#, а джава мне нужна, чтобы учиться что-то писать под ведроид.

В планах заниматься F# и/или Groovy и/или Python. В планах Machine Learning. Учитывая то, что математика давно забыта (начал повторять школьный курс, полупрогуленный в старших классах, а другой математики и не было) — это будет непростой и долгий путь 🙂 Но попробовать можно. Из реализованного на JAVA — байесовский наивный классификатор для работы с текстами (там же и стеммер, работа с униграммами и биграммами, стоп слова и пр) и простая линейная регрессия. В общем в этом отношении я в самом-самом начале. Сейчас начал читать книжечку «Statistics in a nutshell». Чуть-чуть позже попутно буду читать «Мат анализ с человеческим лицом». Смотрю всяко-разно на youtube, на khan academy и что-то хаотично почитываю.

По самому программированию без всяких машинных обучений — есть кучи пробелов в знаниях. Например, паттерны — очень мало их применяю и очень неумело. Никак не расправлюсь с книгой «Алгоритмы и структуры данных JAVA». Да и очень много всего начато и не закончено… Надеюсь, за 2017 год, который только только начался, успею заполнить эти пробелы.

Больше всего сейчас интересует machine learning, (в первую очередь в связке с Natural Language Processing) и мобильная разработка. Весь этот год, чтобы не метаться, хотелось бы и дальше ограничиваться только Android и не лезть в IOS. Вряд ли продержусь весь год и таки начну разбирать IOS (что в общем, наверное, будет большой ошибкой).