[PYTHON] 100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung

["Kapitel 1: Vorbereitende Bewegung"](http: //www.cl.ecei.) Von Language Processing 100 Knock 2015 Es ist eine Aufzeichnung von tohoku.ac.jp/nlp100/#ch1). Dies ist eine Überprüfung dessen, was ich vor über einem Jahr getan habe. Wenn ich mir den Code zu diesem Zeitpunkt noch einmal anschaue, gibt es viele Korrekturen, und es scheint, dass es mein eigenes Wachstum ist. Ich habe das Gefühl, dass die Menge an Code auf etwa die Hälfte des damaligen Programms reduziert wurde. Und jetzt, da ich etwas Python-Erfahrung habe, ist es ein ** gutes Tutorial, um Python und Sprachverarbeitung ** zu lernen. Im Vergleich zur zweiten Hälfte ist ein Schlag leichter, was genau der Name "Vorbereitungsbewegung" verdient.

Umgebung

Art Ausführung Inhalt
OS Ubuntu18.04.01 LTS Es läuft virtuell
pyenv 1.2.15 Ich benutze pyenv, weil ich manchmal mehrere Python-Umgebungen benutze
Python 3.6.9 python3 auf pyenv.6.Ich benutze 9
3.7 oder 3.Es gibt keinen tiefen Grund, keine 8er-Serie zu verwenden
Pakete werden mit venv verwaltet

Kapitel 1: Vorbereitungsbewegung

Überprüfen Sie einige fortgeschrittene Themen in Programmiersprachen, während Sie an Themen arbeiten, die sich mit Text und Zeichenfolgen befassen.

String, Unicode, Listentyp, Wörterbuchtyp, Sammeltyp, Iterator, Slice, Zufallszahl

00. Umgekehrte Reihenfolge der Zeichenketten

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

Antwort: [000. Umgekehrte Reihenfolge von strings.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B% E5% 8B% 95 / 000.% E6% 96% 87% E5% AD% 97% E5% 88% 97% E3% 81% AE% E9% 80% 86% E9% A0% 86.ipynb)

Geben Sie Slices mit "[start: stop: step]" an und setzen Sie sie auf negative Zahlen, um die Reihenfolge umzukehren.

python:000.Umgekehrte Reihenfolge der Zeichenfolgen.ipynb


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

Ergebnis der Terminalausgabe


desserts

"Patatokukashi" (http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec01)

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

Antwort: [001. "Patatokukashi" .ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5 % 8B% 95 / 001.% E3% 83% 91% E3% 82% BF% E3% 83% 88% E3% 82% AF% E3% 82% AB% E3% 82% B7% E3% 83% BC% E3% 83% BC.ipynb)

Geben Sie das Slice mit "[start: stop: step]" an und geben Sie das 8. Zeichen von Anfang an in 2 Zeichenschritten aus.

python:001."Patatoku Cassie".ipynb


print('Patatoku Kashii'[0:7:2])

Ergebnis der Terminalausgabe


Pat Auto

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

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

Antwort: "Streifenwagen" + "Taxi" = "Patatokukasie" .ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99 % E9% 81% 8B% E5% 8B% 95 / 002.% E3% 80% 8C% E3% 83% 91% E3% 83% 88% E3% 82% AB% E3% 83% BC% E3% 80% 8D% EF% BC% 8B% E3% 80% 8C% E3% 82% BF% E3% 82% AF% E3% 82% B7% E3% 83% BC% E3% 80% 8D% EF% BC% 9D% E3% 80% 8C% E3% 83% 91% E3% 82% BF% E3% 83% 88% E3% 82% AF% E3% 82% AB% E3% 82% B7% E3% 83% BC% E3% 83% BC% E3% 80% 8Dipynb)

Verwenden Sie die Funktion "zip", um die beiden Wörter "Streifenwagen" und "Taxi" zu wiederholen und sie in Einschlussnotation als "['pata', 'toku', 'kashi', 'ー']" aufzulisten. Ausgabe durch Verbinden der Liste mit der Join-Funktion. Ich verstehe die Zip-Funktion in meinem Kopf, aber es ist eine Art Befehl, den ich in der Sprache noch nicht erlebt habe. Daher ist es schwierig, auf die Idee zu kommen, sie zu verwenden.

