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.