Pull to refresh

Comments 43

Первый абзац сразу напомнил антиутопию «Механическое пианино» Курта Воннегута. Правда, там замена людей механизмами приводит к не самым лучшим последствиям.
Как-то пользовался кинопоиском и не задумывался, насколько он сложный. Теперь буду по-другому на него смотреть.
нет, ну в Кинопоиске, я полагаю все же, в зависимости от оценки рецензия окрашивается, так что подобного нагромаждать не пришлось.
Но с классификатором было бы куда веселей.
Забавно, но на кинопоиске я видел отрицательные рецензии с 7/10, нейтральные с 5/10 и положительные с теми же 5/10.
Однозначно они окрашиваются по другому признаку.
Ну, возможно, сам пользователь определяет. У меня акка на Кинопоиске нет)
Кстати, название статьи намекает на YACC?
Не понравилось. Слишком много пафоса, слишком мало выхлопа, и новизна этого выхлопа равна нулю.
всегда найдётся тот, для кого в статье нет ничего нового. Как и тот, для кого она окажется полезной. По любой технологии оч много книжек, и все они повторяются на 90% — но все они приносят пользу.

Так что я бы не был столь категоричен.
И какова же польза от этого поста при условии того, что он просто пересказывает один из фрагментов стэнфордского NLP в пафосной «бульварной» обертке, характерной для креатива студентов младших курсов? :-)
1. не все проходили стенфордские курсы.
2. статья вовсе не пересказывает курс.
3. знания по NLP, machine learning, sentiment analysis, opinion mining я получил задолго до появления вышеозначенных курсов и так совпало, что теор. принципы, лежащие в их основе не изменились с тех пор. Поэтому они одни для меня, для стенфорда и для всех остальных. Все что остается — выбрать обертку. Она Вам, увы, не понравилась.
Теоретические принципы вы тоже так себе получили. К примеру, «ядерных классификаторов» не существует, а kernels лежат в основе метода опорных векторов.
Ну, напишите тогда о «ядерных классификаторах», что ли :-) Будет интересно почитать. Подозреваю, что мнезапно выяснится, что это просто использование kernels в функциях гипотезы SVM и — таки да — нейросетях, и отдельным классификатором, стало быть, они являются где-то так же, как градиентный спуск и метод обратной пропагации.

Но, может быть, вы сможете рассказать мне что-то новое. Вот это уже и правда будет интересно.
Подозреваю, что внезапно выяснится, что я бульварно-пафосно пересказываю книгу или еще что-нибудь) Но спасибо за предложение, возможно я так и сделаю. Хотя Вас, конечно, сложно чем-то удивить.
Ну, название той книжки с английского корректно переводится как «самообучаемые классификаторы с использованием kernel метода», а вовсе не «ядерные классификаторы». Т.е. сами типы классификаторов остаются теми же, что и были — регрессии, SVM, нейросети. А вот уже внутри них используется этот самый кернел-метод.
Все началось с того, что ядерных классификаторв не бывает вовсе, а ядра используются только в SVM — тут Вы не достигли особых успехов в обосновании своей позиции. Теперь начинается спор о том, кто «корректнее» умеет переводить и правильно выбирать названия. Может сразу расстегнем ширинки и решим все по-мужски?
Повторяю еще раз, для студентов: ядерных классификаторов не существует. В SVM ядра используются.

