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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Knock 100 Languages 2020 Kapitel 2: UNIX-Befehle
Recommended Posts