[PYTHON] [Programmierer-Neuling "100 Sprachverarbeitung klopfen 2020"] Lösen Sie Kapitel 1

Einführung

Während ich im Internet herumwanderte, stieß ich plötzlich auf eine Site namens "Language Processing 100 Knock 2020". Während ich die Verarbeitung natürlicher Sprache ansprechen wollte, war das Programmieren ein Neuling für einen Programmierer, der ein wenig Konkurrenz machte. Ich bin ein wenig interessiert, also werde ich es versuchen. Zum Zeitpunkt des Schreibens dieses Artikels ist nur die Hälfte der Gesamtzahl fertig, aber ich werde es in einem Gedenksinn schreiben. Ich werde aufhören, wenn mein Herz bricht. Bitte raten Sie, ob es keinen vorherigen Artikel gibt.

Umwelt und Haltung

Umgebung

Haltung

Ich werde versuchen, so viel wie möglich einen Kommentar zu schreiben, aber wenn Sie interessiert sind, empfehle ich Ihnen, ihn zu überprüfen.

Löse "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).

00.py


print("stressed"[::-1])

Terminal


desserts

Es ist ein Prozess, der Python-Slices verwendet. Ich sehe oft Scheiben, wenn ich ein Wettkampfprofi bin. Slices können "[start: stop: step]" angeben.

01. "Patatokukashi"

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

01.py


print("Patatoku Kashii"[::2])

Terminal


Pat Auto

Das Extrahieren aller anderen Zeichen aus dem ersten Zeichen ist mit Slices einfach.

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

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

02.py


print("".join([ i + j for i, j in zip("Pat Auto", "Taxi")]))

Terminal


Patatoku Kashii

Die Codelänge wird durch die Verwendung von join () verkürzt, mit der die Liste in eine Zeichenfolge, eine Listeneinschlussnotation und zip () konvertiert wird, mit denen der Inhalt mehrerer Listen abgerufen wird (warum).

03. Umfangsrate

Brechen Sie den Satz auf "Jetzt brauche ich einen Drink, natürlich Alkoholiker, nach den schweren Vorlesungen über Quantenmechanik."

Ver bedeutungslos verkürzt

03.py


print(*(map(lambda x: len(x),"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.".translate(str.maketrans({",":"",".":""})).split())))

Terminal


3 1 4 1 5 9 2 6 5 3 5 8 9 7 9

Ich kann immer noch in einer Zeile gehen ... (Kein Sinn für die Richtung der Anstrengung) Die Kartenfunktion führt für jedes Listenelement eine Funktion aus und gibt ein Kartenobjekt zurück. Diese Funktion wird jetzt durch einen Lambda-Ausdruck definiert. Der Inhalt des Ausdrucks wird so definiert, dass er die Länge der angegebenen Zeichenfolge zurückgibt. translate () ersetzt die Zeichenfolge basierend auf der von str.maketrans () erstellten Konvertierungstabelle. Außerdem wird split () durch ein Leerzeichen getrennt, um eine Liste zu erstellen.

Vielleicht eine anständige ver

03.py


s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
l = s.translate(str.maketrans({",": "", ".": ""})).split()
a = []
for i in l:
    a.append(len(i))
print(*a)

Was Sie tun, ist dasselbe wie das kürzere. Das einzige, was sich geändert hat, ist, dass das, was mit der Map-Funktion gemacht wurde, zu einer for-Anweisung gemacht wird. append () fügt am Ende der Liste ein Element hinzu.

Der Grund für das Hinzufügen von "*" beim Drucken ist das Erweitern und Anzeigen der Liste.

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.

04.py


s="Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.".split()
l=[1,5,6,7,8,9,15,16,19]
dic={}
for i in range(len(s)):
    if i in l:
        dic[s[i][0]]=i+1
    else:
        dic[s[i][:2]]=i+1
print(dic)

Terminal


{'Hi': 1, 'H': 2, 'Li': 3, 'Be': 4, 'Bo': 5, 'C': 20, 'N': 10, 'O': 8, 'F': 9, 'Na': 11, 'Mi': 12, 'Al': 13, 'Si': 14, 'Pe': 15, 'S': 16, 'Ar': 18, 'Ki': 19}

Ich dachte darüber nach und machte es in mehrere Zeilen. Wenn "i" in "l" ist, wird das erste Zeichen erzeugt, andernfalls ist das zweite Zeichen der Schlüssel.

  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.

Informationen zu n-Gramm finden Sie unter hier.

05.py


def N_gram(s, n=1):
    return [s[i:i+n] for i in range(len(s)-n+1)]


s = "I am an NLPer"
print(*(N_gram(s, 2)))
print(*(N_gram(s.split(), 2)))

Terminal


I   a am m   a an n   N NL LP Pe er
['I', 'am'] ['am', 'an'] ['an', 'NLPer']

Die Implementierung von N_gram ist viel kompakter geworden. Es scheint so, weil das Ausführungsergebnis ein Leerzeichen enthält ... Die Funktion range () ist ein Generator, der ganze Zahlen von 0 bis weniger als die angegebene Anzahl in der angegebenen Reihenfolge zurückgibt. Sie können auch den 0-Teil angeben. N = 1 im Funktionsdeklarationsteil ist ein Vorlagenargument. Wenn nicht angegeben, bedeutet n 1.

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.

Das Parapara-Paradies scheint vorerst ein Tanzspiel zu sein.

06.py


def N_gram(s, n=1):
    return {s[i:i + n] for i in range(len(s) - n + 1)}


s1 = "paraparaparadise"
s2 = "paragraph"

X = N_gram(s1, 2)
Y = N_gram(s2, 2)

s_union = X | Y
s_intersection = X & Y
s_difference = X - Y