python:002."Pat car" + "Tax" = "Patatokukashi".ipynb


result = [char1+char2 for char1, char2 in zip('Pat Auto', 'Taxi')]
print(''.join(result))

Ergebnis der Terminalausgabe


Patatoku Kashii

Umfangsrate (http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec03)

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

Antwort: [003. Circumferential rate.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5 % 8B% 95 / 003.% E5% 86% 86% E5% 91% A8% E7% 8E% 87.ipynb)

Verwenden Sie die Funktion "Teilen", um den Raum zu teilen. Es ist ein sehr nützlicher Typ in der englischen Sprachverarbeitung. Die Funktion "Streifen" entfernt die Kommas und Punkte am Ende von Wörtern.

python:003.Pi.ipynb


sentence = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'
for word in sentence.split():
    print(len(word.strip(',.')), word.strip(',.'))

Die Anzahl der Zeichen ist das Umfangsverhältnis, nicht wahr?

Ergebnis der Terminalausgabe


3 Now
1 I
4 need
1 a
5 drink
9 alcoholic
2 of
6 course
5 after
3 the
5 heavy
8 lectures
9 involving
7 quantum
9 mechanics

04. Elementsymbol

Brechen Sie den Satz "Hi He Lied, weil Bor Fluor nicht oxidieren konnte. Neue Nationen könnten auch die 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. Erstellen.

Antwort: [004. Element symbol.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5% 8B% 95 / 004.% E5% 85% 83% E7% B4% A0% E8% A8% 98% E5% 8F% B7.ipynb)

Ich verwende den enthaltenen Wörterbuchtyp (es fiel mir schwer, nicht zu wissen, wie ich ihn mit der if-Anweisung kombinieren soll). Das Wörterbuch ist so sortiert, dass die Ausgabe in der Reihenfolge der Elementsymbole erfolgt. Schließlich habe ich "pprint" für die Ausgabe verwendet, weil ich jedes Element brechen wollte.

python:004.Elementsymbol.ipynb


from pprint import pprint

sentence = 'Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.'
word_list = sentence.split()

result = ({word[0] if i in {1, 5, 6, 7, 8, 9, 15, 16, 19} else word[:2]: i for i, word in enumerate(word_list, 1)})
pprint(sorted(result.items(), key=lambda x:x[1]))

Ergebnis der Terminalausgabe


