[Programmeur nouveau venu "100 language processing knock 2020"] Résoudre le chapitre 1

introduction

En me promenant sur le net, je suis soudainement tombé sur un site appelé "Language Processing 100 Knock 2020". Alors que je voulais toucher au traitement du langage naturel, la programmation était un nouveau venu pour un programmeur qui faisait un petit concours. Je suis un peu intéressé, alors je vais essayer. Au moment de la rédaction de cet article, seule la moitié du total est terminée, mais je vais l'écrire dans un sens commémoratif. J'arrêterai si mon cœur se brise. Veuillez deviner s'il n'y a pas d'article précédent.

Environnement et position

environnement

position

J'essaierai d'écrire un commentaire autant que possible, mais si vous êtes intéressé, je vous recommande de le vérifier.

Résoudre "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).

00.py


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

Terminal


desserts

C'est un processus qui utilise des tranches Python. Je vois souvent des tranches quand je suis un pro de la compétition. Les tranches peuvent spécifier «[start: stop: step]».

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.

01.py


print("Patatoku Kashii"[::2])

Terminal


Voiture Pat

Extraire tous les autres caractères du premier caractère est facile avec des tranches.

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

Obtenez la chaîne de caractères "Patatokukashi" en reliant alternativement les caractères "Pattocar" + "Tax" depuis le début.

02.py


print("".join([ i + j for i, j in zip("Voiture Pat", "Taxi")]))

Terminal


Patatoku Kashii

La longueur du code est raccourcie en utilisant join () qui convertit la liste en une chaîne de caractères, une notation d'inclusion de liste et zip () qui récupère le contenu de plusieurs listes (pourquoi).

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

Ver raccourci sans signification

03.py


print(*(map(lambda x: len(x),"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.".translate(str.maketrans({",":"",".":""})).split())))

Terminal


3 1 4 1 5 9 2 6 5 3 5 8 9 7 9

Je peux toujours aller sur une seule ligne ... La fonction map exécute une fonction pour chaque élément de la liste et renvoie un objet map. Cette fonction est maintenant définie par une expression lambda. Le contenu de l'expression est défini pour renvoyer la longueur de la chaîne donnée. translate () remplace la chaîne basée sur la table de conversion créée par str.maketrans (). De plus, split () est séparé par un blanc pour créer une liste.

Peut-être un ver décent

03.py


s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
l = s.translate(str.maketrans({",": "", ".": ""})).split()
a = []
for i in l:
    a.append(len(i))
print(*a)

Ce que vous faites est le même que le plus court. La seule chose qui a changé est que ce qui a été fait avec la fonction map est transformé en une instruction for. ʻAppend () `ajoute un élément à la fin de la liste.

La raison de l'ajout de «*» lors de l'impression est de développer et d'afficher la liste.

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. Créer.

04.py


s="Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.".split()
l=[1,5,6,7,8,9,15,16,19]
dic={}
for i in range(len(s)):
    if i in l:
        dic[s[i][0]]=i+1
    else:
        dic[s[i][:2]]=i+1
print(dic)

Terminal


{'Hi': 1, 'H': 2, 'Li': 3, 'Be': 4, 'Bo': 5, 'C': 20, 'N': 10, 'O': 8, 'F': 9, 'Na': 11, 'Mi': 12, 'Al': 13, 'Si': 14, 'Pe': 15, 'S': 16, 'Ar': 18, 'Ki': 19}

J'y ai pensé et en ai fait plusieurs lignes. Si ʻi est dans l`, le premier caractère est généré, sinon le deuxième caractère est la clé.

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

Veuillez vous référer à ici pour ce qu'est le n-gramme.

05.py


def N_gram(s, n=1):
    return [s[i:i+n] for i in range(len(s)-n+1)]


s = "I am an NLPer"
print(*(N_gram(s, 2)))
print(*(N_gram(s.split(), 2)))

Terminal


I   a am m   a an n   N NL LP Pe er
['I', 'am'] ['am', 'an'] ['an', 'NLPer']

L'implémentation de N_gram est devenue beaucoup plus compacte. Cela semble être le cas car il y a un blanc dans le résultat de l'exécution ... La fonction range () est un générateur qui renvoie des entiers de 0 à moins que le nombre spécifié dans l'ordre. Vous pouvez également spécifier la partie 0. «N = 1» dans la partie déclaration de fonction est un argument de modèle. S'il n'est pas spécifié, n signifie 1.

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.

Pour le moment, le paradis de la parapara semble être un jeu de danse.

06.py


def N_gram(s, n=1):
    return {s[i:i + n] for i in range(len(s) - n + 1)}


s1 = "paraparaparadise"
s2 = "paragraph"

X = N_gram(s1, 2)
Y = N_gram(s2, 2)

s_union = X | Y
s_intersection = X & Y
s_difference = X - Y

print(*s_union)
print(*s_intersection)
print(*s_difference)

if "se" in X:
    print("\"se\" is in X")

if "se" not in Y:
    print("\"se\" is not in Y")

Terminal


pa ar ad ap is se di ag ph gr ra
ar pa ra ap
is ad se di
"se" is in X
"se" is not in Y