Не спорьте со старшими.
Вау, вот это действительно аргумент взрослого человека, браво. Все, теперь ни за что не буду спорить с Вами)
В описании книги, на которую вы сослались, говорится про применение ядер в классических классификаторах, таких как SVM и нейронные сети. Гугль по запросу «kernel classifier» после этой книги сразу выдаёт статью по тому же SVM. Судя по статьям, которые я читал раньше, идея использования ядер появилась (или по крайней мере получила распространение) в SVM, а затем начала распространяться на другие классификаторы, в т.ч. на нейронки. Так что я не вижу смысла доказывать, что «ядерные классификаторы» не являются чем-то обособленным, лучше вы попробуйте доказать, что действительно существует отдельное направление ядерерных классификаторов. Иначе мы придём к обсуждению чайника Рассела.
1. Я нигде в статье не обсуждал kernel classifiers, я их просто упомянул. Вы же спорите со мной о том, что это такое.
2. Изначально спор велся о том, что kernel classifiers не существует.
3. Судя по научной литературе (1, 2, 3, 4,… далее гугл) kernel classifiers обсуждаются достаточно обособленно, хотя, безусловно, обсуждается именно применение ядер в существующих классификаторах.
4.К несчастью, я не знаком с критерием «отдельности направления», но если Вы его поведаете мне, я может что-нибудь и докажу, а может и провалюсь. Как знать.
1. Изначально вам намекнули, что «ядерные классифиаторы» не имеет смысла выделять в отдельное направление, ибо без других методов, таких как метод опорных векторов или нейронные сети, использование ядер попросту невозможно. Использование ядра — это не классификация, это метод преобразования данных, деталь, такая же как процедура обратного распространения или градиентный спуск. Вы начали с этим спорить, из-за чего и разгорелась дискуссия.
2. Выражение «kernel classifier», так же, как существуют выражения «fast classifier», «text classifier», «linear classifier» и т.д., но ни одно из этих выражений не обозначает отдельный тип классификаторов, а только показывает некоторое их свойство (по правилам английского языка kernel в данном случае перехрдит в разряд прилагательных). Пример с linear classifier особенно показателен: выражение просто указывает на способ комбинирования переменных, но при этом к линейным классификаторам относится целый ряд методов, в т.ч. SVM (безядерный), logistic regression, naive bayes, etc. Поэтому никак нельзя написать «существуют другие методы классификации, такие как метод опорных векторов, логичстическая регрессия, линейный классификатор, ...». Это просто некорректно с т.з. логики.
3. См. выше.
4. Отдельный метод классификации — это как минимум метод классификации, т.е. описание конкретных шагов, необходимых для выполнения классификации объектов. А непосредственно ядра, как уже было сказано выше, классификацию не выполняют.
1. Нет, Вы не правы, мне никто на это не намекал, мне сказали, а потом повторили, что их не существует. И опять же Вы не правы, я ни с кем не обсуждал обратное распространение и градиентный спуск. Но я ценю Вашу фантазию.
2. Теперь мы спорим, что такое «отдельный тип классификатора»? Хорошо, тогда, следуя Вашей же логике naive bayes «не обозначает отдельный тип классификатора, а только показывает некоторое свойство». И здесь naive bayes по правилам английского языка тоже отнюдь не существительные(я, кстати, kernel classifiers первел как Вы и хотели — «ядерные классификаторы»)
3. Ну под такое определение можно что угодно подобрать. Не особо сложно классификацию с использованием ядер описать конкретными шагами.
И хотелось бы узнать от Вас, что именно «непосредственно выполняет» классификацию.
1. Ещё раз говорю: отдельного метода «ядерный классификатор» не существует. Судя по гуглю, ядерными называют подмножество методов классификации, использующих в своей работе функцию ядра. Так же, как линейными называют классификаторы, комбинирующие переменные линейно.

2. Речь не о терминологии, речь о логике. Нарисуйте круги Эйлера: для байеса у вас будет один большой круг всех байесовских классификаторов, в нём полностью помещается круг наивных байесовских классификаторов, а в нём несколько подвидов наивных байесовских классификаторов, таких как полиномиальных байесовский классификатор, например. Вы не можете нарисовать круг «наивный классификатор», который бы охватывал или хотя бы пересекался с кругом «байесовский классификатор», поскольку понятие «наивности» определено только для байесовского классификатора. В то же время, если вы нарисуете круги Эйлера для нейронных сетей, SVM, и «ядерных классификаторов», то 1) ядерный классификатор окажется на пересечении нейронок и опорных векторов; 2) он не будет выходить дальше кругов этих 2-х классификаторов (ок, ядра могут быть использованы и в других классификаторах, но это только вопрос количества понятий — всё равно ядерный классификатор всегда будет польностью находиться внутри другов других классификаторов).

