Gyakoribb helyesírási javításaim BinBot segítségévelSzerkesztés


Délkelet és más összetett égtájak kötőjelmentesítése és kisbetűsítéseSzerkesztés

In English Magyarul
A frequent error in Hungarian Wikipedia is when users write "dél-kelet(i)" instead of "délkelet(i)" which means southeast(ern) etc.; even worse is the same capitalized. We correct the spelling in two steps. The first line searches for occurrences with a lower case prefix either with lower case or capitalized second word. They will be unhyphenated/unspaced/"un m-dashed" :-) and uncapitalized. See this section for a short manual on using lambdas. This way we can handle kelet (east) and nyugat (west) in the same expression.

In the second step we search for capitalized prefixes. The bot will ask whether they should be put in lower case or not. I could not show the environment of the matched text on screen with lambdas, that's why I used an outer function. This is very similar to the example shown and explained here.

BaseExceptions is shown here.

Gyakori hiba az égtájak kötőjeles írása, pl. „dél-kelet(i)”, aminél már csak a „Dél-Kelet(i)” a rosszabb. Ez a fix két lépésben oldja meg a problémát: először azokat az előfordulásokat keresi, ahol az előtag kisbetűvel van írva, mert ezeknél feltétel nélküli összevonás és kisbetűsítés történik. A lambdafüggvény használatáról itt olvashatsz. A függvény előnye, hogy így nem kell szétszedni külön kelet és nyugat szerint a találatokat, de nem is igényel ennél bonyolultabb kezelést, ezért célszerű helyben rendezni a lambdafüggvénnyel, ami a kisbetűsítést elvégzi.

A második menetben a nagy kezdőbetűs alakokat keressük, ahol a bot felteszi a kérdést, hogy átalakítsuk-e kisbetűsre, ami a szövegkörnyezetből fog látszani. A szövegkörnyezetet nem sikerült lambdafüggvénnyel megmutatni a képernyőn, ezért kell a külső segédfüggvény. Az eljárás magyarázatát itt részleteztem, az ottani példa minimálisan átírt változata.

A BaseExceptions itt van kifejtve.

A használt segédfüggvény / The function:

import wikipedia as pywikibot
def keletnyugat(match): # A kelet fixhez
    text = match.string
    start = match.start()
    end = match.end()
    if text[start-2:start] == '. ':
        #Mondat elején ne kérdezzen / Don't ask at the beginning of a sentence
        return match.group(1) + match.group(2).lower()
    minus = min(start,50) #Don't go under zero
    pywikibot.output(u'%s\03{lightred}%s\03{default}%s' % 
        (text[start-minus:start], text[start:end], text[end:end+50]))
    choice = pywikibot.inputChoice(
            match.group() + u' legyen kisbetűs?', #should be lower case?
            ['Yes', 'No'], ['y', 'N'], 'N')
    if choice == 'y':
        return match.group(1).lower() + match.group(2).lower()
    else:
        return match.group(1) + match.group(2).lower()

A javítócsomag / The fix itself:

    'kelet': {
        # A cikkek kigyűjtése nem ezzel a fixszel történik, hanem az alatta
        # levő kelet2-vel, hogy gyorsabb legyen!
        # Use the other fix called "kelet2" below to collect articles with
        # an acceptable speed!
        'regex': True,
        'msg': {
               'hu':u'[[User:BinBot/munka/kelet|Összetett égtájak kötőjelmentesítése és kisbetűsítése]] kézi ellenőrzéssel',
        },
        'replacements': [
            (ur'(dél|észak) *[-–—] *([kK]elet|[nN]yugat)',
                lambda m:m.group(1) + m.group(2).lower()),
            (ur'(Dél|Észak) *[-–—] *([kK]elet|[nN]yugat)', keletnyugat),
        ],
        'exceptions': {
            'inside': [
            ],
            'title': [
                u'Római Köztársaság', #  délnyugat–észak és részben kelet felől tengerekkel határolt
            ],
            'include': BaseExceptions,
        },
    },
    'kelet2': {
        # A fenti kelet gyűjtőfixe
        # This is for collecting articles from dump for the fix "kelet"
        'regex': True,
        'replacements': [
            (ur'([dD]él|[éÉ]szak) *[-–—] *([kK]elet|[nN]yugat)', ur'\1\2'),
        ],
        'exceptions': {
            'include': BaseExceptions,
        },
    },