ABSOLVENTSKÁ PRÁCE Wikipedie a její obranné mechanismy
Autor práce: Martin Urbanec Třída: IX.A Školní rok: 2015/2016
Obsah Úvod ........................................................................................................................................................ 2 Co je to Wikipedie? ................................................................................................................................. 3 Vandalismus jako problém Wikipedie ..................................................................................................... 3 Metody obrany proti vandalismu............................................................................................................ 5 Praktický výstup ...................................................................................................................................... 6 Závěr ........................................................................................................................................................ 9 Annotation .............................................................................................................................................. 9 Přílohy ................................................................................................................................................... 10 Seznam použité literatury ..................................................................................................................... 18
1
Úvod Rozhodl jsem se během své absolventské práce zabývat českou Wikipedií. Tuto svobodnou internetovou encyklopedii sám ve volném čase edituji a rád bych mezi svými spolužáky rozšířil povědomí o tom, že Wikipedii je možné svobodně editovat. Hlavním cílem mé absolventské práce je však vytvoření nástroj pro analýzu chování uživatelů, když se mu zobrazí varování jednoho z obranných mechanizmů této encyklopedie. Tento nástroj jsem sám navrhl a naprogramoval. Tento nástroj se zabývá tzv. Editačními filtry. Ty automaticky ještě před uložením editace zjišťují, zda je, resp. není vandalská. Pak ji buď zakáží, označkují, nebo zobrazí varování. Vytvořil jsem nástroj, který spočítá, kolik zaznamenaných editací uživatel kvůli varování neuložil, kolik bylo uloženo beze změny (po varování) a kolik upraveno tak, aby je filtr vyhodnotil jako nezávadné. Předpokládám, že vytvořený program bude užitečný při analýze úspěšnosti těchto editačních filtrů a vybrání těch, které je ještě třeba vylepšit.
2
Co je to Wikipedie? Wikipedie je svobodná a otevřená encyklopedie, která je vytvářena na internetu. To ale neznamená, že kdokoliv může cokoliv „ukrást“ a libovolně použít a třeba se pod to i podepsat. Znamená to, že kdokoliv může jakýkoliv obsah z Wikipedie využít (třeba i komerčně), ale musí uvést, kdo je autorem a šířit to pod stejnými podmínkami. Také to znamená, že kdokoliv může do obsahu Wikipedie zasahovat. Klidně i bez registrace. Wikipedie byla založena v roce 2001 Jimmy Walesem, původně jako podpůrný projekt pro dnes již neexistující Nupedii. Nupedie byla také encyklopedií, do té ale mohli přispívat pouze odborníci. Každý článek musel projít složitým schvalovacím procesem. Tím od roku 2000, kdy Nupedie vznikla, do roku 2003, kdy ukončila svoji činnost, prošlo pouze 25 článků a dalších asi 75 jich bylo v procesu schvalování. Tento proces měl zajistit kvalitu srovnatelnou s komerčními encyklopediemi. Wikipedie se vydala jiným směrem a začala žít svým vlastním životem. Nyní je vizí Wikipedie shromáždit veškeré vědění lidstva. To, jak Wikipedie funguje, ale neznamená, že by Wikipedie měla být pro běžné účely (tedy ne pro odborné práce) nespolehlivým a nepoužitelným zdrojem. Jak v klasické encyklopedii Brittanica, tak v (anglické) Wikipedii se v roce 2005 nacházely čtyři závažné chyby. Ve Wikipedii se pak nacházelo 162 drobných chyb a v Brittanice 123. Kvalitou jsou tedy srovnatelné.
Vandalismus jako problém Wikipedie Ze zmíněné otevřenosti Wikipedie vyplývá i jeden z problémů, se kterým se musí potýkat. Tímto problémem je vandalismus. Každý den dochází k několika vandalským změnám v obsahu encyklopedie. Proti těmto změnám se Wikipedie dokáže bránit několika způsoby. Každá změna (editace) je stisknutím tlačítka Uložit změny prozkoumána asi osmdesáti automatickými filtry. Ty zjišťují, jestli nový uživatel neodstraňuje velké množství obsahu, jestli naopak nepřidává příliš krátký článek, nebo jestli jen nepřidává náhodné znaky („adsf“ a další podobné kombinace). Některé filtry vůbec neumožní změnu provést (například kompletní vyprázdnění článku), další filtry editora pouze varují. Když změnu i přes varování uloží, přidá se k ní tzv. značka. Ta může informovat o tom, že ve změně byly přidány vulgarity anebo právě zmíněné náhodné kombinace znaků. Na editace označené nějakou značkou je poté zaměřena větší pozornost, než na neoznačené. 3
Další stupeň kontroly je stránka Poslední změny. Tuto stránku každý den sledují členové tzv. patroly. To je skupina uživatelů, kteří v tomto seznamu hledají vandalské změny a vracejí je do předchozího stavu. Tento seznam provedených změn si „patroláři“ většinou vzhledově upravují, aby vandalské změny našli rychleji. Jako jednu z činností, které na české Wikipedii dělám je právě to, že Wiki žlutě podbarvené změny provedené neprověřenými editory a červeně zvýrazněné problematické IP adresy.
Změna je většinou zrušena velmi rychle, pokud není změna zamaskovaná tak, aby nebyla rychle poznatelná (což dělají zkušenější vandalové, např. lze se setkat s tím, že někdo do článku přidá vulgarity a jako shrnutí editace uvede „překlep“). Příkladem pohotovosti reakce „patroláři“ může být například tento případ. V pátek o půl jedenácté v noci byla provedena změna, mající za účinek převrácení celé stránky vzhůru nohama. Změna byla odhalena a vrácena do předchozího stavu během jedné minuty. Pokud vandalskou změnu nikdo neobjevil v posledních změnách, přichází poslední obranná linie – sledované stránky. Tento seznam je specifický pro každého wikipedistu a přehledně zobrazuje změny provedené v článcích, které si daný editor přidal do seznamu sledovaných. Pokud je pak uložena vandalská změna v článku, který někdo sleduje, editor ji může zrušit tehdy, když kontroluje změny v tomto seznamu. Velké množství článků ale nikdo nesleduje,
4
proto se na vandalismus v nich přijde až s velkým časovým odstupem, když na něj upozorní někdo ze čtenářů anebo změnu rovnou vrátí zpět. Stává se ale také, že editor vandalizovat nepřestane ani po obdrženém varování. Pokud se tak stane, bývá dotyčný zablokován. To znamená, že sice může nadále Wikipedii číst, ale není mu umožněno stránky editovat. Zablokování se může týkat buď pomocí jednoho konkrétního uživatelského účtu, nebo jedné konkrétní IP adresy anebo dokonce rozsahu IP adres.
Metody obrany proti vandalismu Wikipedisté (editoři Wikipedie) se proti vandalismu mohou bránit několika způsoby. Jak jsem zmínil, každá editace je ještě před uložením prozkoumána sadou editačních filtrů. Následuje kontrola v Posledních změnách a Sledovaných stránkách. Zvláště v průběhu kontroly v Posledních změnách je v některých případech dotyčného vandala zablokovat, anebo pokud je terčem vandalismu jedna stránka více uživateli, (polo)zamknout danou stránku. Stránku, která je polozamčena může editovat pouze delší dobu registrovaný uživatel, stránku, která je zamčena úplně pak může editovat pouze správce. V tomto odstavci bych rád popsal určitá specifika vandalských změn, které probíhají zejména dopoledne a těch, ke kterým dochází odpoledne. Dopoledne vandalizují zejména žáci různých typů škol (od základních přes střední až po vysoké), proto je adekvátně tomu volena délka zablokování (tedy většinou jedna dvě hodiny, k delším blokům dochází pouze tehdy, když z IP adresy školy pochází velké množství vandalismu a nic jiného užitečného). Hranice škodlivosti příspěvků před tím, než dojde k zablokování IP je většinou nižší, než u „obyčejných“ typů vandalismu (vandalizuje třeba pět škol během pěti minut a navíc může vandalizovat několik žáků, patrolář si s tím musí rychle poradit), naopak je délka bloku většinou kratší kvůli tomu, že během jedné dvou hodin dotyčný vandal/vandalové odejdou z počítačové učebny. Dlouhodobě problematické školy jsou pak blokovány na stále delší dobu (nepsané maximum je dvojnásobek nejdelšího předchozího bloku) až na dobu jednoho měsíce. Jeden měsíc je maximální doba, kterou dovolují pravidla Wikipedie (vyjma několik poměrně jasně vymezených pravidel). Někdy jsou školy blokovány i na delší dobu, i přes to, že pro to neexistuje žádná opora v pravidlech. Donedávna třeba i do odvolání, nyní je nepsaná maximální délka bloku do konce školního roku, je totiž možné, že dotyčný vandal
5
z té školy odejde a delší blok by byl pak kontraproduktivní, protože by vandala neovlivnil a naopak ovlivnil možné další wikipedisty, kteří čirou náhodou navštěvují stejnou školu. Odpoledne nastává jiná situace. Vandalů je méně, spíš než dopoledne se lze potkat se strategií „experimentuji a pak odejdu“. Blokování je tedy užíváno podstatně méně často, než dopoledne. Zamykání článku se využívá jako obrana proti vandalizmu při přesně opačné situaci, než která je vhodná pro blok. Při blokování většinou vandalizuje jeden uživatel několik stránek. Při zamykání je naopak terčem vandalismu jedna konkrétní stránka několika uživateli. Nedávno jsem třeba polo-zamkl (liší se od úplného zamknutí tím, že ovlivní jen neregistrované a krátce registrované) některé z youtuberů, protože je to to téma, které bude terčem vandalismu do doby, než člověk přestane být populární. Takřka všechny editace anonymů byly vandalské, proto to bylo ideální řešení. Editační filtry fungují beze změny a spíše zachytí menší množství vandalů. Jejich úkolem je možného vandala varovat a popřípadě upozornit na editaci.
Praktický výstup Jak jsem již zmínil, jako praktický výstup své absolventské práce jsem se rozhodl naprogramovat
program,
který
by
vytvořil koláčový graf1 zobrazující, jak jednotliví uživatelé Wikipedie reagují na upozornění zobrazené editačním filtrem. Příklad výstupu grafu je na obrázku vlevo. V modré části grafu („Ukončeno“) jsou případy, kdy uživatel v reakci na varování nepokračoval v ukládání editace. To může indikovat například to, že filtr „falešně“ označil velké editací jako vandalské, i když tomu tak ve skutečnosti nebylo (této situaci se říká falešné pozitivum) anebo že velké procento
1
Graf je vytvořen s využitím Google Charts (https://developers.google.com/chart/). Zdrojové kódy jsou k dispozici na https://github.com/urbanecm/abuseFilter. Webová stránka generující graf je k dispozici na https://tools.wmflabs.org/urbanecmbot/abuseFilter/finalWork.html.
6
uživatelů přesto svou práci zahodí a nepokračuje v ní. V takovém případě je pak třeba editační filtr upravit, aby falešných pozitiv vykazoval méně, protože o těchto editacích se nikdo ve většině případů nedozví. Program nedokáže analyzovat činnost filtru u editací stránek, které byly později smazány. Takové případy jsou v červené části grafu označené „Stránka smazána“. V oranžové části grafu „Uloženo“ jsou editace, kdy uživatel varování ignoroval a stránku uložil bez jakékoliv změny. To znamená, že je filtr neúspěšný. Může být ale neúspěšný ze dvou důvodů. Buď může opět vykazovat velké množství falešných pozitiv, jen si jsou uživatelé jistí tím, co dělají a proto editaci uloží i přes varování, nebo filtr nemá nastavené dostatečně důrazné varování, aby uživatelé vandalské editace neprováděli. V zelené části grafu pak jsou editace, ve kterých uživatel svoji editaci upravil tak, aby se varování již nezobrazilo. Skript generující data zobrazená v grafu běží delší dobu (půl hodinu až hodinu, podle toho, který filtr je právě zpracováván). Data, která jsou zobrazována, jsou proto předgenerována a v okamžiku návštěvy stránky se pouze vygeneruje zobrazený graf. Do programu do budoucna plánuji zařadit i veřejné rozhraní pro všechny filtry. S určitou periodou by se spouštěly skripty generující data pro všechny filtry a dle požadavku uživatele by se zobrazil graf pro daný filtr, včetně času vygenerování daných dat, aby bylo možné zjistit, jak stará data si uživatel prohlíží. Kód programu generujícího data je v příloze číslo 1, program zobrazující graf je poté v příloze číslo 2. Pro spouštění programu jsem využil prostředí Wikimedia Tool Labs, což je prostředí umožňující běh nástrojů spravovaných komunitou. V rámci tohoto prostředí je k dispozici přístup do repliky databáze (ta je stará jen několik vteřin). Není to tedy přímo ta produkční a některá data jsou vynechána (soukromá data, jako například hesla a e-maily jsou vymazána, také není přímo dostupný text článků). Program je naprogramovaný v jazyce Python, webové stránky jsou směsí Pythonu a HTML. Jazyk Python zpracovává získaná data a následně je pošle prohlížeči v jazyku HTML, kterému prohlížeč rozumí. Do prostředí Tool Labs je možné vstoupit pomocí SSH protokolu, což je šifrovaný protokol umožňující vzdálený přístup do terminálu. Kód je verzován pomocí systému Git a ukládán na GitHub do veřejně přístupného repozitáře. 7
Protože provedení generujícího programu trvá dlouho, ukládá své výsledky do formátu JSON, což je strojově čitelný formát. Soubor s daty se poté načte při návštěvě uživatele a vypíší se z něj data zformátované pomocí JavaScriptového skriptu Google Charts do formy koláčového grafu. Toto zpracování poté provádí webový prohlížeč sám. Program ze všeho nejdřív importuje veškeré potřebné moduly (modul je pomocný kód využívaný programem) a následně naváže připojení s databází české Wikipedie. Tím končí první fáze programu nazývaná inicializace. Po této fázi následuje fáze získávání dat, která pouze uloží do paměti programu veškerá dostupná data o zpracovávaném editačním filtru. Data program získává z databázového systému prostřednictvím dotazovacího jazyka SQL. Následuje fáze třídění dat, během které se dle názvu článku rozdělí získaná data na jednotlivé skupiny záznamů. Třídění by se dalo vylepšit tím, že by se porovnával nejenom názvu článku, ale i identifikace uživatele, popřípadě časové známky. Po ukončení fáze třídění následuje výkonově nejnáročnější část - analyzování dat. Během této části program zařadí každou skupinu záznamů do jedné ze zobrazovaných částí v grafu. To tato část dělá pomocí následujících kritérií. V případě, že filtr zobrazil pouze varování a editace byla v krátké době uložena, znamená to, že editace byla uložena i přes filtr. Pokud filtr zobrazil varování a krátce poté filtr označil nějakou editaci, editace musela být uložena, protože to, co se označilo, musí být napřed uloženo. Pokud ale nejsou k dispozici žádné revize a editace byla uložena, znamená to místo toho, že musela být stránka smazána. Stejná situace musela nastat, pokud filtr pouze označil nějakou editaci. Toto zpracování trvá dlouhou dobu z toho důvodu, že program musí provádět časově náročné porovnávání velkého množství (někdy i desetitisíce) textových záznamů. Tyto data jsou pak zakódována do formátu JSON a uloží do souboru. Z tohoto souboru si poté výsledek přečte skript, který data prezentuje uživatelům ve formě grafu.
8
Závěr Hlavním cílem mé práce bylo vytvořit nástroj, který zjišťuje, kolik uživatelů při setkání s varováním editačního filtru editaci neuloží, uloží i přes varování anebo upraví tak, aby ji filtr vyhodnotil jako nezávadnou. Tento nástroj se mi vytvořit povedlo. V budoucnosti půjde rozšířit tak, aby pracoval i s editacemi, které byly smazané, a zjistil o nich údaje. Také bych rád vytvořil webové rozhraní k tomuto nástroji, které bude umožňovat zobrazit si správný graf dle požadavků uživatele a popřípadě vynutit jeho aktualizaci. Praktický výstup z této práce bude moci být využit při kontrole, zda editační filtry encyklopedie fungují tak, jak mají a spíše Wikipedii neškodí.
Annotation My final work is about the Czech Wikipedia and its methods of fighting electronic vandalism. In the first part of this work I would like to describe what the Wikipedia is, who founded it and why. I would like to describe another projects which was founded by Wikipedia’s founder too. In the second part of my final work I want to introduce how wikipedians fight with electronic vandalism on the Wikipedia and which tools wikipedians use for this. I would like to show methods of catching electronic vandalism and methods of prevention of damaging edits. In the practical part I have made a program which can analyse what users which was stopped by abuse filters (these filters are used for fighting with electronic vandalism on Czech Wikipedia) do after warning was showed by filters. This program will be useful for debugging Wikipedia’s filters and catching more damaging and useless edits.
9
Přílohy Příloha č. 1 Kód
programu
generujícího
data,
online
verze
k dispozici
na
https://github.com/urbanecm/abuseFilter/blob/finalWork/abuseFilter.py, citováno 14. 4. 2016 #!/usr/bin/env python #-*- coding: utf-8 -*############################################################# #TODO: Zajistit, aby program pracoval i se smazanými revizemi (z tabulky archive) ############################ INIT #################################### #Importování modulů #Importování modulu pro práci s výstupem ve formátu JSON import json #Importování modulu pro práci s objekty spravovanými interpretem import sys #Importování knihovny pro práci s databází from wmflabs import db #Importování modulu pro práci s datem a časem import datetime #Init modulů #Vytvoření proměnné s kódem wikiprojektu #wikisite = sys.argv[1] + "wiki" wikisite = "cswiki" #Vytvoření proměnné s číslem filtru #fnum = sys.argv[2] 10
fnum = 15 #Navázání připojení s databází conn = db.connect(wikisite) ######################### ZÍSKÁVÁNÍ DAT ############################### #Vytvoření databázové transakce cur = conn.cursor() #Otevření transakce with cur: #Nalezení ĺogu pro daný filtr cur.execute('select * from abuse_filter_log where afl_filter="' + str(fnum) + '"order by afl_timestamp asc') data = cur.fetchall()
###################### TŘÍDĚNÍ DAT ############################### #Vytovření proměnné pro roztříděná data for_analyze = [] #´Vytvoření pomocných proměnných prevs = [] prev_article = u"wqshnhaAQJHADKJHFGUIA" for row in data: #Je název článku shodný s předchozím? if row[10] == prev_article: #Přidej ho do pomocné proměnné prevs.append(row) else: #Přidej do roztříděných dat tento a předchozí. prevs.append(row) for_analyze.append(prevs) 11
#Vyprázdni předchozí prevs = [] #Aktualizuj předchozí název článku prev_article = row[10] #Smazání nepotřebných pomocných proměnných del(prev_article) del(prevs) #Vytvoření pomocných proměnných pageDeleted = 0 saved = 0 ended = 0 edited = 0 together = 0 ################### ANALYZOVÁNÍ DAT ######################## for group in for_analyze: if len(group) == 1: if group[0][6] == "warn": cur = conn.cursor() with cur: cur.execute('select page_id from page where page_title="' + group[0][10] + '"') data = cur.fetchall() rev_near = [] if len(data) == 0: #Jestliže byla stránka smazána, nastav tak rev_near rev_near = [["DeletedPage"]] else: #Pokud ne, zjisti, zda kolem spuštění filtru proběhla nějaká editace cur = conn.cursor() 12
with cur: cur.execute('select * from revision where rev_page=(select page_id from page where page_namespace=0 and page_title="' + group[0][10] + '" limit 1) order by rev_timestamp asc') data = cur.fetchall() #Převést na datetime objekt stamp = group[0][8] stampDt = datetime.datetime.strptime(stamp,'%Y%m%d%H%M%S') stamp = stampDt del(stampDt) for rev in data: #Převést data v tabulce na datetime objekt stamp2 = datetime.datetime.strptime(rev[6], '%Y%m%d%H%M%S') #Hledáme blízké revize, dokud je timestamp menší, přeskakuj if stamp2.year < stamp.year: continue elif stamp2.month < stamp.month: continue elif stamp2.day < stamp.day: continue elif stamp2.hour < stamp.hour: continue elif stamp2.minute < stamp.minute: continue elif stamp2.second < stamp.second: continue #Dorazili jsme na alespoň stejně datovanou revizi
13
#Přičti k timestamp u abuseFilteru 15 sekund stampA = stamp + datetime.timedelta(0, 15) #Jakmile najdeme mladší revizi, přidejme ji do proměnné, pokud je starší, stopni cyklus if stamp2.year < stampA.year: rev_near.append(rev) elif stamp2.month < stampA.month: rev_near.append(rev) elif stamp2.day < stampA.day: rev_near.append(rev) elif stamp2.hour < stampA.hour: rev_near.append(rev) elif stamp2.minute < stampA.minute: rev_near.append(rev) elif stamp2.second < stampA.second: rev_near.append(rev) else: break #Jestliže žádná editace kolem spuštění neproběhla, editra varování zastrašilo if len(rev_near) == 0: ended += 1 together += 1 else: #Jestli ne, zjisti, zda nebyla stránka smazána if rev_near[0][0] == "DeletedPage": #Pokud ano, zvyš počitadlo pageDeleted += 1 together += 1 else:
14
#Pokud ne, editr editaci upravil, aby prošla filtrem edited += 1 together += 1 else: #Pokud se nejednalo hned o varování, musela být editace uložena #TODO: Nebo se mohlo jednat o další varování, zkontrolovat saved += 1 together += 1 else: #Pokud se k jedné stránce vztahuje více logů, musela být editace uložena saved += 1 together += 1 #Vytištění výsledků na výstup result = {} result['saved'] = saved result['ended'] = ended result['edited'] = edited result['pageDeleted'] = pageDeleted result['together'] = together o_f = open('result.json', 'w') o_f.write(json.dumps(result)) print json.dumps(result)
15
Příloha č. 2 Program
generující
graf,
online
verze
programu
k dispozici
na
https://github.com/urbanecm/abuseFilter/blob/finalWork/public/index.py, citováno 14. 4. 2016 #!/usr/bin/env python #-*- coding: utf-8 -*print """ <meta charset="utf-8" /> <script type="text/javascript" src="https://www.google.com/jsapi"> <script type="text/javascript"> // Load the Visualization API and the piechart package. google.load('visualization', '1.0', {'packages':['corechart']}); // Set a callback to run when the Google Visualization API is loaded. google.setOnLoadCallback(drawChart); // Callback that creates and populates a data table, // instantiates the pie chart, passes in the data and // draws it. function drawChart() { // Create the data table. var data = new google.visualization.DataTable(); data.addColumn('string', 'Topping'); data.addColumn('number', 'Slices'); data.addRows([ """ import json
16
f = open('/data/project/urbanecmbot/abuseFilter/result.json', 'r') data = json.loads(f.read()) res = [] res.append('["Ukončeno", ' + str(data['ended']) + '],') res.append('["Stránka smazána", ' + str(data['pageDeleted']) + '],') res.append('["Uloženo", ' + str(data['saved']) + '],') res.append('["Upraveno", ' + str(data['edited']) + ']') for i in res: print i print """ ] ); // Set chart options var options = {'title':'Editační filtr 15 - statistika', 'width':400, 'height':300}; // Instantiate and draw our chart, passing in some options. var chart = new google.visualization.PieChart(document.getElementById('chart_d iv')); chart.draw(data, options); }
"""
17
Seznam použité literatury Přispěvatelé
Wikipedie, Wikipedie:Co
Wikipedie
není [online],
Wikipedie:
Otevřená
encyklopedie, c2015, Datum poslední revize 1. 12. 2015, 00:13 UTC, [citováno 5. 04. 2016]
Přispěvatelé Wikipedie, Wikipedie [online], Wikipedie: Otevřená encyklopedie, c2016, Datum poslední
revize
1. 01. 2016,
14:18
UTC,
[citováno
5. 04. 2016]
Přispěvatelé Wikipedie, Nupedia [online], Wikipedie: Otevřená encyklopedie, c2014, Datum poslední
revize
1. 03. 2014,
16:48
UTC,
[citováno
5. 04. 2016]
Wikipedie se vyrovná Britannice. Aktuálně.cz [online]. [cit. 2016-02-01]. Dostupné z: http://zpravy.aktualne.cz/wikipedia-se-vyrovna-britannice/r~i:article:31547/ Screenshot posledních změn: Poslední změny. In: Wikipedia: the free encyclopedia [online]. San Francisco (CA): Wikimedia Foundation, 2001- [cit. 2016-04-05]. Dostupné z: https://cs.wikipedia.org/wiki/Speci%C3%A1ln%C3%AD:Posledn%C3%AD_zm%C4%9Bny Přispěvatelé Wikipedie, Wikipedie:Blokování [online], Wikipedie: Otevřená encyklopedie, c2016,
Datum
poslední
revize
22. 03. 2016,
01:25
UTC,
[citováno
5. 04. 2016]
18