3. Непосредственно выполняет классификацию — это берёт экземпляр и присваивает ему метку класса. Опишите. Напишите мне алгоритм, который с помощью исключительно ядер присвоит тому же текстовому отзыву метку «pos» или «neg». Мне очень интересно на это посмотреть.
1. Мы еще не определились с понятием того, что же такое «отдельный метод», а Вы уже несетесь куда-то вперед.
2. Ну мы же в данный момент спорим именно о терминологии, каким образом мы перешли в область логики? И, вообще говоря, SVM и перцептрон включают в себя еще всякое. Или Вы думаете классификация на них заканчивается?
3. Нет, мне было интересно кто или что это делает, потому что Вы уверенно сказали, что этим занимаются не ядра.
Вы нарочно не читаете то, что я пишу или это случайность?) «классификацию с использованием ядер». Я нигде не писал про " с помощью исключительно ядер". Опять приступ буйства фантазии.

Серьезно, все это конечно «безумно весело» и я так с Вами могу общаться очень долго, если хотите. Но.
Во-первых, мы спорим о полнейшей ерунде. Да, возможно в статье стоило написать не «ядерные классификаторы», а что-то типа «классификаторы основанные на применении ядер» или «ядерные методы в классификации», чтобы уменьшить количество баттхерта у двух человек. Но Вы правда расцениваете это более, чем незначительную помарку, чтобы в течение нескольких часов расписывать простыни?
Во-вторых, скажу еще раз, что я нигде не написал, что ядерные классификаторы — это отдельный и абсолютно обособленный вид классификации\классификаторов. Вы же решили, что я так сказал и пытаетесь доказать мне, что я не прав.
В-третьих, ну если правда больше не к чему по существу придраться, то может и не стоило. А то похоже на «кажется кто-то в Интернете не прав». Наверняка Вам этот спор наскучал так же, как и мне. Давайте я вот прям заранее признаю, что Вы во всем правы, тогда Вам и отвечать не придется и трать, и мы сэкономим время друг друга.
1. Я уже давно определился и несколько раз объяснил вам, так что догоняйте.

2. Нет, мы говорим о логике. Вы поставили в один ряд понятия, которые по логике ну никак не равнозначны. Я понимаю, что SVM и ANN включают в себя ещё много чего. Я говорил о том, что использование функции ядра не выходит за пределы этих методов:

Классификация пересекается со всеми тремя кругами, но не покрывает их полностью — оба метода используется для регрессии, а нейронки ещё для кластеризации.

3. Значит описать классификацию с помощью только ядер вы не можете, а любые алгоритмы всё равно сведутся к использованию тех же SVM и ANN. Что лично для меня было изначально очевидно. В SVM классификация строится на основании положени относительно гиперплоскости: объект оказался с одной стороны — класс #1, с другой — класс #2. В Naive Bayes — на основании получившейся вероятности: для какого класса она больше, к тому и относим. В логистической регресси/перцептронах примерно так же. Всё, что сами по себе делают ядра, это переводят данные из пространства одной размерности в пространство другой, более высокой. К принятию решения о принадлежности к классу это не имеет никакого отношения. Поэтому название «kernel classifier» не даёт ни малейшего намёка на то, как собственно должна проводиться классификация.

