[PYTHON] 100 Sprachverarbeitung Knock 2020 Kapitel 1

Sprachverarbeitung 100 Knock 2020 Version wurde veröffentlicht, daher werde ich es bei dieser Gelegenheit lösen. Da es sich um einen Abschlag meines Jupyter-Notebooks handelt, ist die Erklärung weniger. Ich habe auch auf Qiita gepostet, was ich auf meinem Blog und GitHub zusammenstellen möchte, in der Hoffnung, dass es so hilfreich wie möglich sein würde. Ich kann den Lehrern nicht helfen, die so wunderbare Unterrichtsmaterialien zur Verfügung stellen können.

Kapitel 5 und darüber hinaus werden hinzugefügt, sobald sie abgeschlossen sind.

Kapitel 1: Vorbereitende Bewegung

(Korrigiert am 15.04.2020) Überarbeitet von @ hi-asano, dem Autor von "Version 100 Sprachverarbeitung Knock 2020 veröffentlicht! Was hat sich geändert?" Hat. Ich werde die Einschlussnotation 04 hinzufügen, wenn ich Zeit habe.

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).

def reverse_strings(s):
    return s[::-1]

print(reverse_strings("stressed"))
desserts

01. Patatoku Kashii

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

def extract_strings(s):
    return s[::2]

print(extract_strings("Patatoku Kashii"))

Pat Auto

02. "Pat car" + "Tax" = "Patatokukasie"

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

#Kann nur mit Zeichenfolgen gleicher Länge verwendet werden
def connect_strings(sone, stwo):
    result = "".join(s1+s2 for s1,s2 in zip(sone, stwo))
    return result

print(connect_strings("Pat Auto", "Taxi"))

Patatoku Kashii

03. Umfangsrate

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

Das Ausgabeergebnis ist das Umfangsverhältnis. Ich war nicht in der Lage, es ordentlich zu schreiben, aber ich wollte es so kurz wie möglich machen, indem ich Kommas und Punkte mit regulären Ausdrücken entfernte. Die Zeichenanzahl wird mit map verarbeitet, ohne die for-Anweisung zu drehen.

import re
def circumference(s):
    splited = re.split('\s', re.sub(r'[,.]',  '', s))
    words_len = list(map(len, splited))
    return words_len

sentence = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
print(circumference(sentence))
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

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

Sie sollten in der Lage sein, mit Zip- und Inklusionsnotation schöner zu schreiben. Ich würde es begrüßen, wenn Sie mir sagen könnten, ob es einen guten Weg gibt. .. ..

def element_symbol(s, number):
    out_dict = {}
    splited = re.split('\s', s)
    for i, w in enumerate(splited, start=1):
        if i in number:
            out_dict[w[:1]] = i
        else :
            out_dict[w[:2]] = i
            
    return out_dict

sentence = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
only_first_number = [1, 5, 6, 7, 8, 9, 15, 16, 19]
print(element_symbol(sentence, only_first_number))
{'H': 1, 'He': 2, 'Li': 3, 'Be': 4, 'B': 5, 'C': 6, 'N': 7, 'O': 8, 'F': 9, 'Ne': 10, 'Na': 11, 'Mi': 12, 'Al': 13, 'Si': 14, 'P': 15, 'S': 16, 'Cl': 17, 'Ar': 18, 'K': 19, 'Ca': 20}

05.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.

Laut Wiki ist N-Gramm wie folgt

Eine Methode zum Zerlegen des Suchziels nach Zeichen anstelle von Wörtern und zum Ermitteln der Häufigkeit des Auftretens einschließlich der folgenden N-1-Zeichen. Wenn der Wert von N 1 ist, heißt er "Unigramm", wenn er 2 ist, heißt er "Bi-Gramm", und wenn er 3 ist, heißt er "Trigramm".

~~ Dieses Mal habe ich beschlossen, das Wort n-Gramm und das Zeichen n-Gramm als separate Funktionen zu implementieren. ~~ Es kann für allgemeine Zwecke verwendet werden, indem die angegebenen Zeichenfolgen durch "split" getrennt und als Liste übergeben werden.

def generate_ngram(sentence, N):
    return [sentence[i:i+N] for i in range(len(sentence) - N + 1)]

input_text = "I am an NLPer"

print("Wort bi-gram : " + str(generate_ngram(input_text.split(' '), 2)))
print("Zeichen bi-gram : " + str(generate_ngram(input_text, 2)))

Wörter Bi-Gramm: [['Ich', 'Bin'], ['Bin', 'Ein'], ['Ein', 'NLPer']] Zeichen-Bi-Gramm: ['Ich', 'a', 'bin', 'm', 'a', 'an', 'n', 'N', 'NL', 'LP', 'Pe', 'äh']

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.

