[PYTHON] 100 Language Processing Knock 2020 Chapitre 1

Traitement linguistique version 100 knock 2020 a été publié, je vais donc le résoudre à cette occasion. Puisqu'il s'agit d'une démarque de mon cahier jupyter, l'explication est moindre. J'ai également posté sur Qiita ce que je prévoyais de mettre en place sur mon blog et GitHub, en espérant que cela serait utile autant que possible. Je ne peux pas aider les enseignants qui peuvent fournir un matériel pédagogique aussi merveilleux.

Le chapitre 5 et au-delà sera ajouté dès qu'ils seront terminés.

Chapitre 1: Mouvement préparatoire

(Corrigé le 15/04/2020) Révisé par @ hi-asano, l'auteur de "100 language processing knock 2020 version release! What has changed?" Fait. J'ajouterai la notation d'inclusion de 04 quand j'aurai le temps.

00. Ordre inverse des chaînes

Obtenez une chaîne avec les caractères de la chaîne "souligné" disposés en sens inverse (de la fin au début).

def reverse_strings(s):
    return s[::-1]

print(reverse_strings("stressed"))
desserts

01. Patatoku Kashii

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.

def extract_strings(s):
    return s[::2]

print(extract_strings("Patatoku Kashii"))

Voiture Pat

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

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

#Ne peut être utilisé qu'avec des chaînes de même longueur
def connect_strings(sone, stwo):
    result = "".join(s1+s2 for s1,s2 in zip(sone, stwo))
    return result

print(connect_strings("Voiture Pat", "Taxi"))

Patatoku Kashii

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

Le résultat de sortie est le rapport de circonférence. J'étais incapable de l'écrire proprement, mais j'avais l'intention de le rendre aussi court que possible en supprimant les virgules et les points avec des expressions régulières. Le nombre de caractères est traité à l'aide de map sans activer l'instruction for.

import re
def circumference(s):
    splited = re.split('\s', re.sub(r'[,.]',  '', s))
    words_len = list(map(len, splited))
    return words_len

sentence = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
print(circumference(sentence))
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

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

Vous devriez pouvoir écrire plus magnifiquement en utilisant la notation zip et inclusion. J'apprécierais que vous me disiez s'il y a un bon moyen. .. ..

def element_symbol(s, number):
    out_dict = {}
    splited = re.split('\s', s)
    for i, w in enumerate(splited, start=1):
        if i in number:
            out_dict[w[:1]] = i
        else :
            out_dict[w[:2]] = i
            
    return out_dict

