Vés al contingut

Usuari:PereBot/robot categories redundants

De la Viquipèdia, l'enciclopèdia lliure
# -*- coding: utf-8 -*-
# Programa per buscar categories redundants
# Guarda en un fitxer un diccionari amb l'estructura de les categories que
# ha llegit, per estalviar feina els següents cops.

import sys
sys.path.append('C:\pywikipedia')
import wikipedia,catlib,urllib2,re,pickle

# Retorna les categories d'una categoria, subcategories incloses (no articles).
# No torna a mirar les categories que ja ha mirat.
# Filtra pels noms de les categories fent servir una expressió regular.
# Fa servir un diccionari (diccat) per guardar les subcategories de cada categoria.
# Si actualitza=True no consulta el diccionari però l'escriu igualment (serveix
# per actualitzar al diccionari les categories que fa servir)
def miracatfiltrecat(cat,catprevies=[],filtre=u"",diccat={},actualitza=False):
    diccatk=diccat.keys()
    if (cat in diccatk) and (not actualitza):
        categories=diccat[cat]
#        try:
#            print cat,u"té",categories,u"segons el diccionari"
#        except UnicodeEncodeError:
#            print "No imprimible"
    else:
        categories=cat.subcategoriesList(recurse=False)
        diccat[cat]=categories
    for scat in categories:
#        print scat
#        print u"Títol",scat.title()
        if scat not in catprevies:
            catprevies.append(scat)
            if filtre==u"":
                nopassa=False
#                print u"Filtre desactivat"
            else:
                nopassa=re.search(filtre,scat.title())                
            if not nopassa:
#                print u"Sí que es llegeix", scat
                noucats,diccat=miracatfiltrecat(scat,catprevies+categories,filtre,diccat,actualitza)
                categories=categories+noucats
#            else:
#                print u"No es llegeix", scat
#        else:
#            print scat,u"ja la tinc vista"
    categories=catlib.unique(categories)
#    print u"Llegides",len(categories),u"categories a",cat
    return categories,diccat

# Retorna les categories i articles d'una categoria, subcategories incloses.
# No torna a mirar les categories que ja ha mirat.
# Filtra pels noms de les categories fent servir una expressió regular.
# Fa servir un diccionari (diccat) per guardar les subcategories de cada categoria (pel següent cop que s'executi).
# Si actualitza=True no consulta el diccionari però l'escriu igualment (serveix
# per actualitzar al diccionari les categories que fa servir)
def miracatfiltre(cat,catprevies=[],filtre=u"",diccat={},actualitza=False):
    articles=cat.articlesList(recurse=False)
    diccatk=diccat.keys()
    if (cat in diccatk) and (not actualitza):
        categories=diccat[cat]
        try:
            print cat,u"té",categories,u"segons el diccionari"
        except UnicodeEncodeError:
            print "No imprimible"
    else:
        categories=cat.subcategoriesList(recurse=False)
        diccat[cat]=categories
    for scat in categories:
        print scat
#        print u"Títol",scat.title()
        if scat not in catprevies:
            catprevies.append(scat)
            if filtre==u"":
                nopassa=False
                print u"Filtre desactivat"
            else:
                nopassa=re.search(filtre,scat.title())                
            if not nopassa:
                print u"Sí que es llegeix", scat
                noucats,nouarts,diccat=miracatfiltre(scat,catprevies+categories,filtre,diccat,actualitza)
                categories=categories+noucats
                articles=articles+nouarts
            else:
                print u"No es llegeix", scat
        else:
            print u"Aquesta ja la tinc vista"
    categories=catlib.unique(categories)
    articles=catlib.unique(articles)
    print u"Llegits",len(categories),u"categories i",len(articles),u"articles a",cat 
    return categories, articles, diccat

# Converteix un set de categories en una cadena de text
def formatset(conjunt):
    text=u""
    for categoria in conjunt:
        if len(text)>0:
            text=text+u", "
        text=text+u"[[:"+categoria.title()+u"]]"
    return text