X_text = "paraparaparadise"
Y_text = "paragraph"

X = set(generate_ngram(X_text, 2))
Y = set(generate_ngram(Y_text, 2))

print("Summensatz: " + str(X.union(Y)))
print("Produktset: " + str(X.intersection(Y)))
print("Differenz gesetzt: " + str(X.difference(Y)))

print("Ist se in X enthalten: " + str('se' in X))
print("Ist se in Y enthalten: " + str('se' in Y))

Summensatz: {'pa', 'di', 'ph', 'gr', 'is', 'ag', 'ra', 'ad', 'se', 'ap', 'ar'} Produktmenge: {'ap', 'pa', 'ra', 'ar'} Differenz gesetzt: {'se', 'is', 'di', 'ad'} Ist se in X enthalten: True Ist se in Y enthalten: False

07. Satzerzeugung 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.

Beachten Sie, dass "f-string" nicht vor Python 3.6 verwendet werden kann. Umgekehrt wird "f-string" in früheren Artikeln nicht verwendet. Grundlegende Informationen finden Sie hier.

def generate_temp(x, y, z):
    return f"{x}von Zeit{y}Ist{z}"

print(generate_temp(12, "Temperatur", 22.4))

Die Temperatur um 12:00 Uhr beträgt 22,4

08. Code

Implementieren Sie die Funktionsverschlüsselung, die jedes Zeichen der angegebenen Zeichenfolge mit den folgenden Spezifikationen konvertiert. ・ Wenn es in Kleinbuchstaben geschrieben 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 scheint, dass die eingebaute Funktion ord () den Unicode-Codepunkt des Zeichens erhalten kann, also habe ich versucht, ihn zu verwenden. Es ist schnell durch einen regulären Ausdruck zu ersetzen, da Sie nur den Ausdruck konvertieren müssen, der dem Kleinbuchstaben entspricht.

def chipher(s):
    result = ""
    for character in s:
        result += re.sub(r'[a-z]', chr(219 - ord(character)), character)
    return result


sentence = "Hi, Thank you for reading my article!!"
print(chipher(sentence))
print(chipher(chipher(sentence)))
Hr, Tszmp blf uli ivzwrmt nb zigrxov!!
Hi, Thank you for reading my article!!

@ suzu6 verwendete die Lambda-Formel, um sie besser zu lösen. Vielmehr war es nicht sehr gut, eine for-Schleife auszuführen, um sie durch einen regulären Ausdruck zu ersetzen. Im folgenden Beispiel wird m Match Object und group (https://note.nkmk.me/python-re-match-object-span-group/) verwendet, um die übereinstimmende Zeichenfolge abzurufen. ) Muss verwendet werden. Holen Sie sich die gesamte Zeichenfolge mit "Gruppe (0)" übereinstimmen.

def cipher(src):
    return re.sub(r'[a-z]', lambda m: chr(219 - ord(m.group(0))), src)

text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."

#Verschlüsselung
print(cipher(text))
Hr Hv Lrvw Bvxzfhv Blilm Clfow Nlg Ocrwrav Foflirmv. Nvd Nzgrlmh Mrtsg Aohl Srtm Pvzxv Svxfirgb Cozfhv. Aigsfi Krmt Czm.

09.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.

Ich denke, es wäre besser gewesen, die Listeneinschlussnotation nicht zu verwenden, aber da sie genau die richtige Länge für die Praxis hatte, habe ich die Listeneinschlussnotation verwendet. Ein Satz, der irgendwie gelesen werden kann, wird ausgegeben.

import random

def mixing_word(sentence):
    splited = sentence.split(" ")     
    randomed_list = [ s[0] + ''.join(random.sample(s[1:-1], len(s)-2)) + s[-1] if len(s) >= 4 else s for s in splited]
    return " ".join(randomed_list)

input_text = "I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind."
mixing_word(input_text)
'I cndolu’t beveile taht I colud aulltacy unndtserad what I was raednig : the penhaneoml pwoer of the hmuan mdin.'

Schließlich

Ich bin eine biobasierte Person, die das Programmieren selbst gelernt hat, kein Wettkampfprofi. Ich würde mich freuen, wenn Sie mir etwas Falsches sagen könnten.

Recommended Posts

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 (2020): 28
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
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 mit Python (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 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock 2020 Kapitel 8: Neuronales Netz
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
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 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
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 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 UNIX-Befehle in Kapitel 2
100 Sprachverarbeitung Klopfen Sie auf reguläre Ausdrücke, die Sie in Kapitel 3 gelernt haben
100 Sprachverarbeitung Knock-50: Satzumbruch
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