[PYTHON] 100 Language Processing Knock 2020 Chapitre 1: Mouvement préparatoire

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.

Chapitre 1: Mouvement préparatoire

00. Ordre inverse des chaînes

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.

01. «Patatokukashi»

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.

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

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.

03. Taux circonférentiel

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.

04. Symbole d'élément

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.

  1. n-gram

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.

06. Réunion

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

07. Génération de déclaration par modèle

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.

08. Cryptographie

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 ʻordetchr, et vous rendre compte que vous pouvez également déchiffrer en appliquant deux fois cipher.

  1. Typoglycemia

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.

Vient ensuite le chapitre 2

Knock 100 Languages 2020 Chapitre 2: Commandes UNIX

Recommended Posts

100 Language Processing Knock: Chapitre 1 Mouvement préparatoire
100 Language Processing Knock 2020 Chapitre 1: Mouvement préparatoire
[Traitement du langage 100 coups 2020] Chapitre 1: Mouvement préparatoire
100 Language Processing Knock 2020 Chapitre 1
100 Traitement du langage Knock Chapitre 1
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 Knocking Natural Language Processing Chapitre 1 (Mouvement préparatoire)
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 coups au traitement du langage naturel Chapitre 1 Mouvement préparatoire (seconde moitié)
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 9: RNN, CNN
100 coups de traitement linguistique (2020): 28
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 3
100 traitements de langage avec Python (chapitre 3)
100 Language Processing Knock 2020 Chapitre 6: Apprentissage automatique
100 Traitement du langage Knock Chapitre 4: Analyse morphologique
100 Language Processing Knock 2020 Chapitre 10: Traduction automatique (90-98)
100 Language Processing Knock 2020 Chapitre 5: Analyse des dépendances
100 Traitement du langage Knock 2020 Chapitre 7: Vecteur de mots
100 Language Processing Knock 2020 Chapitre 8: Neural Net
100 coups de traitement linguistique (2020): 38
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 1
100 traitement de la langue frapper 00 ~ 02
100 Language Processing Knock Chapitre 1 par Python
100 Language Processing Knock 2020 Chapitre 3: Expressions régulières
100 Language Processing Knock 2015 Chapitre 4 Analyse morphologique (30-39)
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 2
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 4
J'ai fait 100 traitements linguistiques Knock 2020 avec GiNZA v3.1 Chapitre 4
100 traitements de langage avec Python (chapitre 2, partie 2)
100 traitements de langage avec Python (chapitre 2, partie 1)
[Programmeur nouveau venu "100 language processing knock 2020"] Résoudre le chapitre 1
100 traitements linguistiques Knock 2020 [00 ~ 39 réponse]
100 langues de traitement knock 2020 [00-79 réponse]
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 coups de traitement du langage amateur: 17
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
100 Traitement du langage Knock-52: Stemming
100 coups de traitement du langage ~ Chapitre 1
100 coups de langue amateur: 07
Le traitement de 100 langues frappe le chapitre 2 (10 ~ 19)
100 coups de traitement du langage amateur: 09
100 coups en traitement du langage amateur: 47
Traitement 100 langues knock-53: Tokenisation
100 coups de traitement du langage amateur: 97
100 traitements linguistiques Knock 2020 [00 ~ 59 réponse]
100 coups de traitement du langage amateur: 67
100 Commandes de traitement du langage Knock UNIX apprises au chapitre 2
100 Traitement du langage Knock Expressions régulières apprises au chapitre 3
100 traitement du langage Knock-51: découpage de mots
100 Language Processing Knock-58: Extraction de Taple
100 Language Processing Knock-57: Analyse des dépendances
100 traitement linguistique knock-50: coupure de phrase
100 Language Processing Knock-25: Extraction de modèles
Traitement du langage 100 Knock-87: similitude des mots