[('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.

Antwort: [005.n-gram.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5 % 8B% 95 / 005.n-Gramm.ipynb)

Geht es darum, "range" in "for" als neues technisches Element zu verwenden?

python:005.n-gram.ipynb


def generate_ngram(sentence):
    
    #Liste durch Teilen mit Leerzeichen
    words = sentence.split()
    
    #Rohlingsentfernung
    chars = sentence.replace(' ','')
    
    #Wort bi-Gramm Generation
    bigram_word = [words[i-1] + ' ' + words[i] for i in range(len(words)) if i > 0]
    
    #Zeichen bi-Gramm Generation
    bigram_char = [chars[i-1] + chars[i] for i in range(len(chars)) if i > 0]
    
    return bigram_word, bigram_char

print(generate_ngram('I am an NLPer'))

Ergebnis der Terminalausgabe


(['I am', 'am an', 'an NLPer'], ['Ia', 'am', 'ma', 'an', 'nN', 'NL', 'LP', 'Pe', 'er'])

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.

Antwort: [006. Meeting.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5%8B % 95 / 006.% E9% 9B% 86% E5% 90% 88.ipynb)

In Python gibt es etwas, das als "Menge" bezeichnet wird, und es scheint, dass Sie die Summenmenge, die Produktmenge und die Differenzmenge leicht finden können.

python:006.einstellen.ipynb


def generate_ngram(sentense):
    
    #Rohlingsentfernung
    chars = sentense.replace(' ','')
    
    #Zeichen bi-Gramm Generation
    bigram_char = [chars[i-1] + chars[i] for i in range(len(chars)) if i > 0]
    
    return bigram_char

bigram_x = set(generate_ngram('paraparaparadise'))
bigram_y = set(generate_ngram('paragraph'))

#Summensatz
print(bigram_x.union(bigram_y))

#Produktset
print(bigram_x.intersection(bigram_y))

#Differenz gesetzt
print(bigram_x.difference(bigram_y))

search_word = {'se'}
print(search_word.intersection(bigram_x))
print(search_word.intersection(bigram_y))

Ergebnis der Terminalausgabe


{'ag', 'ap', 'se', 'ra', 'is', 'pa', 'ad', 'ph', 'di', 'ar', 'gr'}
{'pa', 'ar', 'ap', 'ra'}
{'ad', 'se', 'di', 'is'}

{'se'}
set()

07. Satzerzeugung durch Vorlage

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

Antwort: [007. Satzgenerierung durch template.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B% E5% 8B% 95 / 007.% E3% 83% 86% E3% 83% B3% E3% 83% 97% E3% 83% AC% E3% 83% BC% E3% 83% 88% E3% 81% AB % E3% 82% 88% E3% 82% 8B% E6% 96% 87% E7% 94% 9F% E6% 88% 90.ipynb)

Zeichen wurden mit + kombiniert. {} Zum Zeitpunkt von '' {} kann {} 'sein. Format (x, y, z) `.

python:007.Anweisungserstellung nach Vorlage.ipynb


def create_sentence(x,y,z):
    return str(x) + 'von Zeit' + str(y) + 'Ist' + str(z)

print(create_sentence(12, 'Temperatur', 22.4))

Ergebnis der Terminalausgabe


Die Temperatur um 12 Uhr ist 22.4

Kryptographie (http://www.cl.ecei.tohoku.ac.jp/nlp100/#sec08)

Implementieren Sie die Funktionsverschlüsselung, die jedes Zeichen der angegebenen Zeichenfolge mit den folgenden Spezifikationen konvertiert.

  • Durch Kleinbuchstaben (219 - Zeichencode) ersetzen
  • Andere Zeichen werden so ausgegeben, wie sie sind

Verwenden Sie diese Funktion, um englische Nachrichten zu verschlüsseln / entschlüsseln.

Antwort: [008. Cryptography.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5% 8B% 95 / 008.% E6% 9A% 97% E5% 8F% B7% E6% 96% 87.ipynb)

"219 - Zeichencode" scheint so etwas zu bedeuten. Der Zeichencode von a ist 97, und wenn in dieser Verschlüsselung 219 - 97 = 122 eingestellt ist, wird der Zeichencode zu 122, was z ist. Der Zeichencode von z ist 122, und wenn in dieser Verschlüsselung 219 - 122 = 97 eingestellt ist, ist der Zeichencode 97 a. Mit anderen Worten, es ist eine Verschlüsselung, die die unteren römischen Buchstaben a bis z in der umgekehrten Reihenfolge von z bis a ersetzt. Verwenden Sie die integrierte Funktion chr, um den Zeichencode zu steuern. Ich habe mich gefragt, ob ich die Einschlussnotation verwenden soll, aber ich habe sie gestoppt, weil es schwierig zu sein scheint, als letztes Mitglied zu werden.

python:008.Geheimtext.ipynb


def cipher(sentence):
    result = ''
    for char in sentence:
        if char.islower():
            result += chr(219-ord(char))
        else:
            result += char
    return result

print(cipher('I Am An Idiot'))

Ergebnis der Terminalausgabe


I An Am Iwrlg

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.

Antwort: [009.Typoglycemia.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5%8B % 95 / 009.Typoglykämie.ipynb)

Es ist ein Phänomen, dass 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.

Ich verstehe, du kannst es irgendwie lesen. Die Zeichen werden mit der Shuffle-Funktion des Random-Pakets neu angeordnet.

python:009.Typoglycemia.ipynb


from random import shuffle

def typoglycemia(word):
    mid_chars = list(word[1:-1])
    shuffle(mid_chars)
    return word[0] + ''.join(mid_chars) + word[-1]

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

Ergebnis der Terminalausgabe


"I cul'dnot beilvee that I culod altualcy udnnrseatd what I was riadeng : the paemhnenol peowr of the hmuan mind ."

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 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 (erste Hälfte)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock Kapitel 1 in Python
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]
NLP100: Kapitel 1 Vorbereitungsbewegung
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 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-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")