Χρήστης:Flubot/interwikibot
Για το πώς μπορούμε να εντοπίσουμε πιθανά λήμματα που χρειάζονται αλλαγές στα interwikis βλέπε: Χρήστης:Flubot/interwikibot/dump.
Οδηγίες χρήσεως κλπ
επεξεργασίαΤο πρόγραμμα αυτό ελέγχει έναν κατάλογο λημμάτων του ελληνικού Βικιλεξικού για διαγλωσσικούς συνδέσμους (interwikis) που πιθανόν λείπουν και τους συμπληρώνει, αν χρειάζεται.
Απαιτήσεις: Python, Perl, pywikipedia. Έχει ελεγχθεί η λειτουργία του μόνο σε περιβάλλον Linux.
Αρχεία
- all.dblist
- getall.pl
- all-lemmas-all-projects.txt
- interwiki-el-wikt.py
Εντολές
- ./getall.pl
- δημιουργεί ένα αρχείο με το όνομα 2011-06-01.txt (ή άλλο, ανάλογα με την ημερομηνία). Αυτό το αρχείο πρέπει να μετονομαστεί σε all-lemmas-all-projects.txt και να αποθηκευτεί μαζί με το interwiki-el-wikt.py στον κατάλογο pywikipedia
- python interwiki-el-wikt.py -file:listOfWords.txt (ή όποιο άλλο αρχείο λέξεων έχουμε φτιάξει)
- Επίσης μπορεί να δεχτεί ως παράμετρο τα:
- -cat:"Ελληνική γλώσσα" (ή όποιαδήποτε άλλη κατηγορία)
- -start:a (για να ξεκινήσει όλα τα λήμματα από το γράμμα a)
- ακτή (για να ελέγξει μόνο αυτή τη λέξη)
- Επίσης μπορεί να δεχτεί ως παράμετρο τα:
- Δεν μπορείτε να δώσετε περισσότερες από μία (1) παραμέτρους.
Γνωστά προβλήματα
- Εάν στο λήμμα που εξετάζουμε υπάρχει ήδη σύνδεσμος προς μη υπαρκτό Βικιλεξικό, αυτό το λήμμα δεν θα εξεταστεί
interwiki-el-wikt.py
επεξεργασία#!/usr/bin/python # -*- coding: utf-8 -*- import wikipedia, wiktionary, pagegenerators, catlib, query import sys import re, time class bigList: def __init__(self): self.setupBigList() def setupBigList(self): # create hash of all lemmas on all projects by language code; by Ariel Glenn self.wordList = {} fileAllProjectLemmas =open('./all-lemmas-all-projects.txt', 'r') line = fileAllProjectLemmas.readline() count = 0 print "starting phase 1: preparing lemma list" while (line): language, lemma = line.split(":",1) if not self.wordList.has_key(language): self.wordList[language] = {} self.wordList[language][lemma] = 1 line = fileAllProjectLemmas.readline() count = count + 1 if not ( count % 1000000 ): print "%s lemmas processed" % count print "done phase 1" fileAllProjectLemmas.close() class job_iws: def __init__(self, site, title, hashOfAll): self.site = site self.title = title self.hashOfAll = hashOfAll def checkIfPageExists(self, wl, get_redirect=True, throttle=True, sysop=False, oldid=None, change_edit_time=True, expandtemplates=False): """έλεγχος για το εάν υπάρχει η σελίδα σε ξένο Βικιλεξικό μέσω API query; γράφτηκε αρχικά από τον Ariel Glenn""" params = { 'action': 'query', 'titles': self.title, } if throttle: wikipedia.get_throttle() # retrying loop is done by query.GetData data = query.GetData(params, wl, sysop=sysop) if 'error' in data: raise RuntimeError("API query error: %s" % data) if not 'pages' in data['query']: raise RuntimeError("API query error, no pages found: %s" % data) pageInfo = data['query']['pages'].values()[0] if data['query']['pages'].keys()[0] == "-1": if 'missing' in pageInfo: return False elif 'invalid' in pageInfo: raise pywikibot.BadTitle('BadTitle: %s' % page) # return False else: return False else: # page exists return True def treat_iws(self, keimeno): calls = 0 marker = '@@' while marker in keimeno: marker += '@' site = self.site try: interwiki = wikipedia.getLanguageLinks(keimeno, insite = site) iwcopy = wikipedia.getLanguageLinks(keimeno, insite = site) # αφαιρούμε τα interwikis textnoiws = wikipedia.removeLanguageLinks(keimeno.replace(marker,'').strip(), site = self.site) + site.family.category_text_separator # βρίσκουμε τα σκάρτα interwikis for key in interwiki.keys(): if interwiki[key].title() != self.title: print "invalid iw", key, interwiki[key] del interwiki[key] # ψαχνουμε το all-lemmas .... μέσω του wordlist myiws = {} # αυτό ήταν το νέο dict που θα περιέχει τα interwikis tosearch = u'%s\n'%self.title tosearch = tosearch.encode('utf-8') for key in self.hashOfAll.wordList.keys(): if (key != "el"): if self.hashOfAll.wordList[key].has_key(tosearch): key = key.replace('_','-') key1 = wikipedia.Site(key) myiws[key1] = wikipedia.Page(key1, self.title) for key in interwiki.keys(): if not myiws.has_key(key): time.sleep(1) print "problem in page %s - missing %s interwiki in new links (1)" % (self.title, key) calls = calls + 1 if self.checkIfPageExists(key): myiws[key] = wikipedia.Page(key, self.title) for key in myiws.keys(): if not interwiki.has_key(key): time.sleep(1) print "problem in page %s - missing %s interwiki in old links (2)" % (self.title, key) calls = calls + 1 if not self.checkIfPageExists(key): del myiws[key] if (iwcopy == myiws): return keimeno, calls newiws = wikipedia.replaceLanguageLinks(textnoiws, myiws, site = self.site) return newiws, calls except wikipedia.NoSuchSite: print u"link to non-existant wiktionary in %s" % (self.title) return keimeno, calls class interwikibot: def __init__(self, generator, wordlist, acceptall = False): self.generator = generator self.acceptall = acceptall self.wordlist = wordlist def run(self): count = 0 for page in self.generator: try: class_job_iws = job_iws(page.site(), page.title(), self.wordlist) arxiko = page.get() teliko, calls = class_job_iws.treat_iws(arxiko) count = count + calls # we upload the text if (teliko == arxiko): wikipedia.output('No changes were necessary in %s' % page.title()) else: wikipedia.setAction(u'ενημέρωση των interwikis') wikipedia.output(u'>>> %s <<<' % page.title()) wikipedia.showDiff(arxiko, teliko) if not self.acceptall: choice = wikipedia.inputChoice(u'Θέλετε να δεχτείτε αυτές τις αλλαγές;', ['Yes', 'No', 'All'], ['y', 'N', 'a'], 'N') if choice in ['a', 'A']: self.acceptall = True if self.acceptall or choice in ['y', 'Y']: print "saving" page.put(teliko) except wikipedia.NoPage: print u"Η σελίδα %s δεν υπάρχει;;!!"%page.aslink() except wikipedia.IsRedirectPage: pass except wikipedia.LockedPage: pass print u"Έγιναν συνολικά %s κλήσεις στην API." % (count) def main(): gen = None pageTitle = [] for arg in wikipedia.handleArgs(): if arg: if arg.startswith('-start:'): gen = pagegenerators.AllpagesPageGenerator(arg[7:]) elif arg.startswith('-ref:'): referredPage = wikipedia.Page(wikipedia.getSite(), arg[5:]) gen = pagegenerators.ReferringPageGenerator(referredPage) elif arg.startswith('-links:'): linkingPage = wikipedia.Page(wikipedia.getSite(), arg[7:]) gen = pagegenerators.LinkedPageGenerator(linkingPage) elif arg.startswith('-file:'): gen = pagegenerators.TextfilePageGenerator(arg[6:]) elif arg.startswith('-cat:'): cat = catlib.Category(wikipedia.getSite(), arg[5:]) gen = pagegenerators.CategorizedPageGenerator(cat) else: pageTitle.append(arg) if pageTitle: page = wikipedia.Page(wikipedia.getSite(), ' '.join(pageTitle)) gen = iter([page]) if not gen: wikipedia.showHelp('touch') else: preloadingGen = pagegenerators.PreloadingGenerator(gen) veryBigList = bigList() bot = interwikibot(preloadingGen, veryBigList) bot.run() if __name__ == "__main__": try: main() finally: wikipedia.stopme()