[PYTHON] 100 Sprachverarbeitung Knock 2020 Kapitel 1: Vorbereitende Bewegung

Neulich wurde 100 Language Processing Knock 2020 veröffentlicht. Ich selbst arbeite erst seit einem Jahr an natürlicher Sprache und kenne die Details nicht, aber ich werde alle Probleme lösen und veröffentlichen, um meine technischen Fähigkeiten zu verbessern.

Dies ist mein erster Artikel über Qiita. Ich verstehe nichts

Alle müssen auf dem Jupiter-Notizbuch ausgeführt werden, und die Einschränkungen der Problemstellung können bequem verletzt werden. Der Quellcode ist auch auf Github. Ja.

Die Umgebung ist Python 3.8.2 und Ubuntu 18.04.

Kapitel 1: Vorbereitende Bewegung

00. Umgekehrte Reihenfolge der Zeichenfolgen

Holen Sie sich eine Zeichenfolge, in der die Zeichen der Zeichenfolge "betont" umgekehrt angeordnet sind (vom Ende bis zum Anfang).

Code


x = 'stressed'
x = x[::-1]
x

Ausgabe


'desserts'

Es ist eine Slice-Operation. Wenn die Schrittweite von "[Startposition: Endposition: Schrittweite]" auf einen negativen Wert eingestellt ist, wird sie in umgekehrter Reihenfolge ausgeschnitten.

01. "Patatokukashi"

Nehmen Sie das 1., 3., 5. und 7. Zeichen der Zeichenkette "Patatokukashi" heraus und erhalten Sie die verkettete Zeichenkette.

Patatoku Kathy, als ich gegoogelt habe, scheint die ursprüngliche Geschichte Pitagora Switch zu sein.

Code


x = 'Patatoku Cassie'
x = x[::2]
x

Ausgabe


'Pat Auto'

Ich denke, es ist in Ordnung, die Zeichen 1, 3, 5 und 7 der Reihe nach zu extrahieren, aber es ist einfacher, die Slice-Operation zu verwenden. Ich denke es ist ein Gefühl.

02. "Patcar" + "Tax" = "Patatokukasie"

Erhalten Sie die Zeichenkette "Patatokukashi", indem Sie die Zeichen "Pattocar" + "Tax" von Anfang an abwechselnd verbinden.

Die Gruppierung von Elementen an derselben Position in mehreren Listen in einer Liste wird durch die Funktion "zip" realisiert. Es ist in Ordnung, weil der Streifenwagen und das Taxi gleich lang sind, aber wenn die Längen unterschiedlich sind, stimmt die von "zip" (genauer gesagt der Iterator) erzeugte Liste mit der Länge der kürzeren Liste überein. Es wird vermutet, dass es am längsten keinen letzten Brief gab ...

Wenn Sie "zip_longest" von "itertools" verwenden, passt es zum längeren. Beeindruckend.

Code


from itertools import zip_longest

Code


x1 = 'Pat Auto'
x2 = 'Taxi'
x = [
    char
    for two_chars in zip_longest(x1, x2, fillvalue = '')
    for char in two_chars
]
x = ''.join(x)
x

Ausgabe


'Patatoku Kashii'

zip_longest füllt das Ende der kürzeren Liste standardmäßig mit None, also füllen Sie die Lücken mitfillvalue = ''aus. Es ist eine Doppelschleife, dass es zwei für Anweisungen in der Listeneinschlussnotation gibt. Wenn Sie tatsächlich bestätigt haben, dass doppelt geschriebene for-Schleifen gleich funktionieren, werden Sie das Gefühl haben, dass nichts schwierig ist.

03. Umfangsrate

Brechen Sie den Satz „Jetzt brauche ich nach den schweren Vorlesungen über Quantenmechanik einen Alkoholiker auf.“ Auf. Erstellen Sie eine Liste mit der Anzahl der (alphabetischen) Zeichen in jedem Wort in der Reihenfolge ihres Auftretens.

Es ist ein Erinnerungslied des Umfangsverhältnisses. Es ist einfacher, sich normal zu erinnern.

