L'autre jour, 100 Language Processing Knock 2020 a été publié. Je ne travaille moi-même sur le langage naturel que depuis un an, et je ne connais pas les détails, mais je vais résoudre tous les problèmes et les publier afin d'améliorer mes compétences techniques.
Ceci est mon premier article sur Qiita. Je ne comprends rien.
Tout doit être exécuté sur le notebook jupyter, et les restrictions de l'énoncé du problème peuvent être facilement rompues. Le code source est également sur github. Oui.
L'environnement est Python 3.8.2 et Ubuntu 18.04.
Récupère une chaîne dans laquelle les caractères de la chaîne "accentués" sont disposés à l'envers (de la fin au début)
code
x = 'stressed'
x = x[::-1]
x
production
'desserts'
C'est une opération de tranche. Si la largeur de pas de [position de départ: position de fin: largeur de pas]
est définie sur une valeur négative, elle sera coupée dans l'ordre inverse.
Retirez les 1er, 3e, 5e et 7e caractères de la chaîne de caractères "Patatokukashi" et récupérez la chaîne de caractères concaténée.
Patatoku Kathy, quand j'ai cherché sur Google, l'histoire originale semble être Pitagora Switch.
code
x = 'Patatoku Cassie'
x = x[::2]
x
production
'Voiture Pat'
Je pense que c'est correct d'extraire les 1er, 3ème, 5ème et 7ème caractères dans l'ordre, mais il est plus facile d'utiliser l'opération de tranche. Je pense que c'est un sentiment.
Récupérez la chaîne de caractères "Patatokukashi" en reliant alternativement les caractères "Pattocar" + "Tax" depuis le début.
L'opération de regroupement d'éléments dans la même position dans plusieurs listes dans une liste est réalisée par la fonction zip
.
Ce n'est pas grave car la voiture de patrouille et le taxi ont la même longueur, mais si les longueurs sont différentes, la liste générée par zip
(pour être exact, l'itérateur) correspondra à la longueur de la liste plus courte. On suppose qu'il n'y avait pas de dernière lettre sur le plus long ...
Si vous utilisez zip_longest
de ʻitertools`, il s'adaptera au plus long. Sensationnel.
code
from itertools import zip_longest
code
x1 = 'Voiture Pat'
x2 = 'Taxi'
x = [
char
for two_chars in zip_longest(x1, x2, fillvalue = '')
for char in two_chars
]
x = ''.join(x)
x
production
'Patatoku Kashii'
zip_longest
remplit la fin de la liste plus courte avec None
par défaut, alors remplissez les espaces avecfillvalue = ''
.
C'est une double boucle qu'il y a deux instructions for dans la notation d'inclusion de liste. Si vous avez confirmé que les boucles for en double écriture fonctionnent de la même manière, vous sentirez que rien n'est difficile.
Décomposez la phrase «Maintenant, j'ai besoin d'un verre, alcoolique bien sûr, après les lourdes conférences sur la mécanique quantique.» En mots, et créez une liste du nombre de caractères (alphabétiques) de chaque mot par ordre d'apparition.
C'est une chanson de mémoire du rapport de circonférence. C'est plus facile à retenir normalement.
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
production
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
Tout d'abord, utilisez une expression régulière pour supprimer tout sauf les caractères latins et les espaces. Ensuite, délimitez-le par un espace et trouvez la longueur du mot à écrire. C'est une expression normale qui peut être lue par les humains. Je n'ai pas appris la magie, donc je ne peux pas écrire d'expressions régulières intelligentes.
Décomposez la phrase "Salut, il a menti parce que le bore ne pouvait pas oxyder le fluor. Les nouvelles nations pourraient également signer la clause de sécurité de paix. Arthur King peut." En mots 1, 5, 6, 7, 8, 9, 15, 16, Le 19e mot est le premier caractère, et les autres mots sont les deux premiers caractères, et le tableau associatif (type dictionnaire ou type de carte) de la chaîne de caractères extraite à la position du mot (quel nombre de mots depuis le début) Créer.
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
production
{'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}
Séparez l'entrée par un espace et coupez le jeton à l'adresse spécifiée d'un ou deux caractères à partir de l'avant pour faire un tapotement de l'adresse et du symbole de l'élément. Donc, nous allons stocker le taple dans le dictionnaire. Étant donné que les adresses de la liste Python sont comptées à partir de 0, il n'est pas particulièrement difficile d'y accéder, veillez simplement à ce qu'elle s'écarte du numéro d'élément de 1.
Le magnésium est devenu Mi.
Créez une fonction qui crée un n-gramme à partir d'une séquence donnée (chaîne, liste, etc.). Utilisez cette fonction pour obtenir le mot bi-gramme et la lettre bi-gramme à partir de la phrase "Je suis un PNL".
J'aime celui de l'article suivant sur la création de n-gramme.
Ngram simple et rapide avec 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('Personnage bi-gram', char_bi_gram)
print('Mot bi-gram', word_bi_gram)
production
Personnage bi-gram [('I', ' '), (' ', 'a'), ('a', 'm'), ('m', ' '), (' ', 'a'), ('a', 'n'), ('n', ' '), (' ', 'N'), ('N', 'L'), ('L', 'P'), ('P', 'e'), ('e', 'r')]
Mot bi-gram [('I', 'am'), ('am', 'an'), ('an', 'NLPer')]
Ce qui précède est pratique car le n-gramme de la chaîne de caractères et la liste peuvent être réalisés par la même fonction.
L'ordre des arguments de la fonction «ngram» a été décidé sur l'hypothèse que «functools.partial» serait appliqué pour créer une fonction qui obtient des n-grammes individuels.
code
from functools import partial
code
bigram = partial(ngram, 2)
bigram(chars)
production
[('I', ' '),
(' ', 'a'),
('a', 'm'),
('m', ' '),
(' ', 'a'),
('a', 'n'),
('n', ' '),
(' ', 'N'),
('N', 'L'),
('L', 'P'),
('P', 'e'),
('e', 'r')]
J'ai pu créer une fonction pour trouver des bi-grammes.
Trouvez l'ensemble des bi-grammes de caractères contenus dans "paraparaparadise" et "paragraphe" comme X et Y, respectivement, et trouvez les ensembles de somme, de produit et de différence de X et Y, respectivement. En outre, découvrez si le bi-gram'se' est inclus dans X et Y.
code
str1 = 'paraparaparadise'
str2 = 'paragraph'
X = set(ngram(2, str1))
Y = set(ngram(2, str2))
print('Ensemble de produits', X & Y)
print('Ensemble de différences', X - Y)
print('se in X?', ('s', 'e') in X)
print('se in Y?', ('s', 'e') in Y)
production
Ensemble de produits{('r', 'a'), ('p', 'a'), ('a', 'r'), ('a', 'p')}
Ensemble de différences{('a', 'd'), ('s', 'e'), ('i', 's'), ('d', 'i')}
se in X? True
se in Y? False
C'est une opération fixe. Il semble que «et» ou «ou» peuvent être utilisés, mais ils ne peuvent pas être utilisés. Vous utiliserez &
et |
, mais ʻunion, ʻintersection
, etc. sont également disponibles. Il y a diverses choses comme pouvoir juger s'il s'agit d'un sous-ensemble avec <=
.
Implémentez une fonction qui prend les arguments x, y, z et renvoie la chaîne "y at x is z". De plus, définissez x = 12, y = «température», z = 22,4 et vérifiez le résultat de l'exécution.
code
def temperature(x, y, z):
return '{}de temps{}Est{}'.format(x, y, z)
code
temperature(12, 'Température', 22.4)
production
'La température à 12 heures est de 22.4'
C'est un format de chaîne de caractères. Vous pouvez contrôler le format d'affichage en écrivant diverses choses dans {}
.
Si vous n'avez pas besoin d'opérations compliquées, {y} en f '{x} peut être écrit comme {z}'
.
Il y a aussi un moyen d'utiliser l'opérateur %
, mais je ne l'utilise que lorsque je veux écrire quelque chose comme printf
(?), Et j'ai l'impression que ça va.
Implémentez la fonction de chiffrement qui convertit chaque caractère de la chaîne de caractères donnée avec les spécifications suivantes. ・ S'il est en anglais inférieur, remplacez-le par le caractère (219 - code de caractère) ・ Les autres caractères sont affichés tels quels Utilisez cette fonction pour crypter / décrypter les messages en anglais.
C'est le code César.
Essayez d'utiliser Le renard brun rapide saute par-dessus le chien paresseux comme message en anglais.
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('Texte brut', x)
x = cipher(x)
print('Cryptogramme', x)
x = cipher(x)
print('Texte décrypté', x)
production
Texte brut Le renard brun rapide saute par-dessus le chien paresseux. 1234567890
Cryptographie Tsv jfrxp yildm ulc qfnkh levi gsv ozab wlt. 1234567890
Décryptage Le renard brun rapide saute par-dessus le chien paresseux. 1234567890
Il est difficile de mettre en œuvre l'opération de conversion d'une chaîne de caractères en code ASCII, d'appliquer le cryptage et de la renvoyer en chaîne de caractères.
Vous devez savoir comment utiliser ʻordet
chr, et vous rendre compte que vous pouvez également déchiffrer en appliquant
deux fois cipher
.
Créez un programme qui réorganise de manière aléatoire l'ordre des autres caractères, en laissant le premier et le dernier caractère de chaque mot pour la chaîne de mots séparés par des espaces. Cependant, les mots d'une longueur de 4 ou moins ne sont pas réorganisés. Donnez une phrase en anglais appropriée (par exemple, "Je ne pouvais pas croire que je pouvais réellement comprendre ce que je lisais: le pouvoir phénoménal de l'esprit humain.") Et vérifiez le résultat de l'exécution.
L'Encyclopédie Nico Nico est détaillée. Typoglycé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
production
"I c'lndout bliveee that I could allcutay uasntrdend what I was radneig : the penhnmaeol poewr of the haumn mind ."
Les chaînes de caractères d'une longueur de 4 ou moins sont renvoyées telles quelles, et pour les autres chaînes de caractères, le deuxième caractère du début et le deuxième caractère de la fin sont mélangés. Les chaînes Python sont immuables et ne peuvent pas être affectées comme des taples. Vous devez créer une nouvelle chaîne en connectant le début, la fin et la partie médiane mélangée.
Knock 100 Languages 2020 Chapitre 2: Commandes UNIX
Recommended Posts