sentence = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
only_first_number = [1, 5, 6, 7, 8, 9, 15, 16, 19]
print(element_symbol(sentence, only_first_number))
{'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

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

Selon le wiki, N-gramme est comme suit

Une méthode pour décomposer la cible de recherche par caractères au lieu de mots et trouver la fréquence d'occurrence comprenant les N-1 caractères suivants. Si la valeur de N est 1, on l'appelle "uni-gramme", si elle vaut 2, on l'appelle "bi-gramme", et si elle vaut 3, on l'appelle "tri-gramme".

~~ Cette fois, j'ai décidé d'implémenter le mot n-gramme et le caractère n-gramme comme fonctions séparées. ~~ Il pourrait être utilisé à des fins générales en séparant les chaînes de caractères données par split et en les passant sous forme de liste.

def generate_ngram(sentence, N):
    return [sentence[i:i+N] for i in range(len(sentence) - N + 1)]

input_text = "I am an NLPer"

print("Mot bi-gram : " + str(generate_ngram(input_text.split(' '), 2)))
print("Personnage bi-gram : " + str(generate_ngram(input_text, 2)))

Mots bi-gramme: [['I', 'am'], ['am', 'an'], ['an', 'NLPer']] Bi-gramme de caractères: ['I', 'a', 'am', 'm', 'a', 'an', 'n', 'N', 'NL', 'LP', 'Pe', 'euh']

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.

X_text = "paraparaparadise"
Y_text = "paragraph"

X = set(generate_ngram(X_text, 2))
Y = set(generate_ngram(Y_text, 2))

print("Ensemble de somme: " + str(X.union(Y)))
print("Ensemble de produits: " + str(X.intersection(Y)))
print("Ensemble de différences: " + str(X.difference(Y)))

print("Est-ce inclus dans X: " + str('se' in X))
print("Est-ce inclus dans Y: " + str('se' in Y))

Ensemble de somme: {'pa', 'di', 'ph', 'gr', 'is', 'ag', 'ra', 'ad', 'se', 'ap', 'ar'} Ensemble de produits: {'ap', 'pa', 'ra', 'ar'} Ensemble de différences: {'se', 'is', 'di', 'ad'} Est-ce inclus dans X: True Est-ce inclus dans Y: False

07. Génération de phrases 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.

Notez que f-string ne peut pas être utilisé avant python 3.6. Inversement, f-string n'est pas utilisé dans les articles précédents. Les informations de base sont ici.

def generate_temp(x, y, z):
    return f"{x}de temps{y}Est{z}"

print(generate_temp(12, "Température", 22.4))

La température à 12h00 est de 22,4

08. Code

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 lettres minuscules, 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.

Il semble que vous puissiez obtenir le point de code Unicode du caractère avec la fonction intégrée ʻord () `, alors j'ai essayé de l'utiliser. Il est rapide à remplacer par une expression régulière car il vous suffit de convertir celle qui correspond aux minuscules.

def chipher(s):
    result = ""
    for character in s:
        result += re.sub(r'[a-z]', chr(219 - ord(character)), character)
    return result


sentence = "Hi, Thank you for reading my article!!"
print(chipher(sentence))
print(chipher(chipher(sentence)))
Hr, Tszmp blf uli ivzwrmt nb zigrxov!!
Hi, Thank you for reading my article!!

@ suzu6 a utilisé la formule lambda pour le résoudre plus joliment. Au contraire, ce n'était pas très bon d'exécuter une boucle for pour la remplacer par une expression régulière. Dans l'exemple ci-dessous, m est Match Object et group (https://note.nkmk.me/python-re-match-object-span-group/) est utilisé pour obtenir la chaîne correspondante. ) Doit être utilisé. Obtenez toute la chaîne correspondante avec group (0)

def cipher(src):
    return re.sub(r'[a-z]', lambda m: chr(219 - ord(m.group(0))), src)

text = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."

#chiffrement
print(cipher(text))
Hr Hv Lrvw Bvxzfhv Blilm Clfow Nlg Ocrwrav Foflirmv. Nvd Nzgrlmh Mrtsg Aohl Srtm Pvzxv Svxfirgb Cozfhv. Aigsfi Krmt Czm.

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

Je pense qu'il aurait été préférable de ne pas utiliser la notation d'inclusion de liste, mais comme c'était juste la bonne longueur pour la pratique, j'ai utilisé la notation d'inclusion de liste. Une phrase qui peut être lue d'une manière ou d'une autre est sortie.

import random

def mixing_word(sentence):
    splited = sentence.split(" ")     
    randomed_list = [ s[0] + ''.join(random.sample(s[1:-1], len(s)-2)) + s[-1] if len(s) >= 4 else s for s in splited]
    return " ".join(randomed_list)

input_text = "I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind."
mixing_word(input_text)
'I cndolu’t beveile taht I colud aulltacy unndtserad what I was raednig : the penhaneoml pwoer of the hmuan mdin.'

finalement

Je suis une personne biosourcée qui a appris la programmation par moi-même sans faire de professionnels de la compétition, alors j'apprécierais que vous me disiez quelque chose de mal.

Recommended Posts

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 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
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 traitements de langage avec Python (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 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
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 1
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 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
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 coups de traitement du langage avec Python 2015
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 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 linguistique knock-50: coupure de phrase
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