def main():
    origen=u"Berguedà"   # Posar aquí una categoria per buscar-hi articles amb categories redundants
    catorigen=catlib.Category(site,origen)
    print u"Carregant diccionari"
    fitx=open("categories.txt",'r')
    bibliocats=pickle.load(fitx)   # Diccionari amb la llista de totes les subcategories d'una categoria (només un nivell)
    fitx.close()
    print u"Diccionari carregat"
    filtrecats=u"Categoria:(.*((Cànids|Amer|Sant Hilari Sacalm|Arbúcies|Anoia|necessiten una foto|sense registre fòssil)|(Selva|Gironès|Girona|Ripollès|Empordà|Vallespir|Baix Cinca|[Aa]noiencs|[Pp]almesans|Mallorca|[Bb]alears|[Mm]allorquins|[Vv]al[eè]nci(à|a|ans)|Alacant|Metges).*))"
    catnul,articles,bibliocats=miracatfiltre(catorigen,filtre=filtrecats,diccat=bibliocats,actualitza=False) # Normalment, actualitza=False (valor per defecte)
#    articles.reverse()  # Posar només si es vol començar pel final.
    informe=u""
    comptador=0
    comptabloc=0
    numarticles=len(articles)
    paginforme=wikipedia.Page(site,u"Usuari:PereBot/categories redundants")
    textvell=paginforme.get()
    wikipedia.getall(site,articles)
    for pag in articles:
        comptador=comptador+1
        comptabloc=comptabloc+1
        print u"\n",comptador,"/",numarticles,u"Comprovant article",pag
        if pag.isRedirectPage():
            pag=pag.getRedirectTarget()
            print "Redirecciona a",pag
            if pag.isRedirectPage():
                print "Doble redirecció"
                break
        catspag=pag.categories()
#        print catspag
        if len(catspag)>1:
            scatspag=set(catspag)
            for catp in catspag:
                print u"Provant la categoria",catp,u"a l'article",pag
                tcatp=catp.title()
                lcat,bibliocats=miracatfiltrecat(catp,diccat=bibliocats)
                slcat=set(lcat)
                intersec=scatspag&slcat
                if len(intersec)>0:
                    print u"Categoria redundant",catp,u"amb",intersec,u"a l'article",pag
                    informe=informe+u"* A [["+pag.title()+u"]] és redundant la [[:"+tcatp+u"]] amb "+formatset(intersec)+u"\n"
                else:
                    print u"Comprovada",catp,u"a l'article",pag
        else:
            print u"Categoria única"
        if comptabloc>250:          
                fitx=open("categories.txt",'w')
                pickle.dump(bibliocats,fitx)
                fitx.close()
                try:
                    textnou=textvell+u"\n\n==[[:Categoria:"+origen+u"]]==\n"+informe+u"Tasca en curs.\n"
                    paginforme.put(textnou,u"Categories redundants a [[:Categoria:"+origen+u"]]")
                except EditConflict:
                    textvell=paginforme.get(force=True)
                    textnou=textvell+u"\n\n==[[:Categoria:"+origen+u"]]==\n"+informe+u"Tasca en curs.\n"
                    paginforme.put(textnou,u"Categories redundants a [[:Categoria:"+origen+u"]]")                   
                comptabloc=0
    fitx=open("categories.txt",'w')
    pickle.dump(bibliocats,fitx)
    fitx.close()
    try:
        textnou=textvell+u"\n\n==[[:Categoria:"+origen+u"]]==\n"+informe+u"Tasca acabada. --~~~~\n"
        paginforme.put(textnou,u"Categories redundants a [[:Categoria:"+origen+u"]]")
    except EditConflict:
        textvell=paginforme.get(force=True)
        textnou=textvell+u"\n\n==[[:Categoria:"+origen+u"]]==\n"+informe+u"Tasca acabada. --~~~~\n"
        paginforme.put(textnou,u"Categories redundants a [[:Categoria:"+origen+u"]]")
    return

#El programa comença aquí
try:
    site=wikipedia.getSite('ca')
    main()
finally:
    wikipedia.stopme()