Viquipèdia:Llibreria de funcions per programar bots

Ús d'una funció amb el mètode sub modifica

L'amical Bot identifica els enllaços interns i els tradueix emprant el traductor de la Generalitat. en un determinat pas els enllaços tenen el format text enllaç traduït. n és un número correlatiu que identifica els enllaços contant tal com apareixen en l'article original ja que al traduir, de vegades, canvien d'ordre en l'article traduït.

Llavors en un altre pas una funció empra les interwikis per trobar el títol del article en català al que cal enllaçar. Substituint (n) pel títol de l'article n'hi hauria prou, però en cas que el títol coincideixi amb el text traduït no interessa arribar a un resultat del tipus: text enllaç traduït.

La següent funció fa servir la possibilitat de que el mètode sub cridi a una funció per resoldre això.

# -*- coding:utf-8 -*-

import re

def nouenllac(a):
	global enllacara
	#Per fer que no es repeteixi el nom del enllaç
	#Si la frase enllaçada i la frase traduïda són iguals construeix l'enllaç sense repetir
	print 'enllacara ', enllacara
	print 'a.group(1) ', a.group(1) #a.group(0) conté tota la cadena trobada, a.group(1) conté el grup que hi ha entre () a la ER
	if enllacara != a.group(1):
		return '[['+enllacara+r'|'+a.group(1)+']]'
	else:
		return '[['+enllacara+r']]'

def sub_amb_funcio():
	global enllacara
	noutext_desti = u"sdfsa [[(1)|Pep]], sdfsf [[(1)|Pepet]] fas" #text de prova per demostrar el que fa.
	enllacara = u"Pep" #títol de la pàgina on ha d'apuntar l'enllaç intern
	n = 1 #nombre d'exemple
	r = re.compile('\[\[\('+format(n)+'\)\|([^\]]*)\]\]') 
	noutext_desti = r.sub(nouenllac,noutext_desti)
	print noutext_desti #per veure el resultat que s'ha obtingut

sub_amb_funcio()

Traducció de dates en anglès al català modifica

# -*- coding:utf-8 -*-def data(textang) :
    temp=textang.strip("[],")
    llista=temp.split()
    if len(llista) != 2:
      return ""
    mesminusc=llista[0].lower()
    if mesminusc == "january":
       mes = u"de gener"
    elif mesminusc == "february":
       mes = u"de febrer"
    elif mesminusc == "march":
       mes = u"de març"
    elif mesminusc == "april":
       mes = u"d'abril"
    elif mesminusc == "may":
       mes = u"de maig"
    elif mesminusc == "june":
       mes = u"de juny"
    elif mesminusc == "july":
       mes = u"de juliol"
    elif mesminusc == "august":
       mes = u"d'agost"
    elif mesminusc == "september":
       mes = u"de setembre"
    elif mesminusc == "october":
       mes = u"d'octubre"
    elif mesminusc == "november":
       mes = u"de novembre"
    elif mesminusc == "december":
       mes = u"de desembre"
    else:
        mes="nosepas"
    dia=llista[1]
    return dia+" "+mes

Generar un diccionari per cada plantilla d'un article modifica

Enunciat modifica

Per facilitar la manipulació del contingut de les plantilles d'un article, per exemple per substituir plantilles obsoletes per plantilles noves es desitja una funció que generi una llista de diccionaris, un per cada plantilla que hi ha en un article.

A la funció se li passa com argument el text de l'article i retorna la llista de diccionaris.

Cada plantilla ha de generar un diccionari de la forma {"nom de la plantilla":{"nom del paràmetre":"valor del paràmetre", ...}}

Als paràmetres que no tenen noms se'ls assignen noms correlatius: "1", "2", "3" ....

Proposat per --Gomà (disc.) 12:54, 11 ago 2010 (CEST)[respon]

Generar una base de dades de plantilles modifica

Enunciat modifica

Pensant també en l'amical-bot, seria bo crear una base de dades de les plantilles de la viquipèdia en català amb els seus paràmetres, per poder traduir les plantilles al català. També estaria bé fer-ho amb algunes més utilitzades de en/fr/es. Així es podrien traduir les plantilles automàticament sense haver de fer-ho a la subpàgina de l'amical.

