[PYTHON] 100 Sprachverarbeitungsklopfen (2020): 28

"""
28.Entfernen des MediaWiki-Markups
Entfernen Sie zusätzlich zu den 27 Prozessen MediaWiki-Markups so weit wie möglich aus den Vorlagenwerten und formatieren Sie die grundlegenden Länderinformationen.
"""

import json
import re

import utils


def get_uk_text(path):
    with open(path) as f:
        for line in f:
            line_data = json.loads(line)
            if line_data["title"] == "England":
                data = line_data
                break
    return data["text"]


def get_basic_info(string: str) -> str:
    """Get basic information section
    """
    pattern = re.compile(
        r"""
            ^\{\{Grundinformation.*?$   # '{{Grundinformation'Zeilen beginnend mit
            (.*?)       #Ziel erfassen, 0 oder mehr Zeichen, nicht gierig
            ^\}\}$      # '}}'Zeilen, die mit enden
        """,
        re.MULTILINE | re.DOTALL | re.VERBOSE,
    )

    return re.findall(pattern, string)[0]


def get_content(string: str) -> list:
    r"""
    https://docs.python.org/3/library/re.html#regular-expression-syntax

    RE:
        - re.X (re.VERBOSE)     Allow us add command to explain the regular expression
        - re.M (re.MULTILINE)   Apply match to each line. If not specified, only match the first line.
        - re.S (re.DOTALL)      Allow to recognize '\n'
        - []        Used to indicate a set of characters. [(+*)] will match any of the literal characters '(', '+', '*', or ')'.
        - ^\|       String begin with |
        - ?         Causes the resulting RE to match 0 or 1 repetitions

        - *?        The '*' qualifier is greedy.
                    Adding ? after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched.
                    e.g. <.*> is matched against '<a> b <c>'
                    e.g. <.*?> will match only '<a>'

        - (...)     Matches whatever regular expression is inside the parentheses,
        - (?=...)   Matches if ... matches next, but doesn’t consume any of the string. This is called a lookahead assertion.
                    For example, Isaac (?=Asimov) will match 'Isaac ' only if it’s followed by 'Asimov'.
        - (?:...)   A non-capturing version of regular parentheses.

    Input:
        - '|Nationaler Emblem-Link=([[Britisches nationales Emblem|Staatswappen]])'
    Return:
        - {'Nationaler Emblem-Link': '([[Britisches nationales Emblem|Staatswappen]])'}
    """
    pattern = re.compile(
        r"""
            ^\|         # '|'Zeilen beginnend mit
            (.+?)       #Erfassen Sie das Ziel (Feldname), ein oder mehrere Zeichen, nicht gierig
            \s*         #0 oder mehr Leerzeichen
            =
            \s*         #0 oder mehr Leerzeichen
            (.+?)       #Erfassen Sie ein Ziel (Wert), ein oder mehrere Zeichen, die nicht gierig sind
            (?:         #Starten Sie eine Gruppe, die nicht erfasst wird
                (?=\n\|)    #Neue Zeile+'|'Vorher (positive Vorausschau)
                |           #Oder
                (?=\n$)     #Neue Zeile+Vor dem Ende (bejahender Ausblick)
            )           #Gruppenende
            """,
        re.MULTILINE | re.DOTALL | re.VERBOSE,
    )
    result = re.findall(pattern, string)
    return {k: v for k, v in result}  # dict is ordered when using python 3.7


