Saltar para: Posts [1], Pesquisa [2]

Bits & Bots

Robôs e pedaços de bits do planeta wikimédia e arredores.

Bits & Bots

Robôs e pedaços de bits do planeta wikimédia e arredores.

"Por Jnvalves (Obra do próprio) [CC BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0)], undefined" href="https://commons.wikimedia.org/wiki/File%3AO_Fanal%2C_Ilha_da_Madeira%2C_Portugal.jpg">

O regresso do Aleph Bot

por Alchimista, em 09.06.17

Bot Sketch Eric Benacek

 

Após uma paragem que durou anos, o Aleph Bot, o bot anti-vandalismo que faz companhia ao Salebot regressa ao activo.

 

 

 O Aleph_Bot começou a operar em 2010, tendo como base o código do AVBOT, um robô desenvolvido por Emijrp, um editor da Wikipédia em Espanhol, e era precisamente por lá que operava. Tratava-se de um código extremamente interessante, onde, em comparação com o do Salebot, outro robô anti-vandalismo que opera na pt.wp, trazia inovações como a diferenciação do tipo de edição - edição de testes, vandalismo ou branqueio de página, avisos específicos para o tipo de edição, assim como o reportar de utilizadores que apesar dos avisos reincidem nas edições. 

 

 Apesar de no início a adaptação à wikipédia Lusófona ter corrido a bom ritmo, a verdade é as especificidades da wikipédia em língua espanhola estavam embutidas no código, não separadas em variáveis, e se é verdade que houve uma tentativa de reescrever essas especificidades em variáveis localizáveis, com o passar do tempo o código do Aleph foi divergindo da versão original cada vez mais, até ficar complicada a sua manutenção, e deu-se a inevitável depreciação.

 A ideia de criar um novo código surgiu ainda o Aleph estava ao serviço, aproveitando as ideias do AVBOT mas num código mais flexível, e onde as variáveis de configuração estivessem o mais longe possível do código, permitindo mais flexibilidade, e ao mesmo tempo, que o código pude-se ser usado noutros projectos. A primeira tentativa deu-se com o python 2.7, assentando no Twisted, e indo buscar as mudanças recentes ao irc. Foram bons tempos, mas ao mesmo tempo momentos frustrantes, com imensos UnicodeDecodeError a saltitar por tudo o que era canto. Aliado a isto, noticias de uma possível depreciação do servido de mudanças recentes no irc deixaram-me relutante em continuar por um caminho que poderia estar condenado, então a certo ponto decidi aguardar, e o Aleph caiu na penumbra.

 

Uns tempos mais tarde, decidi voltar à carga, desta vez começando do zero, e já com o python 3. E que diferença tremenda. Por muitas discussões em redor da questão py3/py2, a verdade é que especialmente para trabalhar com artigos da wikipédia, o py3 é uma enorme lufada de ar fresco, tirando, é claro, o caso particular das predefinições do wikitexto, onde chego a ter pérolas como esta:  "{{{{Subst:{0}{3}.css|{1}|{2}|{3}}}}}".format(msg, ptitle, oldid, aleph_warns, bv)

 

 Se o irc já tinha recuperado o seu estatuto de intocável, o RCStream apresentava-se como uma excelente alternativa, até porque fornecia mais informação do que o irc, e de uma forma mais estruturada, então o código que estava a nascer foi adaptado para usar este novo sistema. Infelizmente teve um tempo de vida curto, porque pouco depois de começar a usa-lo, foi depreciado em favor do EventStreams. Neste caso, a modificação não foi muito custosa.

 

 Como é óbvio, a parte mais custosa de todo o processo é determinar se uma edição deve ou não ser revertida, e como o bot tenta fazer a distinção entre edições de teste ou vandalismos óbvios, as complicações aumentam. Na implementação actual, que espero vir a descrever mais pormenorizadamente no futuro, há uma contabilização das expressões problemáticas que ocorrem nas linhas adicionadas e removidas, e após o saldo entre as duas, contabiliza-se a pontuação. No final, todas as expressões encontradas dão origem a uma pré-classificação do género {'T': -12, 'G': 2, 'V': 0}. Com esta classificação, o passo seguinte é determinar a classificação da edição e o seu valor, entrando então um sistema de análise de pontuação. De uma forma simples, se a pontuação de vandalismo ou teste é inferior a um valor definido, a edição é classificada como tal, se for superior ao limite definido, é classificada como boa, e se ficar entre um intervalo definido como limbo, tenta usar o ORES ( um sistema de inteligência artificial), para verificar se a edição deve ser revertida.

 

 No caso de reversão, ocorre ainda a verificação se o penúltimo editor não é o bot, ou o Salebot, a fim de evitar guerras de edições, a reversão e a posterior notificação. Ao enviar a notificação, o bot verifica se existem mais avisos, e futuramente será implementado um sistema de notificação na wiki quando se verifica que há um utilizador já com inúmeros avisos. Na verdade, a partir do momento em que o código estabiliza e os bugs com o core code do bot desaparecem, a ideia é implementar um sistema de notificações na wiki de situações que convém análise humana, nomeadamente os tais editores com muitos avisos, ou edições do bot revertidas. Na prática, o Aleph é eternamente um projecto em curso.

 

 Paralelamente ao desenvolvimento do código em si, há um painel de controlo em desenvolvimento em https://tools.wmflabs.org/aleph/. Recorrendo ao OAuth, é possível utilizadores da wikipédia autenticarem-se, e no caso de serem administradores, conseguem parar o Aleph. Há alguns dados sobre o estado do script no grid engine, que por agora apenas são despejados sem grande tratamento, mas o plano é que a partir desse painel se tenha acesso às análises do bot, assim como controlar alguns dos seus parâmetros.