C'est comme écrire comme si vous pouviez voir l'avenir. Il est possible d'utiliser set.union,set.intersection ()et set.difference (), mais personnellement, il est plus facile d'utiliser|,&, -. Alors j'ai fait ça.

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.

07.py


def temp(x=12, y="Température", z=22.4):
    return str(x) + "de temps" + str(y) + "Est" + str(z)


print(temp())

Terminal


La température à 12 heures est de 22.4

05 . J'utilise l'argument modèle mentionné dans n-gramme. Si vous écrivez une instruction d'affectation dans l'argument écrit au moment de la déclaration de la fonction, la fonction sera exécutée avec cette valeur même si aucun argument n'est donné au moment de l'exécution.

08. Cryptographie

Implémentez la fonction de chiffrement qui convertit chaque caractère de la chaîne de caractères donnée selon les spécifications suivantes. ・ Remplacer par (219 --character code) caractères si les lettres minuscules ・ Les autres caractères sont affichés tels quels Utilisez cette fonction pour crypter / décrypter les messages en anglais.

08.py


def cipher(s):
    return "".join(c.islower()*chr(219-ord(c))+(not c.islower())*c for c in s)


print(cipher("The quick brown fox jumps over the lazy dog."))
print(cipher(cipher("The quick brown fox jumps over the lazy dog.")))

Terminal


Tsv jfrxp yildm ulc qfnkh levi gsv ozab wlt.
The quick brown fox jumps over the lazy dog.

J'ai fait de mon mieux pour en faire une fête. (Non, pas) Cette fois, je fais bon usage du fait que le type booléen de Python est une sous-classe du type int. islower () est une fonction qui détermine si elle est inférieure. 219 - Le code de caractère est dû au fait qu'il revient bien après deux fois.

  1. Typoglycemia

Créez un programme qui réorganise aléatoirement 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.

Typogrisemia est un phénomène dans lequel certains mots d'une phrase peuvent être lus correctement même si l'ordre autre que les première et dernière lettres est changé (cependant, légende urbaine / Netmeme).

09.py


import random


def typoglycemia(s):
    return s if len(s) < 4 else s[0] + "".join(random.sample([i for i in s[1: -1]], len(s)-2)) + s[-1]


s = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .".split()
print(" ".join(map(lambda x: typoglycemia(x), s)))

J'ai également mis la fonction sur une ligne (pourquoi). S'il est inférieur à 4 caractères, il sera laissé tel quel, sinon il sera mélangé, concaténé et renvoyé à l'exception du dernier caractère du premier caractère. Contrairement à random.shuffle (), random.sample () est caractérisé par le fait que le premier argument peut être immuable (non modifiable). De plus, random.shuffle () n'a pas de valeur de retour, mais random.sample () retourne une liste.

en conclusion

J'ai résolu les problèmes du chapitre 1, mais comment était-ce? Je pense qu'il y a eu de nombreuses implémentations étranges, mais c'est ludique. Veuillez me pardonner pour l'instant car je dois l'implémenter correctement même si je ne l'aime pas en seconde période. À partir du chapitre suivant, j'espère augmenter la quantité de commentaires.

Veuillez commenter si vous aimez "cela raccourcira le code" ou "c'est mieux".

Rendez-vous dans l'article du chapitre 2.

Recommended Posts

[Programmeur nouveau venu "100 language processing knock 2020"] Résoudre le chapitre 1
[Programmer newcomer "100 language processing knock 2020"] Résoudre le chapitre 2 [Première moitié: 10 ~ 15]
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 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
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
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 3
100 Language Processing Knock: Chapitre 1 Mouvement préparatoire
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 8: Neural Net
100 Language Processing Knock 2020 Chapitre 1: Mouvement préparatoire
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
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
J'ai fait 100 traitements linguistiques Knock 2020 avec GiNZA v3.1 Chapitre 4
100 traitements de langage avec Python (chapitre 2, partie 2)
J'ai essayé de résoudre 100 traitements linguistiques Knock 2020 version [Chapitre 2: Commandes UNIX 10 à 14]
J'ai essayé de résoudre 100 traitements linguistiques Knock 2020 version [Chapitre 2: Commandes UNIX 15-19]
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 coups de traitement du langage ~ Chapitre 1
100 coups de langue amateur: 07
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 coups de traitement du langage avec Python 2015
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: Chapitre 2 Principes de base des commandes UNIX (à l'aide de pandas)
100 Language Processing Knock-25: Extraction de modèles
Traitement du langage 100 Knock-87: similitude des mots
J'ai essayé 100 traitements linguistiques Knock 2020
100 Language Processing Knock-56: analyse de co-référence
Résolution de 100 traitements linguistiques Knock 2020 (01. "Patatokukashi")
100 coups de traitement du langage amateur: Résumé
100 points de traitement du langage naturel Chapitre 2 Bases des commandes UNIX (deuxième moitié)
100 points de traitement du langage naturel Chapitre 2 Bases des commandes UNIX (première moitié)
100 Language Processing Knock Chapitre 10 Méthode de l'espace vectoriel (II) + Résumé général
100 traitements du langage naturel frappent le chapitre 4 Commentaire