Χρήστης:Flubot/interwikibot

Από Βικιλεξικό
Μετάβαση στην πλοήγηση Πήδηση στην αναζήτηση

Για το πώς μπορούμε να εντοπίσουμε πιθανά λήμματα που χρειάζονται αλλαγές στα interwikis βλέπε: Χρήστης:Flubot/interwikibot/dump.

Οδηγίες χρήσεως κλπ[επεξεργασία]

Το πρόγραμμα αυτό ελέγχει έναν κατάλογο λημμάτων του ελληνικού Βικιλεξικού για διαγλωσσικούς συνδέσμους (interwikis) που πιθανόν λείπουν και τους συμπληρώνει, αν χρειάζεται.

Απαιτήσεις: Python, Perl, pywikipedia. Έχει ελεγχθεί η λειτουργία του μόνο σε περιβάλλον Linux.

Αρχεία

  1. all.dblist
  2. getall.pl
  3. all-lemmas-all-projects.txt
  4. 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()