Во-первых, я ещё раз говорю: дело не в названии, а в том, что kernel classifier — это не какой-то метод вроде SVM, Naive Bayes или ANN, а выражение, обозначающее свойство некоторых из упомянутых классификаторов. Так что «классификаторы основанные на применении ядер», «ядерные методы в классификации» и т.д. просто не должны стоять в одном ряду с конкретными методами, ибо это понятия из разных категорий. И это не помарка, это грубая ошибка, вкупе с вашими попытками спорить показывающая глубокое непонимание темы. Так что я настоятельно рекоммендую вам перестать спорить и не усугублять ситуацию.
Во-вторых, как я уже неоднократно отмечал, вы поставили kernel classifiers в один ряд с настоящими методами классификации. Это всё равно что начать перечислять ягоды и сказать: малина, черника, смородина, чёрная,…. Понятно, что ягоды могут быть чёрными, но это не значит, что есть отдельным биологический вид чёрных ягод.
В-третьих, придраться ещё много к чему можно, но учитывая, что вы всё ещё учитесь и, скорее всего, не использовали sentiment analysis на практике, всё это можно простить. Другое дело, что вы начали огрызаться и спорить с гораздо более опытными людьми, кидаясь то в ложные определения, то в демагогию, лишь бы доказать, что вы правы. А вот это уже некрасиво.
Вопрос обеим: может плодотворнее написать статью про ядра в ИНС? Я бы почитал охотнее, чем спор о терминологии.
Я Вам предложил остановиться, но Вы сами не захотели
— О «гораздо более опытных» людях. Мне очень сложно судить о Вашем опыте, он на Вас не написан. Могу судить только по Вашим статьям. Из них я понял, что Вы может запихнуть датасет в R и посмотреть на графики, а так же, то, что по Вашему мнению getters и setters нарушают инкапсуляцию. Простите, что я не восхищен, пусть в своей статье и я тоже не сделал ничего сверхвыдающегося.
— О «грубых ошибках и глубоком непонимании». Вы поговорили о моих, я поговорю о Ваших.
1. Глубокое непонимание: Ваше определение «отдельного метода», с которым Вы «давно определились». Я под это определение могу щас придумать пару-тройку классификаторов, которые на самом то деле вовсе отдельными методами не будут.
2. Грубая ошибка: проблема с диаграммами Эйлера-Венна. Если следовать Вашей логике построения диаграмм, то классификация как раз покроет все три кргуа. А еще она пересечется с кластеризацией на ANN.
3. Глубокое непонимание: Использвание функции ядра выходит за пределы двух этих кругов. Ядра, например, можно и в байесовских классификаторах использовать.
4. Глубокое непонимание: классификация с помощью ядер. Задача: распознавать написанные от руки числа от 0 до 9. Все как обычно: цифры представляют собой картинки черно-белые, признаками будут значения интенсивности для пикселей. Алгоритм простой будет: чтобы классифицировать новую картинку, мы будет относить ее к тому классу, к которому принадлежит наболее схожая(близкая) с ней картинка из обучающей выборки. Для этого зададимся функциями f0,...,f9:
fi:x->R, где х — это вектор признаков (вектор изображения).
Зададимся также метрикой:
|| x — x' || = sqrt[ sigma { фj(x) — фj(x') }^2 ], где j=1..n; ф = (ф1, .., фn) называется feature mapping. Например, это может быть произведением интенсивностей пикселей:
ф = (х1х1, ...,x1xn, x2x1, ...,xnxn). Т.е. можно сказать определяем корреляцию изображений.
Т.о. мы можем представить f следующим образом:
f(x) = sigma(ai) sigma[ фj(xj)фj(x) ] = sigma[ ai k(xi, x)], где i=1..m, j=1..n; m- количество отмапенных объектов из обучающей выборки ф(х1),.., ф(xm); a из R^m; к — ядро, а функция, включающая ядро называется ядерным классификатором (kernel classifier).
5. Глубокое непонимание: «В логистической регресси/перцептронах примерно так же». Соглашусь, что в перцептронах примерное так же. как в SVM. Но регрессия она по-вашему как наивный байес или как SVM?
Вы продолжаете приписывать мне то, что я не говорил. Я уже согласился признать, что допустил незначительную ошибку и неправильно сформулировал свою мысль, но Вам этого мало и Вы продолжаете со мной спорить. После этого именно я виду себя некрасиво. Давайте я еще раз признаю, то что я ошибся, а Вы признаетесь, что не «гораздо более опытный» суперпрофессионал в области машинного обучения?
О «гораздо более опытных» людях. Мне очень сложно судить о Вашем опыте, он на Вас не написан. Могу судить только по Вашим статьям. Из них я понял, что Вы может запихнуть датасет в R и посмотреть на графики, а так же, то, что по Вашему мнению getters и setters нарушают инкапсуляцию. Простите, что я не восхищен, пусть в своей статье и я тоже не сделал ничего сверхвыдающегося.

