Έλεγχος κλείδας ταξινόμησης πολωνικών λημμάτων.

  • Όλος σχεδόν ο κώδικας είναι αντιγραφή από το taxi-pl.py.
  • Το όνομα του αρχείου xml βρίσκεται μέσα στον κώδικα.
  • Χρειάζεται το αρχείο Χρήστης:Xoristzatziki/dumptools.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
#python2.7
#v.0.2

import os, sys, re, codecs
import argparse
import subprocess

#χρειάζεται __init.py__ στον ίδιο φάκελο
import _lib.dumptools as mydumptools

#για να γράφει utf-8 στο pipe
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

#αρχείο με το dump.
#μπορεί να είναι π.χ. το /home/user/Downloads/dumps/latest.xml
#monimoxmlfilename = u'/media/FORMANY/wiki/dumps/elwiktionary-20130318-pages-meta-current.xml'
monimoxmlfilename = os.path.join(os.getcwd(), 'testerror')#in order to indicate that user does not corrected this line
#και στον ίδιο φάκελο με το xml:
#ή έχουμε δημιουργήσει το ομώνυμο titles
#ή δημιουργείται αυτόματα

#===================================
#Τα μόνα στοιχεία που χρειάζονται αλλαγή για κάθε γλώσσα.
#Στοιχεία που ίσως μπορούν να μπουν σε dictionary και να καλούνται με μεταβλητή,
#ακόμα κι αν χρησιμοποιείται άλλο αρχείο για κάθε γλώσσα.

#1. στοιχεία γλώσσας αναφοράς
langiso = u'pl'
langisou = u'PL'
langfull = u'πολωνικά'

#2. πίνακες αντιστοίχισης της γλώσσας
kl_apo = u'ą ć ę ł ń ó ś ź ż'
kl_se =  u'aα cα eα lα nα oα sα zα zε'
klapo = kl_apo.split(u' ')
klse = kl_se.split(u' ')

#3. συνάρτηση δημιουργίας κλείδας της γλώσσας
def findkleida(title):
    #εδώ φτιάχνουμε την κλείδα για τη γλώσσα
    #μπορεί και αυτό να μπει σε ξεχωριστή συνάρτηση ανάλογα τη γλώσσα
    #1. βγάζουμε το πρώτο αν είναι παύλα   
    t = title[1:] if title[:1] == '-' else title
    _start = t[:1]#Tο πρώτο γράμμα της λέξης μένει εκτός κλείδας
    _rest = t[1:]
    kleida = sortkey(_rest)
    kleida = spaces_tag.sub('',kleida)
    kleida = apost_tag.sub('',kleida)
    kleida = _start + kleida
    kleida = kleida.lower()
    kleida = spaces_tag.sub('',kleida)
    kleida = apost_tag.sub('',kleida)
    #βάλε στο τέλος την παύλα αν υπάρχει
    #δεν χρειάζεται κλείδα 
    #ή η κλείδα ας έχει και την παύλα
    kleida = kleida + '-' if title[-1:] == '-' else kleida
    #βρήκαμε την κλείδα
    if kleida == title.lower():#αν ο τίτλος (πεζά) είναι ίδιος με την κλείδα
        nokleida = True #δεν χρειάζεται να μπει πουθενά			
    else:
        nokleida = False
    return nokleida, kleida

#===================================