S'hauria d'entrar una llista de pàgines (o una categoria, tipus Categoria:Plantilles) i, per cada plantilla, agafar tots els arguments i col·locar-los en un diccionari, utilitzant el mètode descrit a la funció anterior: {"nom de la plantilla":{"nom del paràmetre":"valor del paràmetre", ...}}. Amb les plantilles d'altres llengües s'hauria d'intentar fer el mateix, però només les que tenen interwiki al català. Es podria saber fàcilment així:

  • Quan es mira la plantilla catalana (s'haurien de mirar totes), el bot també s'apunta els interwikis.
  • A l'hora de mirar-ho en altres llengües, només ho fa a les que estan a la llista anterior.
Proposat per --Joancreus (discussió) 09:53, 22 ago 2010 (CEST)[respon]

A partir del títol d'un article en una llengua trobar, si hi és, l'article corresponent en un altre modifica

Enunciat modifica

Per detectar per exemple si tenim o no i quin desenvolupament tenen en català els articles de la llista dels més llegits en francès cal mirar a traves de les interwikis quin article en català hi correspon si és que n'hi ha cap.

A la funció se li passen com a paràmetres el títol de l'article original, el codi de la llengua original i el codi de la llengua destí. Torna una cadena buida si l'article no hi és en la llengua de destí i un objecte page si sí que hi és.

Compte amb les redireccions (potser encadenades indefinides vegades) tant a la llengua original com a la llengua de destí.

Comte amb els enllaços cap a seccions en comtes de cap a l'article.

Proposat per: --Gomà (disc.) 12:55, 11 ago 2010 (CEST)[respon]

Proposar les categories en català a partir de les categories en un altre llengua modifica

Enunciat modifica

L'amical-bot no tradueix les categories. Es tracta de fer una funció que proposi una traducció aprofitant els interwikies tal com fa amb els enllaços interns.

A la funció se li passa el codi del idioma i la llista de categories. Retorna una cadena amb les categories proposades. Separades per "\n\n" de forma que es puguin encadenar directament al text de la traducció proposada.

Si una categoria en l'idioma original no té interwiki cap al català cal pujar a les categories pare d'aquesta fins a arribar a un nivell que si que tingui interwiki.

No hi ha d'haver cap categoria repetida. Ni categories redundants. Compte que en alguns idiomes categoritzen l'article a una categoria i a la pare (o avantpassat) al mateix temps. En català en aquests cassos només ha d'estar a la de més detall.

Llegir un fitxer de dades estadístiques modifica

Enunciat modifica

Per tal d'actualitzar articles o crear-ne automàticament o afegir informació procedent de dades estadístiques convé baixar-se fitxers amb les dades de webs oficials i omplir un diccionari que permeti anar-les emprant en el cos del programa.

Es pretén fer una funció que llegeixi qualsevol fitxer de dades estadístiques que tingui una línia per cada entitat que contingui una llista de dades separades per un càracter separador. Per exemple si la web oficial permet baixar les dades en excel copipastejant la taula (sense les capçaleres) al notebok s'obté un fitxer d'aquest tipus.

Es proposa la següent funció:

resultat = llegeix(fitxer,separador, dades,dades_interes,dada_index)

on:

fitxer és una cadena amb el nom del fitxer a llegir. separador és la cadena de caràcters que separa els camps de dades. dades és una llista de cadenes, cada cadena és el nom de un camp de dades, han d'astar en el mateix ordre que al fitxer. dades_interes és la llista de cadenes que identifiquen les dades de interès i per tant que interessa conservar per fer servir després, ha de ser un subconjunt de la llista anterior. dada_index és la dada que identifica cada objecte i que despres es farà servir per cridar els resultats.

La funció ha de retornar un diccionari de diccionaris. La clau principal ha de ser la dada_índex i les claus secundàries el nom de cada una de les dades d'interès.

De forma que un cop executada la funció escribint:

Podeu probar-lo amb algun fitxer de la base de dades estadística de poblacions franceses: [1] print resultat[index]["dada1"]

s'escrigui en pantalla el valor de la "dada1" de l'objecte identificat pel valor emmagatzemant a la variable índex.


Resolució modifica

# -*- coding:utf-8 -*-
import string, wikipedia

def llegeix(fitxer,separador,dades,dades_interes,dada_index):
	#Llegeix un fitxer on cada línia és un registre els camps estan separats per una cadna anomenada "separador"
	#Crea un diccionari que a cada valor de la "dada_index" li fa correspondre un altre diccionari amb les dades del registre
	#El diccionari de les dades de cada registre a cada cadena de la llista de dades d'interès li fa correspondre el seu valor 
	resultat = {}
	fitxer_entrada = open(fitxer, "rt")
	while True:
		linia_entrada = fitxer_entrada.readline()
		if not linia_entrada:
			break
		linia_entrada = linia_entrada[:-1]
		linia_entrada = wikipedia.UnicodeToAsciiHtml(linia_entrada)
		separador = wikipedia.UnicodeToAsciiHtml(separador)
		instruccio = ''
		for dada in dades:
			if instruccio != '' : instruccio = instruccio + ", " 
			instruccio = instruccio + dada
		instruccio = instruccio + "= linia_entrada.split(separador)"
		exec instruccio
		diccionari = {}
		for dada in dades_interes:
			instruccio = dada + "= wikipedia.html2unicode(" + dada +")"
			exec instruccio
			instruccio = 'diccionari ["'+dada+'"] ='+dada
			exec instruccio
		instruccio = "resultat[" + dada_index +"] = diccionari"
		exec instruccio
	return resultat

dades = "insee", "departament", "zonaatur", "departament", "depiarrodoni", "depcanto", "nom", "pob07", "pob99", "pob90", "pob82", "pob75", "pob68", "pob62"
dades_interes = "nom", "pob07", "pob99", "pob90", "pob82", "pob75", "pob68", "pob62"
dada_index = "insee"
historia = llegeix(u"poblacio pobles de frança.txt",u"	",dades,dades_interes,dada_index)
print "població de ",historia["01001"]["nom"], " al 62: ", historia["01001"]["pob62"]," al 68: " , historia["01001"]["pob68"], " al 75: ", historia["01001"]["pob75"], " al 82: ", historia["01001"]["pob82"], " al 90: ", historia["01001"]["pob90"], " al 99: ", historia["01001"]["pob99"], " al 07: ", historia["01001"]["pob07"]
print "població de ",historia["02021"]["nom"], " al 62: ", historia["02021"]["pob62"]," al 68: " , historia["02021"]["pob68"], " al 75: ", historia["02021"]["pob75"], " al 82: ", historia["02021"]["pob82"], " al 90: ", historia["02021"]["pob90"], " al 99: ", historia["02021"]["pob99"], " al 07: ", historia["02021"]["pob07"]

--Gomà (disc.) 18:18, 31 ago 2010 (CEST)[respon]

Traduir una pàgina amb google modifica

Per tal d'ampliar l'amical bot i poder triar quin traductor es vol fer servir o per traduir des de llenguatges que no hi ha al traductor de la Genralitat interessa poder capturar el text d'una pàgina traduïda pel traductor de Google.

Feu una funció a la que se li passi el títol de la pàgina i el codi d'idioma i torni el text traduït per google.

No sé si quadra amb els termes d'ús de google. Em sembla que no es pot agafar res per bots. --Joancreus (discussió) 20:09, 24 ago 2010 (CEST)[respon]
No he trobat on ho diu això. En qualsevol cas si no es pot fer servir sense permís ja els demanarem permís. Altra cosa és desenvolupar la funció com exercici del curs.--Gomà (disc.) 10:53, 25 ago 2010 (CEST)[respon]
Punt 5.3 dels Termes d'Ús. S'hauria de demanar permís (unless you have been allowed to do so...) --Joancreus (discussió) 13:04, 25 ago 2010 (CEST)[respon]
Aixó entenc que és pel cercador de Google. Pel traductor ells mateixos ofereixen eines perquè puguis fer-lo servir automàticament. La única limitació que jo hi sé veure és que no pots traduir textos de més de 5000 caràcters [2] per tant poso una funció que trdeueix amb aquesta limitació:

Resolució modifica

# -*- coding:utf-8 -*-


import urllib, re

def tradueix(text, idioma):
	#Torna una cadena que conté el text traduit al català. Cal dir-li el codi de l'idioma inicial. Fa servir el traductor de Google.
	#No admet més de 5000 caracters que és lo que permet Google.
    if len(text) > 5000 : return u"Error no es poden fer traduccions de més de 5000 caracters"
    urllib.FancyURLopener.version = "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008070400 SUSE/3.0.1-0.1 Firefox/3.0.1"
    parametres = urllib.urlencode({"langpair": idioma+"|ca", "text":text,"ie":"UTF8", "oe":"UTF8"})
    pagina = urllib.urlopen("http://translate.google.com/translate_t", parametres)
    contingut = pagina.read()
    pagina.close()
    cerca_resultat = re.compile('(?<=fff.">)[^<]*')
    return cerca_resultat.findall(contingut)[0]

print tradueix("two black dogs","en")

Calcular la distància entre dues ciutats modifica

Hi ha moltes ciutats a les que hi surten les coordenades. Feu una funció a la que se li passin les dues coordenades i doni la distància. Pista: Resolució de tringles en trigonometria esfèrica coneguts un angle i dos costats adjacents.

Trobar les ciutats més properes a una donada modifica

Per tal de poder afegir als articles de ciutats una gràfica que permeti navegar cap als articles de les ciutats més properes interessa poder-les identificar.

Escriure una funció a la que se li passi una llista de llistes. Cada element de la llista correspon a una ciutat i és una llista amb 9 elements: còdi de la ciutat, gaus, minuts, segons, latid(N/S), graus, minuts, segons, longitud(E/O).

La funció ha de determinar a quina distància cal anar per trobar com a mínim 6 ciutats veïnes. Llavors ha de tornar una llista amb la distància i els codis de les ciutats veïnes que estan dins d'aquest radi.