Presidenciais 2016 em Portugal na Wikipédia

por Alchimista, em 26.01.16

    Este último fim de semana decorreram as eleições Presidenciais em Portugal, e conforme a tradição, o que foi escrito ao longo do período de pré-campanha nas páginas da wiki tiveram relevo. Dai surgiu a curiosidade de tentar perceber o efeito eleições <-> wikipédia, e neste primeiro tópico começo a debruçar-me sobre as visualizações, aproveitando a nova API RESTBase que fornece os dados das visualizações dos artigos, de uma forma mais aperfeiçoada em relação à ferramenta que aparece no histórico das páginas, o http://stats.grok.se/.

 

    Os primeiros dados são interessantes, começando a análise a 10 de Outubro do ano passado temos o gráfico seguinte:

 Visualização das visitas às páginas dos candidatos à Presidência da República durante o período eleitoral e pré-eleitoral.

Por Alchimista (Obra do próprio) [CC BY-SA 4.0 (http://creativecommons.org/licenses/by-sa/4.0 )], undefined. Origem: https://commons.wikimedia.org/wiki/File:P2016_2m.png

 Nos primeiros dias ainda se apanha um pouco da entorpia causada pelas eleições,com as visualizações a estabilizarem até meio de Dezembro, e a partir dessa altura temos outra vizualização mais pormenorizada na figura seguinte.

 

     Visualização das visitas às páginas dos candidatos à Presidência da República durante o período eleitoral.

Por Alchimista (Obra do próprio) [CC BY-SA 4.0 (http://creativecommons.org/licenses/by-sa/4.0 )],  undefined. Origem: https://commons.wikimedia.org/wiki/File:P2016_2m.png

    O primeiro grande pico de visualizações ocorreu pelo dia 17, curiosamente no dia em que Marisa Matias formaliza a candidatura há o referido pico, onde Sampaio da Nóvoa tem grande destaque. Na sema seguinte, logo nos dias posteriores ao Natal Marisa Matias e Sampaio da Nóvoa têm mais um pico de visualizações, com Marisa Matias a destacar-se com o dobro das visualizações, que vão acalmando com o aproximar da passagem de ano. Sobressai igualmente que no periodo de campanha eleitoral, a visualização dos candidatos aumentou significativamente, com as visualizações de Sampaio da Nóvoa em grande destaque.

    Curiosamente o artigo sobre Marcelo Rebelo de Sousa, que acabou por vencer as presidenciais, apresentou valores de vizualizações muito discretas comparando com os outros candidatos mais mediáticos, e o artigo de Maria de Belém teve valores de visualizações discretos. Esta disparidade pode dever-se à maior ou menor penetração nas faixas mais jovens, onde a internet tem um papel mais preponderante, mas é algo difícil de comprovar.

    Edgar Silva formalizou a sua candidatura no dia 7 de dezembro de 2015, e a sua página foi criada somente 3 dias depois. Até ao dia 10 de Dezembro de 2015, a página Edgar Silva era um redirecionamento para  Edgar Bruno Silva, "um futebolista brasileiro que actua como atacante, atualmente defende o Al Shabab Al Arabi Club."

 

[Notas técnicas: Jorge Sequeira e Cândido Ferreira, ambos candidatos, não surgem na análise por até à data não terem artigo da wikipédia.

    A análise aqui feita é uma primeira abordagem e baseia-se em dados publicos disponibilizados pela Fundação Wikimédia relativa aos artigos. ]

Tutorial de pywikipediabot - IV

por Alchimista, em 18.01.13

No wikivoyage.org houve necessidade de mover uma enorme quantidade de páginas que estavam no formato "JAMGuides:" para "Wikivoyage:", não deixando para trás redirecionamentos, algo que se revelou extremamente simples. O pormenor foi a flag temporária de administrador que o bot recebeu, para poder não deixar redirecionamentos, pois isso é basicamente uma eliminação automática dos mesmos. Como o projecto tem ainda poucas páginas, e era uma operação básica, a listagem das páginas foi obtida pela lista de páginas totais no domínio principal, caso contrário teria de ser usada uma outra opção, e, além do mais, a opção mais lógica, que é a busca por páginas começadas por uma determinada string não estava a funcionar correctamente, portanto seguiu-se esta via. O script em sí é básico, e creio, facilmente entendível:

  

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wikipedia as pywikibot
import pagegenerators


def main():

    # Definir o site, e obter a listagem de todas as páginas do domínio principal.
    site = pywikibot.getSite("pt","wikivoyage")
    gen = pagegenerators.AllpagesPageGenerator(site=site,includeredirects=False)
    for i in gen:

        # Aqui filtramos os títulos que começam por "JAMGuides", separando primeiro

        # o título tendo por base o ":", e, caso tenha o ":", verificar se antes da ocorrência

        # o texto é "JAMGuides".
        if i.title().split(":")[0] == u'JAMGuides':

            # Criação do novo título, a segunda parte é igual, logo compõem-se o novo título fácilmente
            ntitle = u"Wikivoyage:%s" % i.title().split(":")[1]
            print u"old title: ", i.title(), u" |--->  new title: ", ntitle, u" |--> afluentes: "
            try:

                # E por fim move-se a página para o novo título.
                i.move(ntitle, leaveRedirect=False, reason=u"[[Wikivoyage:BOT|BOT]]: A mover páginas para título correcto.")
            except:
                print u"error"
        else:
            pass

if __name__ == "__main__":
    try:
        main()
    finally:
        pywikibot.stopme() 

https://github.com/alchimista/pywikipedia-tutorial

 

 


Tutorial de pywikipediabot - III

por Alchimista, em 20.09.12

Neste tópico abordaremos outras funcionalidades interessantes do pywikipediabot, nomeadamente a obtenção no namespace de uma página, quer no formato numérico, quer no nome do namespace. Veremos igualmente como obter o título da página principal, ou seja, por exemplo no caso wikipedia:Ajuda/edição, obter wikipedia:Ajuda, ou então somente Ajuda. Há outras formas de filtrar os artigos, por exemplo, se apenas pretendesse-mos os artigos do domínio wikipéda da categoria !Robótica, o módulo pagegenerators tem opções para isso, mas para já, iremos aumentando a complexidade aos poucos.

 

Informação sobre os namespaces pode ser encontrada em Mediawiki.org:Manual:Namespaces, ou Mediawiki.org:Namespaces. Nos projectos locais é frequente usarem para além dos namespaces padrão, formas personalisadas, e, na wikipédia Lusófona por exemplo, a documentação pode ser encontrada em Wikipédia:Domínio.

 

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#	   
#	   (C) 2012 Alchimista <alchimistawp@gmail.com>
#		 
#		Distributed under the terms of the GNU GPL license.

import sys, os

import wikipedia
import catlib
import pagegenerators

def main():
	site = wikipedia.Site("pt", "wikipedia")
	cat = catlib.Category(site, u"!Robótica")
	''' Como explicado anteriormente, temos definido o site e a categoria
		podendo então passar-mos a obter a listagem das páginas,
		onde desta vez usaremos o pagegenerators. Uma opção mais rápida será
		usar igualmente o preloadingGen, bastando para isso
		fazer algo como 
		pages = pagegenerators.PreloadingGenerator(pagegenerators.CategorizedPageGenerator(cat))
		Isto faz com que as páginas sejam carregadas no início, ao contrário
		do script actual, que carrega à medida que forem necessárias. 
	'''
	pages = pagegenerators.CategorizedPageGenerator(cat)
	for page in pages:
		'''Agora que temos a iteração vamos primeiro obter o título
		'''
		print page.title()
		
		''' Com o page.namespace() obtemos o namespace da página
			embora no formato canonico, ou seja, número. Para obter
			o nome do namespace, fazemos o site.namespace().
			Para fazer tudo junto, basta substituir as duas linhas por
			namespace = site.namespace(page.namespace())
		'''
		
		pageNamespaceNumber = page.namespace()
		namespace = site.namespace(pageNamespaceNumber)
		if namespace == u"Ajuda":
			''' Aqui filtramos as páginas que pertencem ao namespace Ajuda
				e obteremos o nome do namespace, assim como as predefinições
				contidas nas páginas. '''
			print len(page.get())
			print u"namespace: ", site.namespace(page.namespace())
			print u"templates: ", page.templates()
		elif namespace == u"Wikipédia":
			''' Neste bloco, apenas os artigos do namespace wikipédia são filtrados,
				e obteremos o namespage e o título do artigo, sem namespace ou subpáginas
				(resumidamente, o título do artigo principal)
			'''
			print u"namespace: ", site.namespace(page.namespace())
			print u"Página principal (título sem subpágina): ", page.sectionFreeTitle()
			print u"Página principal sem título nem namespace: ", page.title(withNamespace=False)
			
			
if __name__ == "__main__":
	try:
		main()
	finally:
		wikipedia.stopme()	

https://github.com/alchimista/pywikipedia-tutorial 

Tutorial de pywikipediabot - II

por Alchimista, em 19.09.12

 

No primeiro post vimos como de uma forma básica se pode obter o conteúdo de uma página. Infelizmente, na sua utilização tradicional, os bots são utilizados para edições massiças, ou então para obter informação de um grande número de páginas pelo que o script anterior não nos seve, então vamos interagir com categorias. Há um pormenor importante a realçar: caso se trate de obter informação de um grande número de páginas, é extremamente aconselhado usar dumps, que podem ser obtidos em http://dumps.wikimedia.org/,por exemplo. Mais informação pode ser obtida em Meta:Data dumps.

 

No script seguinte, contaremos os artigos de uma categoria. Obteremos o título dos artigos, e contaremos os elementos. Relativamente ao script do primeiro post, o código ficará dentro de uma definição ( def main()) para tirar-mos vantagem do wikipedia.stopme(), que basicamente informa o servidor de que o script fez o seu trabalho, interrompendo a ligação.

 

 

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#	   
#	   (C) 2012 Alchimista <alchimistawp@gmail.com>
#		 
#		Distributed under the terms of the GNU GPL license.

import sys, os

import wikipedia
import catlib
import pagegenerators

def main():
	''' Esta é a def onde o nosso script vai estar '''
	
	site = wikipedia.Site("pt", "wikipedia") # definimos que o site é a pt.wp
	
	'''De seguida, definimos a categoria Ambiente
	 e obtemos a listagem dos títulos dos artigos.
	 Na demonstração o código está por extenso para
	 mais fácil percepção, na prática, bastaria
	 pages = catlib.Category(site, u"Ambiente").articles()
	 para se obter a listagem	  
	'''
	cat = catlib.Category(site, u"Ambiente") # Aqui definimos a categoria Ambiente. 
	catList = cat.articlesList()


	'''Agora que temos uma listagem,
	 e antes de contar os elementos,
	 vamos ver os títulos que constam na catList.
	 
	 Esta abordagem serve bem para ilustrar este exemplo,
	 caso fosse para interagir directamente com os artigos,
	 como veremos noutro post, há abordagens mais eficientes.
 
	 O primeiro print, ou seja, no caso o objecto page,
	 é um objecto python, enquanto que o segundo print,
	 o do page.title(), já tem o formato de unicode.
	'''
	
	for page in catList:
		print u"página (objecto):", page
		print u"Título da página: ", page.title() # mostra o título do artigo


	''' Por fim, fazemos a contagem dos artigos	'''
	
	print u"\n Nº de artigos na categoria: ", len(catList)
	
if __name__ == "__main__":
	try:
		main()
	finally:
		wikipedia.stopme()	

https://github.com/alchimista/pywikipedia-tutorial

Tutorial de pywikipediabot - I

por Alchimista, em 19.09.12

Não há muitos developers de bots na pt.wp, na verdade, contam-se pelos dedos das mãos aqueles que criam regularmente scripts próprios. A verdade é que nunca houve um grupo activo dedicado ao pywp, contrariamente por exemplo, ao que acontece com os gadjects, ou scripts em javascript.

 

Com isso em mente, há há agum tempo que planeio criar um tutorial para que os primeiros passos sejam mais fáceis, pois a verdade é que não há propriamente um ponto de partida que contenha informação suficientemente desenvolvida para que possa ser um verdadeiro manual introdutório. Enquanto não arranjo tempo e vontade para escrever um manual explicativo e bem estruturado, espero ir colocando aqui informações avulsas que possam ajudar, e, quem sabe, no final compilar tudo num tutorial final, na wikipédia.

 

Pois bem, o primeiro exemplo de um script pywp terá como finalidade colocar um texto numa página da wikipédia. Estes primeiros passos vão ser explicados com mais detalhe, porque a verdade é que na esmagadora maioria dos meus scripts, o pywp ocupa apenas uma pequena parte, e é sensivelmente sempre a mesma, ou seja, para as tarefas do quotidiano, conhecer meia dúzia de classes e definições é quanto baste para criar scripts úteis no dia a dia wikipédico.

 

No script seguinte, vamos obter o texto de Wikipédia:Página de testes/4  e substitui-lo por "Olá Mundo! Isto é um teste de edição :D". Presume-se que tenham conhecimentos básicos de python, caso haja dificuldade em compreender algo, a secção de comentários está á disposição.

 

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       
#       (C) 2012 Alchimista <alchimistawp@gmail.com>
#         
#        Distributed under the terms of the GNU GPL license.

import sys, os

try:
	sys.path.append(os.environ['HOME'] + '/wp/bots/pywikipedia')
except:
	pass

''' 
 Primeiro importamos o módulo wikipedia, o qual nos trará as soluções mais básicas,
 e ao mesmo tempo grande parte das que normalmente são necessárias para interagir com
 o mediawiki. '''

import wikipedia

''' O primeiro passo antes de interagir com a API do mediawiki, é definir
qual o projecto/site com que estamos a lidar, para isso usamos:
'''
site= wikipedia.Site("pt", "wikipedia") # definimos que o site é a pt.wp

''' Agora, vamos estabelecer as definições de uma página, neste caso,
 a página de testes/4: '''

wpage = wikipedia.Page(site, u"wikipédia:Página de testes/4")

''' Agora que definimos a página, vamos obter o texto da página: '''
wpagetext = wpage.get()

print wpagetext # print ao conteúdo da página

''' Tendo o conteúdo, e ignorando-o por completo, vamos então substituir
 por um novo texto.
'''
newtext = u"Olá Mundo! Isto é um teste de edição :D" # definimos o novo texto

wikipedia.showDiff(wpagetext, newtext) # mostra o diferencial da edição sem salvar

Aleth Bot no top 10 de bots com mais edições da Wikipédia Lusófona

por Alchimista, em 02.06.12

Recentemente constactei uma agradável surpresa, a Aleth_Bot encontra-se já listada no top 10 dos bots com mais edições de sempre da Wikipédia Lusófona, e se tiver-mos em conta bots operados por operadores locais, está em 4º Lugar.

 

A lista é liderada pelo Rei-Bot, que apesar de não editar desde Setembro de 2010, conta com 1137298 edições, e é operado pelo Rei Artur. Tanto o bot como o operador sã figuras mais do que históricas, autênticas lendas vivas.

 

No que toca à Aleth, são 356797 edições repartidas por várias tarefas, todas elas efectuadas por scripts desenvolvidos específicamente para a pt.wp, e que rodam de forma totalmente autónoma no Toolserver, aproveitando os recurosos disponibilizados, especialmente os de Job scheduling. Para se ter noção da relativa complexidade de manutenção, para além da manutenção dos scripts, são dois crontabs, um para fazer correr os scripts de curta duração como o envio de mensagens ou arquivamento de páginas de discução, que corre num servidor normal, e outro crontab para controlar os scripts que irão correr por largos períodos, dias e afins.

 

Para estes scripts que necessitam correr por longos periodos, há um server próprio, que irá escolher qual o servidor com recursos disponíveis que irá acolher o script. Além disso, há sempre a necessidade de manter o consumo de recursos em níveis aceitáveis, manter o consumo de memória baixo, ou os mesmos irão parar ou apresentar erros, ou a memória física disponível.

Wiki(pédia) depois da edição básica – robôs e semântica

por Alchimista, em 17.04.12

 

 

 

Como juntar a Wikipédia, web semántica, data mining e robôs numa única apresentação? Exacto, estou a falar da apresentação do Eduardo Pinheiro no Encontro Nacional de Estudantes de Informática, na Faculdade de Ciências da Universidade de Lisboa. Link aqui!

Morre um dos criadores do UNIX

por Alchimista, em 13.10.11

From Wikimedia Commons

  

Falece Dennis Ritchie, um dos criadores do sistema operativo UNIX, e posteriormente da liguagem de programação C.

Software produz texto sem intervenção humana

por Alchimista, em 14.09.11
origem: wikimedia commons

 

 

 

Hoje a imprensa faz eco de uma empresa que desenvolveu um software inovador, capaz de produzir textos sem intervenção humana. À primeira vista algo de extraordinário, mas na verdade algo já com larga tradição no mundo Wikipédico. Na versão Lusófona por exemplo, em 2004, um bot de seu nome Borg criou vários artigos de cidades brasileiras, ou ainda o PCM. Apesar de pouca informação disponível sobre a façanha actual, aparentemente as diferenças entre o que se usa nos projectos wikimedia e o novo software, são basicamente de ordem mais técnica. Nos bots usados na wikipédia, a informação deve estar previamente estruturada, para que o esforço se concentre mais na criação do artigo em si, enquanto o novo software não tem necessidade desse pré-tratamento. Nada de anormal, afinal, se formos ver, o procedimento tem já uma história de mais de 5 anos na wikipédia, desenvolvido por voluntários, mas não deixa de ser interessante verificar como algo que pode ser considerado banal na wikipédia atinge proporções mediáticas desta magnitude.

 

Mais sobre mim

foto do autor

Arquivo

  1. 2017
  2. J
  3. F
  4. M
  5. A
  6. M
  7. J
  8. J
  9. A
  10. S
  11. O
  12. N
  13. D
  14. 2016
  15. J
  16. F
  17. M
  18. A
  19. M
  20. J
  21. J
  22. A
  23. S
  24. O
  25. N
  26. D
  27. 2015
  28. J
  29. F
  30. M
  31. A
  32. M
  33. J
  34. J
  35. A
  36. S
  37. O
  38. N
  39. D
  40. 2014
  41. J
  42. F
  43. M
  44. A
  45. M
  46. J
  47. J
  48. A
  49. S
  50. O
  51. N
  52. D
  53. 2013
  54. J
  55. F
  56. M
  57. A
  58. M
  59. J
  60. J
  61. A
  62. S
  63. O
  64. N
  65. D
  66. 2012
  67. J
  68. F
  69. M
  70. A
  71. M
  72. J
  73. J
  74. A
  75. S
  76. O
  77. N
  78. D
  79. 2011
  80. J
  81. F
  82. M
  83. A
  84. M
  85. J
  86. J
  87. A
  88. S
  89. O
  90. N
  91. D