Χρήστης: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()