Code


import re

Code


x = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'
x = re.sub(r'[^\w\s]', '', x)
x = x.split(' ')
x = [len(word) for word in x]
x

Ausgabe


[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

Verwenden Sie zunächst einen regulären Ausdruck, um alle außer lateinischen Zeichen und Leerzeichen zu entfernen. Begrenzen Sie es dann mit einem Leerzeichen und ermitteln Sie die Länge des zu schreibenden Wortes. Dies ist ein normaler Ausdruck, der vom Menschen gelesen werden kann. Ich habe keine Magie gelernt, daher kann ich keine cleveren regulären Ausdrücke schreiben.

04. Elementsymbol

Brechen Sie den Satz „Hi He Lied, weil Bor Fluor nicht oxidieren konnte. Neue Nationen könnten auch eine Friedenssicherheitsklausel unterzeichnen. Arthur King Can.“ In die Wörter 1, 5, 6, 7, 8, 9, 15, 16 auf. Das 19. Wort ist das erste Zeichen, und die anderen Wörter sind die ersten beiden Zeichen und das assoziative Array (Wörterbuchtyp oder Kartentyp) von der extrahierten Zeichenfolge bis zur Position des Wortes (welche Anzahl von Wörtern von Anfang an) Erstellen.

Code


x = 'Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.'
x = x.split(' ')
idx = {1, 5, 6, 7, 8, 9, 15, 16, 19}
d1 = [
    (num + 1, word[:1])
    for num, word in enumerate(x)
    if num + 1 in idx
]
d2 = [
    (num + 1, word[:2])
    for num, word in enumerate(x)
    if num + 1 not in idx
]
dct = {name:num for num, name in d1 + d2}
dct

Ausgabe


{'H': 1,
 'B': 5,
 'C': 6,
 'N': 7,
 'O': 8,
 'F': 9,
 'P': 15,
 'S': 16,
 'K': 19,
 'He': 2,
 'Li': 3,
 'Be': 4,
 'Ne': 10,
 'Na': 11,
 'Mi': 12,
 'Al': 13,
 'Si': 14,
 'Cl': 17,
 'Ar': 18,
 'Ca': 20}

Trennen Sie die Eingabe durch Leerzeichen und schneiden Sie das Token an der angegebenen Adresse durch ein oder zwei Zeichen von vorne ab, um die Adresse und das Elementsymbol zu kennzeichnen. Also werden wir den Taple im Wörterbuch speichern. Da die Adressen in der Python-Liste von 0 an gezählt werden, ist der Zugriff nicht besonders schwierig. Achten Sie nur darauf, dass sie um 1 von der Elementnummer abweichen.

Magnesium ist Mi geworden.

  1. n-gram

Erstellen Sie eine Funktion, die aus einer bestimmten Sequenz (Zeichenfolge, Liste usw.) ein n-Gramm erstellt. Verwenden Sie diese Funktion, um das Wort Bi-Gramm und den Buchstaben Bi-Gramm aus dem Satz "Ich bin ein NLPer" zu erhalten.

Ich mag den im folgenden Artikel darüber, wie man n-Gramm macht.

Einfaches und schnelles Programm mit Python

Code


def ngram(n, lst):
    return list(zip(*[lst[i:] for i in range(n)]))

Code


chars = 'I am an NLPer'
char_bi_gram = ngram(2, chars)

words = chars.split(' ')
word_bi_gram = ngram(2, words)

print('Zeichen bi-gram', char_bi_gram)
print('Wort bi-gram', word_bi_gram)

Ausgabe


Zeichen bi-gram [('I', ' '), (' ', 'a'), ('a', 'm'), ('m', ' '), (' ', 'a'), ('a', 'n'), ('n', ' '), (' ', 'N'), ('N', 'L'), ('L', 'P'), ('P', 'e'), ('e', 'r')]
Wort bi-gram [('I', 'am'), ('am', 'an'), ('an', 'NLPer')]

Das Obige ist praktisch, da das n-Gramm der Zeichenkette und der Liste mit derselben Funktion realisiert werden kann.

Die Reihenfolge der Argumente der Funktion "ngram" wurde unter der Annahme festgelegt, dass "functools.partial" angewendet wird, um eine Funktion zu erstellen, die einzelne n-Gramm erhält.

Code


from functools import partial

Code


bigram = partial(ngram, 2)
bigram(chars)

Ausgabe


[('I', ' '),
 (' ', 'a'),
 ('a', 'm'),
 ('m', ' '),
 (' ', 'a'),
 ('a', 'n'),
 ('n', ' '),
 (' ', 'N'),
 ('N', 'L'),
 ('L', 'P'),
 ('P', 'e'),
 ('e', 'r')]

Ich konnte eine Funktion zum Auffinden von Bi-Gramm erstellen.

06. Treffen

Suchen Sie den in "paraparaparadise" und "Absatz" enthaltenen Satz von Zeichen-Bi-Gramm als X bzw. Y und suchen Sie die Summen-, Produkt- und Differenzsätze von X bzw. Y. Finden Sie außerdem heraus, ob das Bi-Gramm in X und Y enthalten ist.

Code


str1 = 'paraparaparadise'
str2 = 'paragraph'
X = set(ngram(2, str1))
Y = set(ngram(2, str2))
print('Produktset', X & Y)
print('Differenz gesetzt', X - Y)
print('se in X?', ('s', 'e') in X)
print('se in Y?', ('s', 'e') in Y)

Ausgabe


Produktset{('r', 'a'), ('p', 'a'), ('a', 'r'), ('a', 'p')}
Differenz gesetzt{('a', 'd'), ('s', 'e'), ('i', 's'), ('d', 'i')}
se in X? True
se in Y? False

Es ist eine festgelegte Operation. Es scheint, dass "und" oder "oder" verwendet werden können, aber es kann nicht verwendet werden. Sie werden "&" und "|" verwenden, aber auch "Vereinigung", "Kreuzung" usw. sind verfügbar. Es gibt verschiedene Dinge, wie zum Beispiel beurteilen zu können, ob es sich um eine Teilmenge mit <= handelt.

07. Anweisungsgenerierung nach Vorlage

Implementieren Sie eine Funktion, die die Argumente x, y, z verwendet und die Zeichenfolge "y bei x ist z" zurückgibt. Stellen Sie außerdem x = 12, y = "Temperatur", z = 22,4 ein und überprüfen Sie das Ausführungsergebnis.

Code


def temperature(x, y, z):
    return '{}von Zeit{}Ist{}'.format(x, y, z)

Code


temperature(12, 'Temperatur', 22.4)

Ausgabe


'Die Temperatur um 12 Uhr ist 22.4'

Es ist ein Zeichenfolgenformat. Sie können das Anzeigeformat steuern, indem Sie verschiedene Dinge in {} schreiben. Wenn Sie keine komplizierten Operationen benötigen, kann {y} bei f '{x} als {z}' geschrieben werden. Es gibt auch eine Möglichkeit, den Operator "%" zu verwenden, aber ich verwende ihn nur, wenn ich etwas wie "printf" (?) Schreiben möchte. Und ich denke, es ist in Ordnung.

08. Kryptographie

Implementieren Sie die Funktionsverschlüsselung, die jedes Zeichen der angegebenen Zeichenfolge mit den folgenden Spezifikationen konvertiert. ・ Wenn es in niedrigerem Englisch ist, ersetzen Sie es durch das Zeichen (219 - Zeichencode) ・ Andere Zeichen werden unverändert ausgegeben Verwenden Sie diese Funktion, um englische Nachrichten zu verschlüsseln / entschlüsseln.

Es ist Caesar Code.

Versuchen Sie, Der schnelle braune Fuchs springt über den faulen Hund als englische Nachricht zu verwenden.

Code


def cipher(xs):
    xs = [
        chr(219 - ord(x)) if x.islower() else x
        for x in xs
    ]
    return ''.join(xs)

Code


x = 'The quick brown fox jumps over the lazy dog. 1234567890'
print('Klartext', x)
x = cipher(x)
print('Geheimtext', x)
x = cipher(x)
print('Entschlüsselter Text', x)

Ausgabe


Klartext Der schnelle Braunfuchs springt über den faulen Hund. 1234567890
Kryptographie Tsv jfrxp yildm ulc qfnkh levi gsv ozab wlt. 1234567890
Entschlüsselung Der schnelle Braunfuchs springt über den faulen Hund. 1234567890

Es ist ein Problem, die Operation zum Konvertieren einer Zeichenfolge in ASCII-Code, Anwenden der Verschlüsselung und Zurückgeben in eine Zeichenfolge zu implementieren. Sie müssen wissen, wie man "ord" und "chr" verwendet, und wissen, dass Sie entschlüsseln können, indem Sie "cipher" zweimal anwenden.

  1. Typoglycemia

Erstellen Sie ein Programm, das die Reihenfolge der anderen Zeichen zufällig neu anordnet, wobei das erste und das letzte Zeichen jedes Wortes für die Wortfolge durch Leerzeichen getrennt bleiben. Wörter mit einer Länge von 4 oder weniger werden jedoch nicht neu angeordnet. Geben Sie einen geeigneten englischen Satz ein (zum Beispiel: "Ich konnte nicht glauben, dass ich tatsächlich verstehen konnte, was ich las: die phänomenale Kraft des menschlichen Geistes.") Und überprüfen Sie das Ausführungsergebnis.

Die Nico Nico Enzyklopädie ist detailliert. Typoglykämie

Code


import random as rd

Code


def shuffle_str(x):
    x = list(x)
    rd.shuffle(x)
    return ''.join(x)

def typoglycemia(x):
    if len(x) <= 4:
        return x
    return x[0] + shuffle_str(x[1:-1]) + x[-1]

Code


x = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
x = x.split(' ')
x = [typoglycemia(word) for word in x]
x = ' '.join(x)
x

Ausgabe


"I c'lndout bliveee that I could allcutay uasntrdend what I was radneig : the penhnmaeol poewr of the haumn mind ."

Zeichenketten mit einer Länge von 4 oder weniger werden unverändert zurückgegeben. Bei anderen Zeichenketten werden das zweite Zeichen vom Anfang und das zweite Zeichen vom Ende gemischt. Python-Strings sind unveränderlich und können nicht wie Tupel zugewiesen werden. Sie müssen eine neue Zeichenfolge erstellen, indem Sie den Anfang, das Ende und den gemischten Mittelteil verbinden.

Weiter ist Kapitel 2

Knock 100 Languages 2020 Kapitel 2: UNIX-Befehle

Recommended Posts

100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 1: Vorbereitende Bewegung
[Sprachverarbeitung 100 Schläge 2020] Kapitel 1: Vorbereitende Bewegung
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Sprachverarbeitung Knock Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Klopfen der Verarbeitung natürlicher Sprache Kapitel 1 (Vorbereitungsbewegung)
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 natürliche Sprachverarbeitung klopft Kapitel 1 Vorbereitungsbewegung (zweite Hälfte)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
100 Sprachverarbeitungsklopfen (2020): 28
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock 2020 Kapitel 8: Neuronales Netz
100 Sprachverarbeitungsklopfen (2020): 38
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Sprachverarbeitung Knock 2020 Kapitel 3: Reguläre Ausdrücke
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 2
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 4
Ich habe mit GiNZA v3.1 Kapitel 4 100 Sprachverarbeitungsklopfen 2020 durchgeführt
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 2)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 1)
[Programmierer-Neuling "100 Sprachverarbeitung klopfen 2020"] Lösen Sie Kapitel 1
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitungsklopfen ~ Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung klopft Kapitel 2 (10 ~ 19)
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 Sprachverarbeitung Knock UNIX-Befehle in Kapitel 2
100 Sprachverarbeitung Klopfen Sie auf reguläre Ausdrücke, die Sie in Kapitel 3 gelernt haben
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-25: Vorlagenextraktion
Sprachverarbeitung 100 Knock-87: Wortähnlichkeit