#Κοινά για όλες τις γλώσσες
#όσα πρότυπα έχουν: '{{όρος|' ή '{{προσδ'
alltemplatesthatneedascii = '|'.join([u'δοκιμή',
        u'σύνδεσμος',
        u'ιστορ',
        u'φιλοσ',
        u'τεχνο',
        u'φιλολ',
        u'ναυτ',
        u'αρχαιολ',
        u'αρχιτ',
        u'γεωμ',
        u'γεωλ',
        u'γεωγρ',
        u'ψυχολ',
        u'φυσ',
        u'νομ',
        u'μυθολ',
        u'ιατρ',
        u'αστρον',
        u'αστρολ',
        u'μαθ',
        u'γλωσσ',
        u'βιολ',
        u'πληροφ',
        u'μουσ',
        u'ανατ',
        u'χημ',
        u'αθλητ',
        u'ορυκτ',
        u'ζωολ',
        u'γραμμ',
        u'στρατ',
        u'βοτ',
        u'θρησκ',
        u'γεωπ',
        u'φυσιολ',
        u'οικον',
        u'μηχ',
        u'βιοχ',
        u'γυναικ',
        u'πολιτ',
        u'ηλεκτρολ',
        u'φαρμ',
        u'μετεωρ',
        u'τέχνες',
        u'ιχθυολ',
        u'ορνιθολ',
        u'εντομολ',
        u'ουσιαστικό',
        u'επίθετο',
        u'ρήμα',
        u'επίρρημα',
        u'κύριο όνομα',
        u'μόριο',
        u'μετοχή',
        u'επιφώνημα',
        u'επίθημα',
        u'πρόθημα',
        u'πολυλεκτικός όρος',
        u'επιθετική έκφραση',
        u'έκφραση',
        u'άρθρο',
        u'αριθμητικό',
        u'συντομομορφή',
        u'πρόθεση',
        u'χαρακτήρας',
        u'σύμβολο',
        u'αντωνυμία',
        u'μορφή επιθέτου',
        u'μορφή ουσιαστικού',
        u'μορφή ρήματος',
        u'επιρρηματική έκφραση',
        u'μορφή κυρίου ονόματος',
        u'μορφή μετοχής',
        u'μορφή αντωνυμίας',
        u'κατάληξη',
        u'κατάληξη αρσενικών επιθέτων',
        u'κατάληξη αρσενικών ουσιαστικών',
        u'κατάληξη αρσενικών και θηλυκών ουσιαστικών',
        u'κατάληξη επιρρημάτων',
        u'κατάληξη θηλυκών ουσιαστικών',
        u'κατάληξη ουδέτερων ουσιαστικών',
        u'κατάληξη ρημάτων',
        u'ρίζα',
        u'φράση',
        u'προθετική έκφραση',
        u'ψυχιατρ',
        u'εραλδ',
        u'ρηματική έκφραση',
        u'παθολ',
        u'πρμθ',
        u'ηλεκτρονικά',
        u'συγχώνευση',
        u'μορφή επιρρήματος',
        u'αστερ',
        u'παροιμία',
        u'μορφή πολυλεκτικού όρου',
        u'εθν',
        u'γαστρον',
        u'ζωγραφική',
        u'ερπετολ',
        u'συνδεσμική έκφραση',
        u'πρόσφυμα',
        u'κοινωνιολογία',
        u'μορφή αριθμητικού',
        u'γερουνδιακό',
        u'μορφή γερουνδιακού',
        u'γερούνδιο',
        u'σουπίνο',
])

#γενικά regex's
lang_template = re.compile('\{\{-([^\}]+)\}\}')

spaces_tag = re.compile('([ \*\.\'\-\(\)]*)')
apost_tag = re.compile(u'’')

#regex's για πρότυπα που μπορεί να θέλουν κλείδα
pos_tag = re.compile(u'\{\{(' + alltemplatesthatneedascii + ')\|' + langiso + u'\}\}')
pos1_tag = re.compile(u'\{\{(' + alltemplatesthatneedascii + u')\|' + langiso + u'\|(?P<kleidi1>[^\=\|\}]*)\}\}')
pos2_tag = re.compile(u'\{\{(' + alltemplatesthatneedascii + u')\|' + langiso + u'\|αριθ\=([1-9]*)\}\}')
pos3_tag = re.compile(u'\{\{(?P<pos>' + alltemplatesthatneedascii + u')\|' + langiso + u'\|αριθ\=([1-9]*)\|(?P<kleidi3>[^\}\|]*)\}\}')
pos4_tag = re.compile(u'\{\{(' + alltemplatesthatneedascii + u')\|' + langiso + u'\|(?P<kleidi4>[^\|]*)|αριθ\=[1-9]*\}\}')
etym_tag = re.compile(u'\{\{ετυμ ([a-z]*)\|' + langisou + u'\}\}')
etym1_tag = re.compile(u'\{\{ετυμ ([a-z]*)\|' + langisou + u'\|(?P<kleidi5>[^\}]*)\}\}')
categ_tag = re.compile(u'\[\[Κατηγορία:(.*)' + langfull + u'(\)*)\]\]')
categ1_tag = re.compile(u'\[\[Κατηγορία:(.*)' + langfull + u'(\)*)\|(?P<kleidi6>[^\]]*)\]\]')

#Αρχικοποιήσεις
language_header=0
nokleida=0
kleida=""

#συνάρτηση αντιστοίχισης
def sortkey(sort):
  for i in range(len(klapo)):
        sort = sort.replace(klapo[i], klse[i])
  return sort

def mainiterator(iteratorsxmlfile):
    #Δημιουργία από την κλάση WikiDump
    dump = mydumptools.WikiDump(iteratorsxmlfile)
    if not dump._ISOK:#αν δεν βρει αρχείο τίτλων ή προκύψει άλλο πρόβλημα
        print 'Πρόβλημα στο dump'
        return
    #lemmascounter = 0L#αν χρειαστεί να κάνουμε καταγραφή
    for entry in dump.parse(): 
        #lemmascounter += 1
        if (entry.ns != '0'):#αν δεν είναι στο main
            continue
        keysearch(entry)

def keysearch(entry):
    #foundsomething = extractsomething(entry.title, entry.text)
    title = entry.title .decode('utf-8')#ο τίτλος του λήμματος
    lematext = entry.text .decode('utf-8')#το κείμενο του λήμματος
    if lang_template.search(lematext):#αν έχει κάποιο =={{-χχ-}}== (υποθέτω οτι αυτό σημαίνει...:-)
        result = lang_template.search(lematext)
        if result.group(1) == langiso + '-':#αν είναι η γλώσσα που θέλουμε
            language_header = 1
            nokleida, kleida = findkleida(title)
	        #ψάχνουμε τώρα μία μία τις γραμμές για να δούμε:
	        #1. αν υπάρχει ενώ δεν χρειάζεται
	        #2. αν δεν υπάρχει ενώ χρειάζεται
            b = lematext.splitlines()
            xcounter = 0 #καταγράφει τη γραμμή που βρίσκεται το σφάλμα
            #καταγραφή των σφαλμάτων σε συγκεκριμένα Πρότυπα
            for line in b:
                xcounter += 1
                if language_header and not nokleida and  pos_tag.search(line):
                    print u"%s:1 χρειάζεται κλείδα στη γραμμή %s, %s" % (title, xcounter, kleida)
                elif language_header and not nokleida and  pos2_tag.search(line):
                    print u"%s:2 χρειάζεται κλείδα στη γραμμή %s, %s" % (title, xcounter, kleida)
                elif language_header and not nokleida and  etym_tag.search(line):
                    print u"%s:3 χρειάζεται κλείδα στη γραμμή %s, στην ετυμολογία, %s" % (title, xcounter, kleida)
                elif language_header and not nokleida and  categ_tag.search(line):
                    print u"%s:4 θέλει κλείδα στη γραμμή %s, στην κατηγορία, %s" % (title, xcounter, kleida)
                elif language_header and nokleida and pos2_tag.search(line):
                    pass
                elif language_header and nokleida and pos1_tag.search(line):
                    print u"%s:5 δεν θέλει κλείδα στη γραμμή %s, %s" % (title, xcounter, kleida)
                elif language_header and nokleida and pos3_tag.search(line):
                    print u"%s:6 δεν θέλει κλείδα στη γραμμή %s, %s" % (title, xcounter, kleida)
                elif language_header and nokleida and pos4_tag.search(line):
                    print u"%s:7 δεν θέλει κλείδα στη γραμμή %s, %s" % (title, xcounter, kleida)
                elif language_header and nokleida and etym1_tag.search(line):
                    print u"%s:8 δεν θέλει κλείδα στην ετυμολογία, %s" % (title, kleida)
                elif language_header and nokleida and categ1_tag.search(line):
                    print u"%s:9 δεν θέλει κλείδα στην κατηγορία, %s" % (title, kleida)
                elif language_header and not nokleida and pos1_tag.search(line):
                    result=pos1_tag.search(line)
                    kleida1=result.group('kleidi1')
                    if kleida != kleida1:
	                    print u"%s:10 λανθασμένη κλείδα %s στη γραμμή %s, σωστή κλείδα %s" % (title, kleida1, xcounter, kleida)
                elif language_header and not nokleida and pos3_tag.search(line):
                    result=pos3_tag.search(line)
                    kleida1=result.group('kleidi3')
                    if kleida != kleida1:
	                    print u"%s:11 λανθασμένη κλείδα %s στη γραμμή %s, σωστή κλείδα %s" % (title, kleida1, xcounter, kleida)
                elif language_header and not nokleida and pos4_tag.search(line):
                    result=pos4_tag.search(line)
                    kleida1=result.group('kleidi4')
                    if kleida != kleida1:
	                    print u"%s:12 λανθασμένη κλείδα %s στη γραμμή %s, σωστή κλείδα %s" % (title, kleida1, xcounter, kleida)
                elif language_header and not nokleida and categ1_tag.search(line):
                    result=categ1_tag.search(line)
                    kleida1=result.group('kleidi6')
                    if kleida != kleida1:
	                    print u"%s:13 λανθασμένη κλείδα στην κατηγορία %s, σωστή κλείδα %s" % (title,kleida1,kleida)
                elif language_header and not nokleida and etym1_tag.search(line):
                    result=etym1_tag.search(line)
                    kleida1=result.group('kleidi5')
                    if kleida != kleida1:
	                    print u"%s:14 λανθασμένη κλείδα στην ετυμολογία %s, σωστή κλείδα %s" % (title,kleida1,kleida)

if __name__ == "__main__":
    _parser = argparse.ArgumentParser()
    _parser.add_argument("-x", "--xmlfile", default=None)
    _parser.add_argument("-l", "--lang", default=None)
    #parse args:
    _args = _parser.parse_args()
#    _lang = ''
    #if lang not specified
#    if _args.lang == None:
#        print 'no lang specified'
#        print 'using lang from filename'
#        try:
#            lang = langiso            
#        else:
#            exit(2)
    #if xmlfile not specified
    if _args.xmlfile == None:
        #use the one at the top of this script
        print 'using xml file initiated at the start of this script'
        xmlfiletouse = monimoxmlfilename
    else:
        #use file specified by user 
        #xmlfiletouse = os.path.join(os.getcwd(), _args.xmlfile)
        #print 'use file specified by user '
        xmlfiletouse =  os.path.abspath(_args.xmlfile)
        #print xmlfiletouse
    #if file does not exists or cannot create a titles file
    if not mydumptools.create_newer_titles_file(xmlfiletouse):
        #exit        
        exit(3)      
    mainiterator(xmlfiletouse)