Забавно, что вы нашли в моём профиле статьи по ООП и линейной регрессии, но не заметили пост непосредственно касающийся обработки текста. Ну да ладно, убеждать вас в том, что у меня есть опыт в NLP я не собираюсь. Просто меня удивило, что вы, наверняка не имея промышленного опыта того же сентиментного анализа, вместо того, чтобы слушать других людей, бросаетесь на них. Сомневаюсь, что с таким подходом вы сможете получить хорошие знания в области, но это уже ваше дело.

1. Глубокое непонимание: Ваше определение «отдельного метода», с которым Вы «давно определились». Я под это определение могу щас придумать пару-тройку классификаторов, которые на самом то деле вовсе отдельными методами не будут.

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

Грубая ошибка: проблема с диаграммами Эйлера-Венна. Если следовать Вашей логике построения диаграмм, то классификация как раз покроет все три кргуа. А еще она пересечется с кластеризацией на ANN.

То ли вы круги Эйлера не понимаете, то ли русский язык. Классификация не покроет полностью эти круги. Полное покрытие подразумевает, что одно понятие полностью является дочерним понятием другого. Тот же SVM не является дочерним понятием классификации, поскольку сам по себе метод может быть использован и для других, не связанных с классификацией задач, например, регрессии. Классификация с регрессией (равно как и с кластеризацией) никак не пересекаются, поскольку это разные понятия. Хотя многие методы используются и там, и там, а значит пересекаются с обоими кругами.

Глубокое непонимание: Использвание функции ядра выходит за пределы двух этих кругов. Ядра, например, можно и в байесовских классификаторах использовать.

Читайте внимательно:

(ок, ядра могут быть использованы и в других классификаторах, но это только вопрос количества понятий — всё равно ядерный классификатор всегда будет польностью находиться внутри другов других классификаторов)


4. Глубокое непонимание: классификация с помощью ядер. Задача: распознавать написанные от руки числа от 0 до 9. Все как обычно: цифры представляют собой картинки черно-белые, признаками будут значения интенсивности для пикселей. Алгоритм простой будет: чтобы классифицировать новую картинку, мы будет относить ее к тому классу, к которому принадлежит наболее схожая(близкая) с ней картинка из обучающей выборки. Для этого зададимся функциями f0,...,f9:
fi:x->R, где х — это вектор признаков (вектор изображения).
Зададимся также метрикой:
|| x — x' || = sqrt[ sigma { фj(x) — фj(x') }^2 ], где j=1..n; ф = (ф1, .., фn) называется feature mapping. Например, это может быть произведением интенсивностей пикселей:
ф = (х1х1, ...,x1xn, x2x1, ...,xnxn). Т.е. можно сказать определяем корреляцию изображений.
Т.о. мы можем представить f следующим образом:
f(x) = sigma(ai) sigma[ фj(xj)фj(x) ] = sigma[ ai k(xi, x)], где i=1..m, j=1..n; m- количество отмапенных объектов из обучающей выборки ф(х1),.., ф(xm); a из R^m; к — ядро, а функция, включающая ядро называется ядерным классификатором (kernel classifier).

Нечитаемо, но будем считать, что идею я понял. А теперь, внимание, вопрос: входной образец вы будете сравнивать с каждым образцом обучающей выборки? Или всё-таки построите модель, представляющую всю выборку? Если модель, то как вы будете её строить? Средним значением пикселей? Неэффективно по множеству причин. Остаётся минимизация ошибки на обучающей выборке с помощью какого-нибудь градиентного спуска или обратного распространения ошибки. Ой, а это у нас тогда не нейронка с ядрами получилась? А ведь и правда, она.
Нет, если очень хочется, то можно и не строить модель, а сравнивать с каждым обучающим образцом напрямую. Фигня война, что это будет дико неэффективно (как с вычислительной точки зрения, так и с точки зрения классификации), забудем даже про то, что это уже выходит за рамки машинного обучения. Самый интересный момент тут состоит в том, что 1) вы описали distance-based classifier; 2) он вполне может существовать без ядер, следовательно, ядра не являются присущими этому методу. А называть ядерным классификатор, который может существовать без ядер, это уже как-то совсем.
Вы почему-то упорно не хотите понимать разницу между классификацией и преобразованием данных, за которое отвечают ядра. Kernel trick сам по себе не описывает процесс назначения меток образцам, он только отвечает за перевод признаков в пространство более высокой размерности, чтобы сделать образцы линейно разделимыми.

5. Глубокое непонимание: «В логистической регресси/перцептронах примерно так же». Соглашусь, что в перцептронах примерное так же. как в SVM. Но регрессия она по-вашему как наивный байес или как SVM?

Вы вообще осознаёте, что перцептрон и логистическая регрессия описывают одну и ту же модель?
Да, забавно то, что я потерял интерес к Вашим статьям) Удивлен ли я? Нет. Ожидал ли я этого? Да, определенно.
За мои знания в области не бойтесь, я ведь к счастью их получаю не от Вас. А то я бы тут тоже начал рассказывать, что регрессия примерно тоже, что и наивный байес, а потом бы доказывал это на диаграммах Эйлера-Венна, при этом постоянно меняя свои «показания».
Вы на секунду представьте, что то, что Вы написали тут — рассказываете на какой-нибудь научной конференции. Я вот себя уже представил. Да обратили бы внимание, потроллили бы еще — профессора это любят. Но то, что говорите Вы, как человек «гораздо более опытный»… Но это только мое мнение, у Вас свое ЧСВ, Вы наверняка считаете по-другому.
Я Вам больше не буду отвечать по ряду причин:
1. спор пустой
2. как я ни старался — он уже давно отошел от изначальной темы
3. Вы начали отвечать вопросом на вопрос и топтаться на месте в своей аргументации(с моей точки зрения, опять же)
4. по-моему Вы спорите ради спора, ибо я несколько раз предлагал Вам остановиться (ну и еще потому, что Вы строчите мне простыни-ответы в 2 часа ночи)
5. на мой взгляд Вы не ведете себя, как человек более опытный: спорите не аргументированно, при этом спорите со мной о том, что я не говорил, уходите о темы, делаете неадекватные сравнения, когда кончаются аргументы начинаете ссылаться на мою, якобы, неопытность и непонимание, в принципе не можете признать свои ошибки

ну и 6. Тот пример классификатора, который Вы только что раскритиковали я взял из книги, которая породила наш спор. Вы тогда автору все свои претензии изложите, пожалуйста, он наверняка послушает Вас. Только не забудьте перевести свои статьи и кинуть ему ссылку, чтобы он точно понял с каким профессионалом имеет дело.
А я, по вышеизложенным соображениям, не могу более доверять Вашему мнению
Ахаха, повеселили-повеселили :)

А то я бы тут тоже начал рассказывать, что регрессия примерно тоже, что и наивный байес

Цитату. Если не можете процитировать, не надо приписывать мне то, что я не говорил.

а потом бы доказывал это на диаграммах Эйлера-Венна, при этом постоянно меняя свои «показания».

Т.е. отсылка к ранее сказанному — это теперь называется «менять показания»?

Вы на секунду представьте, что то, что Вы написали тут — рассказываете на какой-нибудь научной конференции.

Рассказывал неоднократно. Вопросы?

Но то, что говорите Вы, как человек «гораздо более опытный»… Но это только мое мнение, у Вас свое ЧСВ, Вы наверняка считаете по-другому. Но то, что говорите Вы, как человек «гораздо более опытный»… Но это только мое мнение, у Вас свое ЧСВ, Вы наверняка считаете по-другому.

Я вам уже сказал: меня удивляет ваша позиция игнорирования опыта других людей, но это ваше право. Во всех своих аргументах я опираюсь на логику. Чёткую железную логику. И диаграммы Эйлера я вам привожу, чтобы вы начали думать логически. К моему ЧСВ это не имеет никакого отношения. Как и к ЧСВ автора, с которым вы изначально начали спорить.

2. как я ни старался — он уже давно отошел от изначальной темы

У вас — может быть, я же по-прежнему доказываю всё ту же мысль.

по-моему Вы спорите ради спора, ибо я несколько раз предлагал Вам остановиться (ну и еще потому, что Вы строчите мне простыни-ответы в 2 часа ночи)

Если человек неправ, его принято поправлять. Это профессиональный этикет. А если человек неправ, но при этом начинает спорить и огрызаться, то это уже вызывает негодование.
Вы ещё не знаете, во сколько я спать ложусь ;)

в принципе не можете признать свои ошибки

А в чём я ошибся?

Тот пример классификатора, который Вы только что раскритиковали я взял из книги, которая породила наш спор.

Цитату из книги, описывающую этот классификатор. И конкретно то место, где утверждается, что ядрёные классификаторы — это отдельный метод, а не модификация одного из ранее известных методов с использованием функции ядра.
Код один в один содран из стэнфордского курса NLP. Хоть бы опечатки в комментариях оригинала поправили:
def crossValidationSplits(self, trainDir):
    """Returns a lsit of TrainSplits corresponding to the cross validation splits."""
</code>
Кстати говоря, если немного потюнинговать алгоритм, то можно добиться лучшего результата:
без стоп–слов:
[INFO]	Accuracy: 0.829000

с стоп–словами:
[INFO]	Accuracy: 0.827000
пространство для тюнинга, безусловно, есть. Можно пользовать не только unigram'ами при обучении, например.
видимо Вы весьма бегло проходили сенфордские курсы.
1. так был только скелет, от которого я оставил, по большей части, только названия функций
2. наполнение мое.
Так что не надо про содранность «один в один». Очепятку исправлю, спасибо.
Ок, погорячился в выборе слов. Извиняюсь.
Просто подпись «статья написана в рамках конкурса» и копипасченый код (пускай частично) — режут глаз.
да, возможно стоило переназвать все функции (логику обработки то особо не изменишь: распарсил, передал на обучение, потренировался), чтобы никого излишне не смущать. My bad
Стенфордские курсы — замечательная штука, и я, например, очень рад интересу, который явно услился в рунете в результате…

Я тоже наслушался этих курсов, начитался Джурафски. Писал почти такой же классификатор, правда делал не сентимент анализ, а классификатор определяющий жанры текста. Для тестирования брал корпуса, вот смех — то, из «библиотека в кармане» — наивный байесовский классификатор отработал на «ура» с англоязычными текстами.

В общем, в результате класс умеет определять является ли текст документалистикой, фантастикой, приключенияи или Драммой (удивительно, но фантастику и приключения отличает пристойно)

Да, и еще, критикам скажу, что сигнатуры методов тут и не могут быть особо другими, потому не удивительно что это похоже на то, что предложенно в курсе по nlp. У меня например такие методы

метод для обучения (у автора «add_example»)

    def learn(self, genre, words):
        if genre not in self.genres:
            self.genres[genre] = 0
        self.genres[genre] += len(words)

        for word in words:
            if not word in self.vocabulary:
                self.vocabulary[word] = {}
            if not genre in self.vocabulary[word]:
                self.vocabulary[word][genre] = 1
            else:
                self.vocabulary[word][genre] += 1



И сам классификатор

    def classify(self, words):
        result = {}
        for g in self.genres:
            result[g] = 0

        for word in words:
            if word in self.vocabulary:
                for genre in self.genres:
                    if genre in self.vocabulary[word]:
                        k = (self.vocabulary[word][genre] + 1.0) / (self.genres[genre] + len(self.vocabulary))
                        result[genre] += math.log(k)
                    else:
                        result[genre] += math.log(1.0 / (self.genres[genre] + len(self.vocabulary)))
            else:
                for genre in self.genres:
                    result[genre] += math.log(1.0 / (self.genres[genre] + len(self.vocabulary)))

        sigma = 0

        for g in self.genres:
            sigma += self.genres[g]

        for g in self.genres:
            result[g] += math.log(self.genres[g]/float(sigma))
        return result



В любом случае, спасибо за статью!
Ой, я вам ниже ответил.
Вместо слова «learn» обычно используют «train». Ну это так, к слову.
Ой, конечно не вопрос. Конечно, train, нормально, даже лучше, звучит, но то такое )
Sign up to leave a comment.

Articles