Problem
Często w postach pojawiają się komentarze, które nijak nie są z nimi powiązane. Albo nie wnoszą żadnej wartości. Przykładowo:
Followed and resteemed
Nice photo
Amazing
Please follow me I will follow you back
etc.
Najczęściej są to komentarze w języku angielskim, a szybka analiza użytkownika pozwala przypuszczać, że nie zna on języka polskiego, więc nie był w stanie się zapoznać z treścią komentowanego posta. Mamy do czynienia z ewidentnym spamem. Takie komentarze należałoby oflagować (aby przestały być widoczne), ewentualnie odpowiedzieć komentarzem ostrzegającym przed skutkami takiego zachowania. Niemniej sam fakt, że taka sytuacja ma miejsce jest nieco irytujący. Czy dałoby się jakoś zautomatyzować proces reakcji na tego typu komentarze? Oczywiście tak, bo jest to klasyczny problem klasyfikacji spamu.
Teoria
Do problemu klasyfikacji spamu najczęściej używa się takich algorytmów jak:
Każdy z tych algorytmów ma swoje wady i zalety. Można oczywiście bazować na kilku algorytmach naraz i łączyć wyniki na zasadzie średniej ważonej.
Bot korzysta z pierwszego z tych algorytmów, ale w planie jest też dodanie innych w celu porównania działania.
Naiwny klasyfikator Bayesa to popularny klasyfikator probabilistyczny. Słowo naiwny bierze się z założenia niezależności predyktorów (co nie musi być prawdą, bo zwykle zmienne te są przynajmniej w małym stopniu zależne). Pomimo powyższego faktu, klasyfikatory Bayesa zwykle radzą sobie nad wyraz dobrze, nawet w porównaniu do bardziej złożonych metod takich jak sieci neuronowe.
W uproszczeniu idea działania jest następująca:
- mamy zbiór dokumentów należących do dwóch różnych klas (np spam oraz nie-spam)
- dokumenty zamieniamy na listy słów uwzględniając liczność poszczególnych słów
- klasyfikując nowy dokument analizujemy jak często słowa pojawiały się w dokumentach obu klas i jakie z tego wynika prawdopodobieństwo (korzystamy z twierdzenia Bayesa)
- wynikiem jest prawdopodobieństwo przynależenia do danej klasy
Realizacja
Bot korzysta z następujących technologii:
- język: Python3.6
- biblioteki: steem-python, scikit-learn, pandas
Został on wytrenowany na podstawie ponad 100 komentarzy, rozdzielonych mniej więcej równo na obie klasy. Oczywiście liczba ta będzie zwiększana, w myśl zasady, że im więcej tym lepiej. Bot sam dodaje sobie nowe dane, jeśli wynik klasyfikacji jest odpowiednio wysoki.
Przykład działania:
Jak widać w komentarzu zawarta jest też informacja o tym jak bardzo bot jest pewny, że dany komentarz to spam. Próg w obecnej chwili ustawiony jest na 80%. Bot teoretycznie powinien zareagować od razu, ale w praktyce odpowiada z opóźnieniem około 2 minut.
Dalszy rozwój
Rozwój będzie polegał na:
- zwiększeniu liczby danych na podstawie których bot podejmuje decyzje (można przyjąć, że teraz jest w fazie eksperymentalnej i ciągle się uczy)
- dodanie innych algorytmów i połączenie z obecnym
- branie pod uwagę również reputacji oraz historii komentarzy (wyższe jest prawdopodobieństwo spamu dla użytkownika z niską reputacją; dodawanie serii takich samych komentarzy również będzie dobrą wskazówką)
- zapamiętywanie użytkowników, którzy spamowali
- flagowanie spamowych komentarzy (dopóki bot działa w fazie eksperymentalnej oraz ma niska reputację i poziom SP będzie się ograniczał tylko do odpowiadania na komentarze)
Kod bota będzie OpenSource w przeciągu kilku dni.
Wszelkie sugestie mile widziane.
Czy byłbyś w stanie napisać taką sprawdzajkę, która policzyła by prawdopodobieństwo, że dane konto jest botem?
Myślę, że jest to do zrobienia :)
Bot probability: 94.5%
Grеаt рοѕtǃ Սрvοtеd аnd rеѕtееmеdǃ
Założę się, że tego nie wykryje ^^
Nie wolno oszukiwać! :D
Napisałeś to ręcznie, przyznaj się 8)
Tak (tzn bot sam to napisał, ale był w tym mój udział) :D Początkowo wyszło, że komentarz neutralny. No ale coś mi nie pasowało i podejrzałem sobie jakie tam są faktycznie znaki. Po czym testowo uaktualniłem bazę i wymusiłem, żeby sprawdził ten komentarz jeszcze raz.
Czyli będzie trzeba też dodać sprawdzanie czy ciąg nie zawiera za dużo podejrzanych znaków.
Please stop spamming in comments or else people may flag you!
Spam probability: 88.14%
Świetna robota, lubię takie projekty, bo (przynajmniej w moim przypadku) zazwyczaj powstają z ciekawości lub chęci sprawdzenia, czy się będzie potrafiło :D
Czy bot będzie się jakoś dowiadywał, czy poprawnie sklasyfikował komentarz? Np. po liczbie upvote albo wypłacie za swoją odpowiedź? Fajnie by było połączyć kilka różnych metod i przedstawiać wynik klasyfikacji każdej z nich.
Gratulacje i czekam na kod źródłowy :)
W moim przypadku to również ciekawość. A tutaj też stwierdziłem, że taki bot będzie przydatny.
Odnośnie dowiadywania się o poprawnej klasyfikacji - póki co przyjąłem, że będę co jakiś czas weryfikował wykonane akcje i dokonywał ewentualnych korekt. Ogólnie im bot będzie miał więcej (dobrych) danych tym powinien być skuteczniejszy (teraz tych danych jest stosunkowo mało).
Nie wiem czy patrzenie na upvote będzie miarodajne, będę musiał nad tym pomyśleć / poobserwować.
Dołożenie kolejnych algorytmów to w sumie dla mnie najciekawsza część tej zabawy, lubię porównywać skuteczność różnych metod :)
Bot może tez sprawdzać czy dana osoba zamieszcza identyczne komentarze pod innymi postami
Taki mam plan. Bo też co innego jak ktoś napisze 10 razy pod rząd komentarz "nice photo", a co innego jak zdarzy się to komuś wśród innych normalnych komentarzy.
Właśnie o to mi chodziło bo czasem ktoś może napisać coś w stylu super artykuł i wcale nie musi się rozpisywać a spam moim zdaniem to nie będzie
Weryfikowanie po upvotach jest o tyle słabe, że spamerzy gdy się zoreintują/dowiedzą jak bot działa też będą go upvote'ować.
Dzisiaj już widziałem działanie @pomocnik -a pod moim postem skomentowanym przez robota :-)
Brawo popieram.
Great post! Upvoted and resteemed!
test
Please stop spamming in comments or else people may flag you!
Spam probability: 94.51%
Congratulations, you were selected for a random upvote! Follow @resteemy and upvote this post to increase your chance of being upvoted again!
Read more about @resteemy here.
Please stop spamming in comments or else people may flag you!
Spam probability: 80.48%
Wydaje mi sie ze kilka godzin temu widzialem tego bota. Troche zesfirowal. Komentowal min samego siebie.
Haha, to prawda :D Przez przypadek uruchomiłem go w wersji, gdzie nie sprawdzał minimalnego prawdopodobieństwa (teraz jest 80%) i na kilka minut zająłem się czymś innym. Potem na szybko wszystko usunąłem, ale nie powiem, lekko się spociłem ;)
Hehe, ale by bylo jakby zaczal wszystkich dookola flagowac ;)
Skynet ;)
;)
Usunąłeś? Na steemie? Jak?
W sensie usunąłem z interfejsów, bo z blockchaina to wiadomo :)
Ale jak, skoro nawet na busy czy steemit nie ma opcji usuń/ukryj? Masz na myśli edytowanie?
Można usuwać. Ale tylko jeśli nie ma głosów / nie ma odpowiedzi.
A rzeczywiście, na steemit jest coś takiego.
sam siebie też zacznie oznaczać jako spam,
czy nie ogarnie tego faktu?
W razie czego mogę go wpisać na białą listę.
Przez kilka minut (na skutek mojej drobnej pomyłki) odpisywał sam sobie, stwierdzając, że to spam, więc to już ma za sobą ;)
Wiem, że to może wyglądać, że odpowiada swoją regułką (czyli takim trochę spamem) na spam, ale docelowo (jak wyjdzie z fazy eksperymentalnej) i będzie flagował to taki wątek i tak będzie ukrywany przed resztą użytkowników.
Czyli Polonusy, znający język polski biernie (rozumiejący artykuł), ale bez polskiej klawiatury i nawyku pisania po polsku -będą tutaj wykluczeni?
Nie, nie. Samo pisanie po angielsku pod polskimi treściami nie jest traktowane przez bota jako spam. Chodzi o takie generyczne komentarze "Nice photo" czy "Followed and resteemed". Jak ktoś odpisze normalnym zdaniem / zdaniami po angielsku to bot nie oceni tego jako spam (w bazie normalnych komentarzy są i polskie i angielskie)
sama czesto ogladajac posty widzac cos co mi sie spodobalo, komentowalam krotko i zwiezle .... "Nice photo" lub pod postami z innych narodowosci pisalam po polsku ze cos mi sie podoba.... :) ( jak ktos chce wiedziec co napisalam moze sobie przetlumaczyc) Boty nigdy nie beda doskonale i zawsze kogos skrzywdza a juz napewno nie jestem za tym zeby same flagowaly :/ .... po drugie nawet jezeli jakis bot mi napisze ze fajna fotka czy obrazek to chyba krzywdy mi tym nie robi? troche nie rozumiem tego ........co innego jak by pod jednym postem powtarzal sie i spamowal tym samym zdaniem czy wyrazem ....
Właśnie też doszedłem w międzyczasie do wniosku, że nie ma co patrzeć tylko na jeden komentarz, a na całą historię. I jako spam traktować sytuację, kiedy ktoś ciągle pisze to samo. Póki co to z tym botem takie "pierwsze koty za płoty" i testuję sobie jak to działa w praktyce. Bo założenie jest takie, że ten bot ma pomagać a nie szkodzić :) Więc jak będzie słabo działał i bardzo rozrabiał to go wyłączę i tyle ;)
:) Super ze kombinujesz :) ....kawal dobrej roboty i tak :) Pozdrawiam!!!!
Jestem pod wrażeniem świetna robota :)
gib mony, follow resteem my friend poland beautyful country
Please stop spamming in comments or else people may flag you!
Spam probability: 84.34%
O działa :D
Czy bot sprawdza też pozostałe komentarze danego użytkownika? Jest duże prawdopodobieństwo, że w krótkim czasie taka sama treść została umieszczona po kilkoma postami (niekoniecznie polskimi).
Teraz bot analizuje tylko treść aktualnego komentarza, ale jakoś jutro dodam też sprawdzanie wcześniejszych (i pewnie też reputację).
Nawet w tym poście trafił się taki spamujący rodzynek: https://steemit.com/@resteemy/comments.
Najgorsze sa komentarze wymuszające upvotes za czyjś głos albo follow za follow. Co komu po obserwujących, którzy sa „martwi” i tak nasze treści sa dla nich nieinteresujące, lepiej mieć mniej a prawdziwych osób.
To prawda. Dlatego duża część danych w bazie treningowej dotyczy własnie komentarzy tego typu.
Za niedługo będzie strach cokolwiek napisać w komentarzu w obawie przez to że "zwyzywa" nas bot hahaha :) Dobra robota! :)
Przynajmniej ludzie się będą 2x razy zastanawiać przed napisaniem haha :)
A ja to bałem się wczoraj iść spać, w obawie, że bot zeświruje przez noc (uzyska samoświadomość czy tego typu rzeczy) ;)
Czy ten bot działa w każdym poście z tagiem #polish ?
Tak, analizowany jest każdy komentarz w #polish.
1)Wymyśl bota, który kontroluje inne boty, kasując ich działania w razie potrzeby.
2)Wyobrażmy sobie, że dwóch twórców botów działa na jednym terenie i w jednej dziedzinie.
No i chciałbym zobaczyć jakąś wojnę konkurujących botów. Czemu nie? Konkurencja jest dobra.
Zwykły użytkownik Steemit mógłby na takiej konkurencji skorzystać, kiedy boty zajmą się sobą, a nie nim.
Usprawnią? -Nieee, wystarczy że się wzajemnie zablokują. ;)
Gdy bot robi coś źle, to: zablokowanie zła> dobro.
Z botami jest inaczej niż ludźmi.
I słusznie, że nie można nikogo blokować, ale jak już powiedziałem: bot to nie człowiek - nie ktoś tylko coś.
Ja doskonale rozumiem pasję autorów, sam gdybym miał taką wiedzę, na pewno bardzo bym się wkręcił w tworzenie botów, bo to niezwykle fasynujące. I też prawdopodobnie straciłbym dystans. Ale po to potrzebni są tacy tu maruderzy jak ja, aby tego dystansu społeczność nie straciła.
Nice bot.
Przekażę, bo chwilo śpi ze względu na modyfikacje :)
A komentarz zostałby oceniony na 70% czyli poniżej progu spamu, choć blisko.
Bot oszukany za pierwszym razem. :P I had to try. ;)
Przez chwilę się zastanawiałem czy byłby sens rozdzielać zbiory dokumentów ze wzorcami na przykład na główny zbiór oraz zbiory językowe włączające się dla konkretnych tagów (np. polski dla
#polish
i#pl-.*
) ale to chyba nie ma sensu bo nie widziałem jeszcze (jeszcze!) spamu po polsku.Chyba, że w innych językach jest inaczej?
Teraz połowa zbioru treningowego, dla wiadomości które nie są spamem jest po polsku, a połowa po angielsku. Spamowe są tylko po angielsku, ale nic nie stoi na przeszkodzie, żeby dodać też jakieś polskie.
I to są dane przeznaczone dla tagu #polish (= zoptymalizowane pod ten tag)
Jakby ktoś chciał to uruchomić np na tagu #deutsch albo globalnie na całym steemie to dane trzeba oczywiście dopasować.