Benutzer:Klausi/Umlaut-Bot

Aus VoWi
Zur Navigation springen Zur Suche springen

Ich spiele gerade ein bisschen mit dem pywikipedia Framework und möchte einen Bot schreiben, der die vielen ausgeschriebenen Umlaute im Vowi durch "echte" Umlaute ersetzt. Beispiel: Aus "Uebung" soll "Übung" werden.

Funktionsweise[Bearbeiten]

Der Bot arbeitet auf folgende Weise:

  • Lade den gewünschten Artikel aus dem Vowi
  • Suche im Artikel mit einem regulären Ausdruck nach Wörtern, die "ae", "oe", "ue" usw. beinhalten
  • Überprüfe, ob das ermittelte einzelne Wort in einem Wörterbuch vorkommt (Übergabe an GNU aspell), falls ja darf das Wort nicht geändert werden ==> Abbruch
  • Ersetze Testweise "ae", "oe", "ue" usw. durch die korrespondierenden Umlaute ("ä", "ö", "ü" usw.)
  • Überprüfe das veränderte Wort mit aspell, falls das Wort im Wörterbuch vorkommt ==> Wortänderung übernehmen
  • Schreib den veränderten Artikel zurück ins Vowi

Benutzung[Bearbeiten]

  • Installation von python
  • Download und Entpacken von pywikipedia
  • Erstellen von user-config.py im pywikipedia Verzeichnis mit folgendem Inhalt:
family = 'vowi'
mylang = 'de'
usernames['vowi']['de'] = 'BOT_BENUTZER_NAME'
minthrottle = 3
maxthrottle = 60
put_throttle = 30
  • Erstellen von families/vowi_family.py mit folgendem Inhalt
 # -*- coding: utf-8  -*-
 
 import family
 
 #  Vowi                                             # Beschreibung deiner Seite (optimal)
 
 class Family(family.Family):
 
    def __init__(self):
        family.Family.__init__(self)
        self.name = 'vowi'                               # Ersetzen
        self.langs = {
            'de': 'vowi.fsinf.at',                         # Hostname deines Projektes
        }
        self.namespaces[1] =  { '_default': u'Diskussion' }
        self.namespaces[2] =  { '_default': u'Benutzer' }
        self.namespaces[3] =  { '_default': u'Benutzer Diskussion' }
        self.namespaces[4] =  { '_default': u'VoWi' }              # Ersetzen
        self.namespaces[5] =  { '_default': u'VoWi Diskussion' }   # Ersetzen
        self.namespaces[6] =  { '_default': u'Bild' }
        self.namespaces[7] =  { '_default': u'Bild Diskussion' }
 
    def path(self, code):
        return '/index.php'                                     # Pfad zur index.php anpassen
  • Erstellen von umlaut-bot.py mit folgendem Inhalt:
 # -*- coding: utf-8 -*-
 
 ## Copyright (C) 2007 klausi <klausi[ät]fsinf.at>
 ##
 ## umlaut-bot is free software; you can redistribute it and/or modify
 ## it under the terms of the GNU General Public License as published
 ## by the Free Software Foundation; version 3 or any later version.
 
 import re
 import popen2
 import wikipedia # Import the wikipedia module
  
 class aspell:
     def __init__(self):
         self._f = popen2.Popen3("aspell -a -l de")
         self._f.fromchild.readline() #skip the credit line
     def __call__(self, word):
 	word = word.encode("UTF-8")
         self._f.tochild.write(word+'\n')
         self._f.tochild.flush()
         s = self._f.fromchild.readline()
         self._f.fromchild.readline() #skip the blank line
         if s=="*\n":
             return True
         else:
             return False
 
 def main():
 	site = wikipedia.getSite() # Taking the default site
 	startpage = '!'
 	for page in site.allpages(startpage):
 		title = page.title()
 		print title
 		newtitle = replace(title)
 		if (title != newtitle):
 			page.move(newtitle)
 		if (page.isRedirectPage()):
 			continue
 		text = page.get()
 		newtext = replace(text)
 		if (text != newtext):
 			page.put(newtext, comment=u'Bot: Umlaute einführen', minorEdit = True)
 
 def replace(text):
 	p = re.compile("((ht|f)tp://(\S)+)|((\w)*(ae|oe|ue|Ae|Oe|Ue|sz|ss)(\w)*)")
 	iterator = p.finditer(text)
 	for match in iterator:	
 		org = match.group()
 		if (org.startswith("http://") or org.startswith("ftp://")):
 			continue
 		#print org
 		rep = test(org)
 		text = text.replace(org,rep,1)
 	return text
 
 
 def test(org):
 	if (len(org)<=2):
 		return org
 	if (f(org)):
 		return org
 	rep = org
 	for raw in "ae","oe","ue","Ae","Oe","Ue","sz","ss":
 		rep = rep.replace(raw,uml[raw])
 		if (f(rep)):
 			return rep
 	return org
 
 uml = {
 	"ae":u"ä",
 	"oe":u"ö",
 	"ue":u"ü",
 	"Ae":u"Ä",
 	"Oe":u"Ö",
 	"Ue":u"Ü",
 	"sz":u"ß",
 	"ss":u"ß"
 	}
 
 f = aspell()
 if __name__ == '__main__':
     try:
         main()
     finally:
         wikipedia.stopme()
  • Aufruf im pywikipedia Verzeichnis: Zuerst muss sich der Bot einloggen (Benutzeraccount für Bot im Vowi erstellen, falls noch nicht vorhanden):
python login.py
  • Aufruf des Umlaut-Bots
python umlaut-bot.py

Test und Bugs[Bearbeiten]

  • Das aspell Wörterbuch deckt leider nicht alle plausiblen Wörter (wie z.B.Aufnahmebeschränkung) ab, man könnte eine Seite im Vowi erstellen, die eine Liste zusätzlicher Wörter enthält, und vom Bot mitberücksichtigt wird? Immerhin verhält sich der Bot defensiv, zurzeit gibt es keine false positives (keine falschen Änderungen).
  • ein erster Test über den Default-Namensraum war recht erfolgreich; wiederum keine falschen Änderungen, allerdings blieben auch ein paar Wörter stehen, die eigentlich geändert werden hätten müssen.
  • Es dürfte noch einen Bug im regulären Ausdruck geben, der die Umlaut-Wörter findet.