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.
J'essaierai d'écrire un commentaire autant que possible, mais si vous êtes intéressé, je vous recommande de le vérifier.
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]».
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.
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).
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.
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é.
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.
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.
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.
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.
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.
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