[PYTHON] J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 1

introduction

J'ai essayé Language processing 100 knock 2020. Des liens vers d'autres chapitres peuvent être trouvés à ici, et le code source peut être trouvé à ici.

Chapitre 1 Mouvement préparatoire

N ° 00 Ordre inverse des chaînes de caractères

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

<détails>

Réponse </ summary>

000.py


str = 'stressed'
print(str[::-1])

# -> desserts
Commentaires

Sortie dans l'ordre inverse à l'aide de tranches. Il est intéressant de pouvoir écrire facilement de telles opérations.

N ° 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.

<détails>

Réponse </ summary>

001.py


str = "Patatoku Kashii"
print(str[0:8:2])

# ->Voiture Pat
Commentaires

Puisque le nombre impair est retiré, "step" est mis à "2".

No.02 "Pat car" + "Tax" = "Patatokukashi"

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

<détails>

Réponse </ summary>

002.py


str1 = "Voiture Pat"
str2 = "Taxi"
print(''.join([s1 + s2 for s1, s2 in zip(str1, str2)]))

# ->Patatoku Kashii
Commentaires

Au début, j'ai pensé à boucler avec ʻindex, Il semble que vous puissiez gérer plusieurs fonctions à la fois en utilisant la fonction zip`.

N ° 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 de mécanique quantique." En mots, et créez une liste du nombre de caractères (alphabétiques) de chaque mot par ordre d'apparition.

<détails>

Réponse </ summary>

003.py


sentense = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
print([len(item) for item in sentense.replace(',', "").replace('.', "").split(' ')])

# -> [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
Commentaires

J'ai essayé d'utiliser la notation d'inclusion de liste. Cela peut être pratique car vous pouvez écrire en quelques lignes lors de la création d'une nouvelle liste.

Symbole d'élément n ° 04

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.

<détails>

Réponse </ summary>

004.py


str = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
str = str.split()
num = [1, 5, 6, 7, 8, 9, 15, 16, 19]
dict = {}

for i_str in range(0, len(str)):
    if i_str + 1 == 12:
        dict[str[11][:3:2]] = 12  # 'Mg'Sortie de
    elif i_str + 1 in num:
        dict[str[i_str][:1]] = i_str + 1
    else:
        dict[str[i_str][:2]] = i_str + 1
print(dict)

# -> {'H': 1, 'He': 2, 'Li': 3, 'Be': 4, 'B': 5, 'C': 6, 'N': 7, 'O': 8, 'F': 9, 'Ne': 10, 'Na': 11, 'Mg': 12, 'Al': 13, 'Si': 14, 'P': 15, 'S': 16, 'Cl': 17, 'Ar': 18, 'K': 19, 'Ca': 20}
Commentaires

J'ai l'impression que le code est un peu long ... Si les règles sont suivies, la partie Mg sera sortie comme Mi et je suis curieux, donc je la traite avec l'instruction ʻif`.

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

<détails>

Réponse </ summary>

005.py


def n_gram(list, n):
    return ["".join(list[list_i: list_i + n]) for list_i in range(len(list) - n + 1)]

sentence = "I am an NLPer"
print(f"Mot bi-gran:  {n_gram(sentence.split(), 2)}")
print(f"Personnage bi-gram:  {n_gram(sentence, 2)}")

# ->Mot bi-gran:  ['Iam', 'aman', 'anNLPer']
#Personnage bi-gram:  ['I ', ' a', 'am', 'm ', ' a', 'an', 'n ', ' N', 'NL', 'LP', 'Pe', 'er']
Commentaires

Utilisez join pour joindre les éléments de la liste. Le mot bi-gramme et le caractère bi-gramme font un traitement similaire, alors j'ai essayé de les rendre fonctionnels, mais je pense que j'ai été capable de bien les écrire.

Ensemble n ° 06

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.

<détails>

Réponse </ summary>

006.py


str1 = "paraparaparadise"
str2 = "paragraph"

def n_gram(list, n):
    return {"".join(list[list_i: list_i + n]) for list_i in range(len(list) - n + 1)}

X = n_gram(str1, 2)
Y = n_gram(str2, 2)
print(f"Ensemble de somme:{X | Y}")
print(f"Ensemble de produits:{X & Y}")
print(f"Ensemble de différences:{X - Y}")

se = {"se"}
print(f"Est-ce inclus dans X? :{se <= X}")
print(f"Est-ce inclus dans Y? :{se <= Y}")

# ->Ensemble de somme:{'ph', 'di', 'ar', 'gr', 'ad', 'is', 'se', 'ap', 'pa', 'ra', 'ag'}
#Ensemble de produits:{'ra', 'ap', 'ar', 'pa'}
#Ensemble de différences:{'is', 'di', 'se', 'ad'}
#Est-ce inclus dans X? : Vrai
#Est-ce inclus dans Y? : Faux
Commentaires

Il semble que vous puissiez aussi utiliser ʻunion () , ʻintersection () et difference () pour les ensembles de somme, les brasseurs de saké et les ensembles de différences.

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

<détails>

Réponse </ summary>

007.py


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

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

# ->La température à 12 heures est de 22.4
Commentaires

rien de spécial.

Code n ° 08

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

<détails>

Réponse </ summary>

008.py


def cipher(sentence):
    return "".join([chr(219 - ord(ch)) if ch.islower() else ch for ch in sentence])

sen = "FireWork"
print(cipher(sen))
print(cipher(cipher(sen)))

# -> FrivWlip
#    FireWork

Commentaires

Il semble que ce soit du code Atbash. Il sera restauré en passant deux fois la fonction cipher.

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

<détails>

Réponse </ summary>

009.py


import random

sentence = "I couldn’t believe that I could actually understand what I was reading : the phenomenal power of the human mind."
new_sent = ""
for item in sentence.split():
    if len(item) > 4:
        new_item = []
        new_item.extend(item[0])
        new_item.extend(random.sample(item[1:-1], len(item) - 2))
        new_item.extend(item[-1])
        item = new_item
    new_sent += "".join(item) + " "

print(new_sent)

# -> I could’nt blveeie that I cuold atlculay utnresnadd what I was renadig : the pamohneenl pewor of the human mdin. 
Commentaires

En plus de random.sample, il y a random.shuffle comme fonction pour organiser les éléments de la liste de manière aléatoire. La fonction shuffle trie la liste d'origine, donc je pense que le code peut être un peu plus court.

référence

[Upura / nlp100v2020 100 language processing knock 2020] est résolu avec Python](https://github.com/upura/nlp100v2020) Résumé du traitement du langage amateur à 100 coups

Recommended Posts