print(*s_union)
print(*s_intersection)
print(*s_difference)

if "se" in X:
    print("\"se\" is in X")

if "se" not in Y:
    print("\"se\" is not in Y")

Terminal


pa ar ad ap is se di ag ph gr ra
ar pa ra ap
is ad se di
"se" is in X
"se" is not in Y

Es ist wie Schreiben, als ob Sie die Zukunft sehen können. Es ist möglich, "set.union", "set.intersection ()" und "set.difference ()" zu verwenden, aber persönlich ist es einfacher, "|", "&", "-" zu verwenden. Also habe ich das gemacht.

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.

07.py


def temp(x=12, y="Temperatur", z=22.4):
    return str(x) + "von Zeit" + str(y) + "Ist" + str(z)


print(temp())

Terminal


Die Temperatur um 12 Uhr ist 22.4

05 . Ich verwende das in n-Gramm erwähnte Template-Argument. Wenn Sie eine Zuweisungsanweisung in das zum Zeitpunkt der Funktionsdeklaration geschriebene Argument schreiben, wird die Funktion mit diesem Wert ausgeführt, auch wenn zum Zeitpunkt der Ausführung kein Argument angegeben ist.

08. Kryptographie

Implementieren Sie die Funktionsverschlüsselung, die jedes Zeichen der angegebenen Zeichenfolge gemäß den folgenden Spezifikationen konvertiert. ・ Bei Kleinbuchstaben durch (219 - Zeichencode) ersetzen ・ Andere Zeichen werden unverändert ausgegeben Verwenden Sie diese Funktion, um englische Nachrichten zu verschlüsseln / entschlüsseln.

08.py


def cipher(s):
    return "".join(c.islower()*chr(219-ord(c))+(not c.islower())*c for c in s)


print(cipher("The quick brown fox jumps over the lazy dog."))
print(cipher(cipher("The quick brown fox jumps over the lazy dog.")))

Terminal


Tsv jfrxp yildm ulc qfnkh levi gsv ozab wlt.
The quick brown fox jumps over the lazy dog.

Ich habe mein Bestes gegeben, um daraus eine Party zu machen. (Nein nicht) Dieses Mal nutze ich die Tatsache, dass der Bool-Typ von Python eine Unterklasse vom Typ int ist. islower () ist eine Funktion, die bestimmt, ob sie niedriger ist. 219 - Der Zeichencode ist, weil er nach zwei Mal gut zurückkehrt.

  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.

Typogrisämie ist ein Phänomen, bei dem einige Wörter in einem Satz korrekt gelesen werden können, auch wenn die Reihenfolge außer dem ersten und dem letzten Buchstaben geändert wird (jedoch städtische Legende /) Netmeme).

09.py


import random


def typoglycemia(s):
    return s if len(s) < 4 else s[0] + "".join(random.sample([i for i in s[1: -1]], len(s)-2)) + s[-1]


s = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .".split()
print(" ".join(map(lambda x: typoglycemia(x), s)))

Ich habe die Funktion auch in eine Zeile gesetzt (warum). Wenn es weniger als 4 Zeichen enthält, bleibt es unverändert, andernfalls wird es gemischt, verkettet und zurückgegeben, mit Ausnahme des letzten Zeichens des ersten Zeichens. Im Gegensatz zu "random.shuffle ()" ist "random.sample ()" dadurch gekennzeichnet, dass das erste Argument unveränderlich (nicht modifizierbar) sein kann. Außerdem hat random.shuffle () keinen Rückgabewert, aber random.sample () gibt eine Liste zurück.

abschließend

Ich habe die Probleme in Kapitel 1 gelöst, aber wie war es? Ich denke, es gab viele seltsame Implementierungen, aber das ist verspielt. Bitte verzeihen Sie mir vorerst, da ich es richtig implementieren muss, auch wenn es mir in der zweiten Hälfte nicht gefällt. Ab dem nächsten Kapitel hoffe ich, die Anzahl der Kommentare zu erhöhen.

Bitte kommentieren Sie, wenn Sie "dies wird den Code verkürzen" oder "das ist besser" mögen.

Wir sehen uns im Artikel in Kapitel 2.

Recommended Posts

[Programmierer-Neuling "100 Sprachverarbeitung klopfen 2020"] Lösen Sie Kapitel 1
[Programmierer-Neuling "100 Sprachverarbeitung klopft 2020"] Löse Kapitel 2 [Erste Hälfte: 10 ~ 15]
100 Sprachverarbeitung Knock 2020 Kapitel 1
100 Sprachverarbeitung Knock Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
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
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
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 8: Neuronales Netz
100 Sprachverarbeitung Knock 2020 Kapitel 1: Vorbereitende Bewegung
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
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
Ich habe mit GiNZA v3.1 Kapitel 4 100 Sprachverarbeitungsklopfen 2020 durchgeführt
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 2)
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 2: UNIX-Befehle 10-14]
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 2: UNIX-Befehle 15-19]
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 Sprachverarbeitungsklopfen ~ Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
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 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-58: Extraktion von Taple
100 Sprachverarbeitung Knock-57: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock-50: Satzumbruch
100 Sprachverarbeitung Knock: Kapitel 2 UNIX-Befehlsgrundlagen (mit Pandas)
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 Klicks in der Verarbeitung natürlicher Sprache Kapitel 2 Grundlagen des UNIX-Befehls (zweite Hälfte)
100 Klicks in der Verarbeitung natürlicher Sprache Kapitel 2 Grundlagen des UNIX-Befehls (erste Hälfte)
100 Sprachverarbeitung Knock Kapitel 10 Vector Space-Methode (II) + Gesamtübersicht
100 Klicks in der Verarbeitung natürlicher Sprache Kapitel 4 Kommentar