def remove_markup(target: str) -> str:
    # ans26: remvoe highlight markup
    """
    「'''Großbritannien'''」->「Großbritannien」
    """
    pattern = re.compile(
        r"""
            (\'{2,5})   #2-5'(Beginn des Markups)
            (.*?)       #Ein oder mehrere Zeichen (Zielzeichenfolge)
            (\1)        #Entspricht der ersten Aufnahme (Ende des Markups)
        """,
        re.MULTILINE | re.VERBOSE,
    )
    target = pattern.sub(r"\2", target)  #Schalten Sie die zweite Gruppe auf Ganz

    """
    and27: remove internal link and file
        [[London]] -> London
        [[britischer Premierminister|Premierminister]] -> Premierminister
        [[Datei:Royal Coat of Arms of the United Kingdom.svg|85px|Britisches nationales Emblem]] -> Britisches nationales Emblem
    """
    pattern = re.compile(
        r"""
            \[\[        # '[['(Beginn des Markups)
            (?:         #Starten Sie eine Gruppe, die nicht erfasst wird
                [^|]*?  # '|'0 oder mehr Zeichen als nicht gierig
                \|      # '|'
            )*?          #Gruppe ist 0 oder mehr, nicht gierig
            ([^|]*?)    #Ziel erfassen,'|'Andere als 0 Zeichen, nicht gierig (Zeichenfolge, die angezeigt werden soll)
            \]\]        # ']]'(Ende des Markups)
        """,
        re.MULTILINE | re.VERBOSE,
    )
    target = pattern.sub(r"\1", target)  #Schalten Sie die erste Gruppe auf Ganz

    # ans28: remove markups as many as possible
    # Remove {{}}
    """
    {{lang|fr|Dieu et mon droit}} -> Dieu et mon droit
    {{Temporäre Verbindung|Lindsay Foil|en|Lindsay Hoyle}} -> Lindsay Hoyle
    """
    pattern = re.compile(
        r"""
            \{\{    # '{{'(Beginn des Markups)
            .*?     #0 oder mehr Zeichen, nicht gierig
            (?:
                [^|]*?
                \|
            )*?
            ([^|]*?)
            \}\}        # '}}'(Ende des Markups)
        """,
        re.MULTILINE | re.VERBOSE,
    )
    target = pattern.sub(r"\1", target)

    # Remove <ref> pattern 1
    """
    "66.435.600<ref>{{Cite web|url=https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates|title=Population estimates - Office for National Statistics|accessdate=2019-06-26|date=2019-06-26}}</ref>",
    ->
    "66.435.600",
    """
    pattern = re.compile(r"<ref.*?</ref>")
    target = pattern.sub(r"", target)

    # Remove <ref> pattern 2
    """
    ('2.316,2 Milliarden<ref name="imf-statistics-gdp" />', "2.316,2 Milliarden"),
    """
    pattern = re.compile(
        r"""
            <           # '<'(Beginn des Markups)
            \/?         # '/'Erscheint 0 oder 1 (im Fall des End-Tags/Es gibt)
            ref         # 'ref'
            [^>]*?      # '>'Andere als 0 Zeichen, nicht gierig
            >           # '>'(Ende des Markups)
        """,
        re.MULTILINE + re.VERBOSE,
    )
    target = pattern.sub(r"", target)  # no space

    # Replace <br> with ' ',Die Nationalhymne ist leichter zu lesen
    """
    "God Save the Queen}}{{en icon}}<br />Gott, beschütze die Königin<br />{{center|Datei:United States Navy Band - God Save the Queen.ogg}}"
    ->
    "God Save the Queen}}en icon Schütze die Königin, Gottesakte:United States Navy Band - God Save the Queen.ogg",
    """
    pattern = re.compile(
        r"""
            <           # '<'(Beginn des Markups)
            \/?         # '/'Erscheint 0 oder 1 (im Fall des End-Tags/Es gibt)
            br         # 'br'
            [^>]*?      # '>'Andere als 0 Zeichen, nicht gierig
            >           # '>'(Ende des Markups)
        """,
        re.MULTILINE + re.VERBOSE,
    )
    target = pattern.sub(r" ", target)  # with space

    # # Premove <br>, <ref> pattern 2
    # """
    # ("Etabliert<br />(Gemeinsames Gesetz von 1707)", "Etabliert(Gemeinsames Gesetz von 1707)"),
    # ('2.316,2 Milliarden<ref name="imf-statistics-gdp" />', "2.316,2 Milliarden"),
    # """
    # pattern = re.compile(
    #     r"""
    #         <           # '<'(Beginn des Markups)
    #         \/?         # '/'Erscheint 0 oder 1 (im Fall des End-Tags/Es gibt)
    #         [br|ref]    # 'br'Oder'ref'
    #         [^>]*?      # '>'Andere als 0 Zeichen, nicht gierig
    #         >           # '>'(Ende des Markups)
    #     """,
    #     re.MULTILINE + re.VERBOSE,
    # )
    # target = pattern.sub(r"", target)

    # Remove external link [http://xxxx] 、[http://xxx xxx]
    """
    [http://www.example.org] -> ''
    [http://www.example.org Anzeigezeichen] -> 'Zeichen anzeigen'
    """
    pattern = re.compile(
        r"""
            \[http.?:\/\/ # '[http://'(Start des Markups) oder https
            (?:         #Starten Sie eine Gruppe, die nicht erfasst wird
                [^\s]*? #0 oder mehr nicht leere Zeichen, nicht gierig
                \s      #Leer
            )?          #Gruppenende, diese Gruppe erscheint 0 oder 1
            ([^]]*?)    #Ziel erfassen,']'Andere als 0 Zeichen, nicht gierig (Zeichenfolge, die angezeigt werden soll)
            \]          # ']'(Ende des Markups)
        """,
        re.MULTILINE + re.VERBOSE,
    )
    target = pattern.sub(r"\1", target)

    return target


