Pull to refresh

Comments 16

Я, конечно, не специалист, но что-то мне подсказывает, что реальный антиспам давно использует более продвинутые алгоритмы, чем Naive Bayes поверх bag-of-words.
Наивный Байес, по своей сути очень легкий и достаточно популярный алгоритм. Если его по-умному собрать (анализ по словосочетаниям, падежи и пр.), то он дает достаточно хорошие результаты. Из этого я и сделал вывод, что пусть он и устарел, но все еще остается актуальным.

Не дает он «достаточно хорошие результаты», это выдача желаемого за действительное. В свое время я работал в паре компаний, которые занимались фильтрацией спама. Он и спам отфильтровать толком не может, но что хуже, количество ложных срабатываний тоже достаточно велико.


В теории все красиво, на практике толку от такого фильтра немного.


Для меня честно говоря, самое интересное, как работают фильтры в GMail. Лучше я не видел, и это явно не наивный байес. Хотя большую часть спама они отсеивают прямо-таки фашистскими методами: чтобы отправить письмо на gmail со своего сервера, надо очень много времени потратить на настройку всяких dkim, dmarc и т.д.

они используют еще данные с соседних ящиков, так что массовая рассылка однотипного текста вычисляется на раз

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

А «наивный Байес» у аналитика должен от зубов отскакивать — это «хелло ворлд» классификации, ну или как в ардуино светодиодами поморгать.
Он не может устареть. Это основы.

Чуть-чуть про R код здесь
Про общее качество R кода здесь не буду — здесь тоже много чего говорить.

Я только про вот этот фрагмент:
test_letter <- str_replace_all(test_letter, "[[:punct:]]", "")
test_letter <- tolower(test_letter)
test_letter <- unlist(strsplit(test_letter, " "))
test_letter <- test_letter[! test_letter %in% stopwords("ru")]


Не секрет, что люди со склонностью к функциональщине могли бы записать так
test_letter <- unlist(strsplit(tolower(str_replace_all(test_letter, "[[:punct:]]", "")), " "))
test_letter <- test_letter[! test_letter %in% stopwords("ru")]

И это не склонность к беспорядку. Такой код у меня получается постоянно, когда (в стиле R) программируешь с данными.
Кстати, последняя строчка не влезла в потенциальный однострочник.
Ведь, нужно две ссылки на test_letter (думаете вы).

Обойдемся.
(просто освоим команду setdiff)
test_letter <- setdiff(unlist(strsplit(tolower(str_replace_all(test_letter, "[[:punct:]]", "")), " ")), stopwords("ru")])


Мда.
Читаемость в последнем варианте, как говорится" оставляет желать.

Если вы планируете и дальше работать в R, настоятельно рекомендую освоить piping.
Не в последнюю очередь моя непреходящая любовь к R поддерживается его адаптивностью.
Я, даже, не говорю здесь о «крутых» библиотеках типа Keros, Tensflow etc. — все, ценное что есть для Python, уже есть и для R (как, впрочем, и наоборот).

На сей пространный комментарий меня подтолкнула сравнительно свежая фича — piping.
Сам освоил сравнительно недавно — до сих пор радует.

Аналогично X-ам теперь результат одного функции можно передавать в другую, используя вместо многократного вложения в скобочки лаконичную нотацию "%>%"

Эта нотация появилась сравнительно недавно — 5-6 лет назад в пакетах magrittr или dplyr, но очень активно используется в пакетах последних лет, например — для обработки изображений, AI, ML.

Код, выполняющий те же функции, что и выше, но теперь с использованием pipe нотации

require(dlypr)

test_letter<-test_letter %>%
  str_replace_all("[[:punct:]]", "") %>%
  tolower() %>%
  strsplit(" ") %>%
  unlist() %>%
  setdiff(stopwords(«ru»))


Однострочник того же самого будет выглядеть так

test_letter<-test_letter %>% str_replace_all("[[:punct:]]", "") %>%  tolower() %>% strsplit(" ") %>% unlist() %>% setdiff(stopwords(«ru»))


Еще, кажется, скобочки в функциях тоже можно не ставить, если передаваемый параметр единственный.

Любите R! :)
Я бы ещё порекомендовал замечательный пакет {tidytext}. Имея опыт работы с {tidyverse} (https://www.tidyverse.org/), очень удобный инструмент для анализа текста.
К тому же имеется общедоступная книга от авторов пакета: www.tidytextmining.com.
Я согласен, что запись в одну строку и дополнительные библиотеки повысят «уровень» кода, но я старался предоставить алгоритм максимально легко, чтобы и читался он без напряга, и чтобы каждый шаг сопровождался комментарием.
Вот уж на то, чтобы быть примером в аккуратности кода я ни разу не претендовал.
Просто воспользовался случаем показать немножко больше R.
Одна строка возникает из удобства процесса кодирования.
Удобочитаемость, естественно, спорная.
require(dlypr)

тут не ошибка случаем, может dplyr?
хотя честно говоря давно на R ничего не делал, то может отстал от жизни :)
Да, конечно dplyr!
Извиняюсь за опечатку.
Просто этот пакет вместе с другими фундаментальными пакетами за авторством Hadley Wickham во многом определяют лицо современного R и его конкурентоспособность.

Его пакеты ggplot2, plyr/dplyr, reshaper, RStudio — в принципе, «подрастающе поколение» дата саентистов думают, что это и есть R.
Поэтому, кстати, получается, что явно библиотеку dplyr в своем коде почти не приходится вызывать — его подгружают другие частные библиотеки.
Несколько моментов:
  • Скорее всего, Вы имели ввиду reshape2.
  • RStudio — это название IDE для R и компании, которая эту IDE делает.
  • Все пакеты tidyverse (dplyr, ggplot2, tidyr, ...) уже считаются пакетами RStudio с главным идеологом Hadley, который там работает.

Ну где чьи пакеты — это уже дело следующее. С S знаком больше 20 лет, с R-проектом — и с его людьми, на некотором этапе — чуть меньше 20. В последние 12-13 лет это мой основной язык для работы. Только я его активный пользователь, а не разработчик.
Так, что вы уж на меня не серчайте за опечатки в названии пакетов.
В моем коде все они написаны правильно.
Теперь понятно, почему спамеры рассылают кучу бессмысленных сообщений вида «Завтра состоится собрание по низкой цене» или «купи килограмм путёвок в подарок» — они нарушают работу таких фильтров.

Странно подгрузить tm что бы взять оттуда только stopwords в этой задаче. В нем надо было и делать очистку от пунктуации, и от стопслов, и нижний регистр и конвертацию в document-terms-matrix, и все в одну строку кода. Многоэтажные циелы в статье выглядят как: давайте возьмём штурвал вот от той мощной яхты с полыми баками, и приделаем его к плоту который соберем из спичек перемотанных шнурками

выглядят как: давайте возьмём штурвал вот от той

А я, знаете ли, этому уже перестал удивляться.
По моим наблюдениям «этим» уже заполнились первые 3 страницы гугловыдачи.
Вангую (не люблю этого слова)
Я думаю, что следующей задачей текстового поиска будет поиск не «просто ответов», а «оригинальных ответов», потом «полезных ответов» и т.д. по мере того, как серая масса (не путать с «серым веществом» будет делать предыдущий уровень непригодным для жизни.

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

И правда! Кому нужны эти сиги?! Лещ — это вещь!
(if you understand what I am talking about)
Sign up to leave a comment.

Articles