# and20
uk_text = get_uk_text("jawiki-country.json")  # See uk_text.txt

# ans25
basic_info = get_basic_info(uk_text)
fields = get_content(basic_info)  # See 25_en_basic_info.json

# ans26, ans27, ans28
result = {k: remove_markup(v) for k, v in fields.items()}  # See 26_no_markup.json
utils.save_json(result, "28_no_markup.json")


# Test for 27
data = [
    ("[[London]]", "London"),
    ("[[britischer Premierminister|Premierminister]]", "Premierminister"),
    ("[[Datei:Royal Coat of Arms of the United Kingdom.svg|85px|Britisches nationales Emblem]]", "Britisches nationales Emblem"),
    (
        "{{lang|fr|[[Dieu et mon droit]]}}<br />([[Französisch]]:[[Dieu et mon droit|Gott und meine Rechte]])",
        "Dieu et mon droit (französisch):Gott und meine Rechte)",
    ),
    ("{{Temporäre Verbindung|Lindsay Foil|en|Lindsay Hoyle}}", "Lindsay Hoyle"),
    ("Etabliert<br />(Gemeinsames Gesetz von 1707)", "Etabliert(Gemeinsames Gesetz von 1707)"),
    ('2.316,2 Milliarden<ref name="imf-statistics-gdp" />', "2.316,2 Milliarden"),
    (
        "66.435.600<ref>{{Cite web|url=https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates|title=Population estimates - Office for National Statistics|accessdate=2019-06-26|date=2019-06-26}}</ref>",
        "66.435.600",
    ),
]


# for target, answer in data:
#     print(answer)
#     print(remove_markup(target))
#     print()

Recommended Posts

100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitung Knock Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
100 Sprachverarbeitung Knock-25: Vorlagenextraktion
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020
100 Sprachverarbeitung Knock-56: Co-Referenz-Analyse
Lösen von 100 Sprachverarbeitungsklopfen 2020 (01. "Patatokukashi")
100 Amateur-Sprachverarbeitungsklopfen: Zusammenfassung
100 Sprachverarbeitungsklopfen (2020): 40
100 Sprachverarbeitungsklopfen (2020): 32
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen (2020): 35
100 Sprachverarbeitungsklopfen (2020): 47
100 Sprachverarbeitungsklopfen (2020): 39
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitungsklopfen (2020): 22
100 Sprachverarbeitungsklopfen (2020): 26
100 Sprachverarbeitungsklopfen (2020): 34
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
100 Sprachverarbeitungsklopfen (2020): 42
100 Sprachverarbeitung Knock-76 (mit Scicit-Learn): Beschriftung
100 Sprachverarbeitung Knock-55: Extraktion eindeutiger Ausdrücke
100 Sprachverarbeitungsklopfen (2020): 29
100 Sprachverarbeitungsklopfen (2020): 49
100 Sprachverarbeitungsklopfen 06 ~ 09
100 Sprachverarbeitungsklopfen (2020): 43
100 Sprachverarbeitungsklopfen (2020): 24
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitung Knock-82 (Kontextwort): Kontextextraktion
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen (2020): 45
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen