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

["Chapitre 1: Mouvement préparatoire"](http: //www.cl.ecei.) Of Language Processing 100 Knock 2015 Il s'agit d'un enregistrement de tohoku.ac.jp/nlp100/#ch1). C'est un examen de ce que j'ai fait il y a plus d'un an. En regardant à nouveau le code à ce moment-là, il y a de nombreuses corrections, et il semble que c'est ma propre croissance. Je pense que la quantité de code a été réduite à environ la moitié de celle du programme que j'avais fait à l'époque. Et maintenant que j'ai une certaine expérience de Python, c'est un ** bon tutoriel pour apprendre Python et le traitement du langage **. Par rapport à la seconde moitié, un coup est plus léger, ce qui est exactement ce que mérite le nom de «mouvement préparatoire».

environnement

type version Contenu
OS Ubuntu18.04.01 LTS Il fonctionne virtuellement
pyenv 1.2.15 J'utilise pyenv car j'utilise parfois plusieurs environnements Python
Python 3.6.9 python3 sur pyenv.6.J'utilise 9
3.7 ou 3.Il n'y a aucune raison profonde de ne pas utiliser la série 8
Les packages sont gérés à l'aide de venv

Chapitre 1: Mouvement préparatoire

Passez en revue certains sujets avancés des langages de programmation tout en travaillant sur des sujets traitant du texte et des chaînes.

Chaîne, Unicode, Type de liste, Type de dictionnaire, Type collectif, Itérateur, Tranche, Aléatoire

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

Réponse: [000. Ordre inverse de strings.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B% E5% 8B% 95 / 000.% E6% 96% 87% E5% AD% 97% E5% 88% 97% E3% 81% AE% E9% 80% 86% E9% A0% 86.ipynb)

Spécifiez les tranches avec [start: stop: step] et définissez-les sur des nombres négatifs pour inverser l'ordre.

python:000.Ordre inverse des chaînes.ipynb


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

Résultat de sortie du terminal


desserts

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.

Réponse: [001. "Patatokukashi" .ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5 % 8B% 95 / 001.% E3% 83% 91% E3% 82% BF% E3% 83% 88% E3% 82% AF% E3% 82% AB% E3% 82% B7% E3% 83% BC% E3% 83% BC.ipynb)

Spécifiez la tranche avec [start: stop: step] et sortez le 8ème caractère depuis le début par pas de 2 caractères.

python:001.«Patatoku Cassie».ipynb


print('Patatoku Kashii'[0:7:2])

Résultat de sortie du terminal


Voiture Pat

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

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

Réponse: [002. "Voiture de patrouille" + "Taxi" = "Patatokukasee" .ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99 % E9% 81% 8B% E5% 8B% 95 / 002.% E3% 80% 8C% E3% 83% 91% E3% 83% 88% E3% 82% AB% E3% 83% BC% E3% 80% 8D% EF% BC% 8B% E3% 80% 8C% E3% 82% BF% E3% 82% AF% E3% 82% B7% E3% 83% BC% E3% 80% 8D% EF% BC% 9D% E3% 80% 8C% E3% 83% 91% E3% 82% BF% E3% 83% 88% E3% 82% AF% E3% 82% AB% E3% 82% B7% E3% 83% BC% E3% 83% BC% E3% 80% 8Dipynb)

Utilisez la fonction zip pour boucler les deux mots" voiture de patrouille "et" taxi "et les lister comme['pata', 'toku', 'kashi', 'ー'] ʻen notation d'inclusion. Sortie en connectant la liste avec la fonctionjoin. Je comprends la fonction zip` dans ma tête, mais c'est une sorte de commande que je n'ai pas expérimentée dans le langage, il est donc difficile de trouver l'idée de l'utiliser.

python:002."Pat car" + "Tax" = "Patatokukashi".ipynb


result = [char1+char2 for char1, char2 in zip('Voiture Pat', 'Taxi')]
print(''.join(result))

Résultat de sortie du terminal


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

Réponse: [003. Circumferential rate.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5 % 8B% 95 / 003.% E5% 86% 86% E5% 91% A8% E7% 8E% 87.ipynb)

Utilisez la fonction split pour diviser l'espace. C'est un gars très utile dans le traitement de l'anglais. La fonction strip supprime les virgules et les points à la fin des mots.

python:003.Pi.ipynb


sentence = 'Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.'
for word in sentence.split():
    print(len(word.strip(',.')), word.strip(',.'))

Le nombre de caractères est le rapport de circonférence, n'est-ce pas?

Résultat de sortie du terminal


3 Now
1 I
4 need
1 a
5 drink
9 alcoholic
2 of
6 course
5 after
3 the
5 heavy
8 lectures
9 involving
7 quantum
9 mechanics

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

Réponse: [004. Element symbol.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5% 8B% 95 / 004.% E5% 85% 83% E7% B4% A0% E8% A8% 98% E5% 8F% B7.ipynb)

J'utilise le type de dictionnaire inclus (j'ai eu du mal à ne pas savoir comment le combiner avec l'instruction if). Le dictionnaire est trié de sorte que la sortie soit dans l'ordre des symboles d'élément. Enfin, j'ai utilisé pprint pour la sortie parce que je voulais casser chaque élément.

python:004.Symbole d'élément.ipynb


from pprint import pprint

sentence = 'Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.'
word_list = sentence.split()

result = ({word[0] if i in {1, 5, 6, 7, 8, 9, 15, 16, 19} else word[:2]: i for i, word in enumerate(word_list, 1)})
pprint(sorted(result.items(), key=lambda x:x[1]))

Résultat de sortie du terminal


[('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".

Réponse: [005.n-gram.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5 % 8B% 95 / 005.n-gramme.ipynb)

S'agit-il d'utiliser «range» in »for» comme nouvel élément technique?

python:005.n-gram.ipynb


def generate_ngram(sentence):
    
    #Liste en divisant par des blancs
    words = sentence.split()
    
    #Suppression du blanc
    chars = sentence.replace(' ','')
    
    #Mot bi-génération de gramme
    bigram_word = [words[i-1] + ' ' + words[i] for i in range(len(words)) if i > 0]
    
    #Personnage bi-génération de gramme
    bigram_char = [chars[i-1] + chars[i] for i in range(len(chars)) if i > 0]
    
    return bigram_word, bigram_char

print(generate_ngram('I am an NLPer'))

Résultat de sortie du terminal


(['I am', 'am an', 'an NLPer'], ['Ia', 'am', 'ma', 'an', 'nN', 'NL', 'LP', 'Pe', 'er'])

06. Réunion

Trouvez l'ensemble des caractères bi-grammes contenus dans «paraparaparadise» et «paragraphe» comme X et Y, respectivement, et trouvez les ensembles somme, produit et différence de X et Y, respectivement. En outre, découvrez si le bi-gram'se'est inclus dans X et Y.

Réponse: [006. Meeting.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5%8B % 95 / 006.% E9% 9B% 86% E5% 90% 88.ipynb)

En Python, il y a quelque chose qui s'appelle set, et il semble que vous puissiez facilement trouver l'ensemble de somme, l'ensemble de produits et l'ensemble de différences.

python:006.ensemble.ipynb


def generate_ngram(sentense):
    
    #Suppression du blanc
    chars = sentense.replace(' ','')
    
    #Personnage bi-génération de gramme
    bigram_char = [chars[i-1] + chars[i] for i in range(len(chars)) if i > 0]
    
    return bigram_char

bigram_x = set(generate_ngram('paraparaparadise'))
bigram_y = set(generate_ngram('paragraph'))

#Ensemble de somme
print(bigram_x.union(bigram_y))

#Ensemble de produits
print(bigram_x.intersection(bigram_y))

#Ensemble de différences
print(bigram_x.difference(bigram_y))

search_word = {'se'}
print(search_word.intersection(bigram_x))
print(search_word.intersection(bigram_y))

Résultat de sortie du terminal


{'ag', 'ap', 'se', 'ra', 'is', 'pa', 'ad', 'ph', 'di', 'ar', 'gr'}
{'pa', 'ar', 'ap', 'ra'}
{'ad', 'se', 'di', 'is'}

{'se'}
set()

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.

Réponse: [007. Génération de phrases par template.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B% E5% 8B% 95 / 007.% E3% 83% 86% E3% 83% B3% E3% 83% 97% E3% 83% AC% E3% 83% BC% E3% 83% 88% E3% 81% AB % E3% 82% 88% E3% 82% 8B% E6% 96% 87% E7% 94% 9F% E6% 88% 90.ipynb)

Les caractères ont été combinés avec «+». {} Au moment de '{} peut être {}'. Format (x, y, z).

python:007.Génération de déclaration par modèle.ipynb


def create_sentence(x,y,z):
    return str(x) + 'de temps' + str(y) + 'Est' + str(z)

print(create_sentence(12, 'Température', 22.4))

Résultat de sortie du terminal


La température à 12 heures est de 22.4

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.

--Remplacer par (219 --character code) caractères si minuscules --Les autres caractères sont affichés tels quels

Utilisez cette fonction pour crypter / décrypter les messages en anglais.

Réponse: [008. Cryptography.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5% 8B% 95 / 008.% E6% 9A% 97% E5% 8F% B7% E6% 96% 87.ipynb)

«219 --Character code» semble vouloir dire quelque chose comme ça. Le code de caractère de a est 97, et si 219 --97 = 122 est défini dans ce cryptage, le code de caractère devient 122, qui est z. Le code de caractère de z est 122, et si 219 --122 = 97 est défini dans ce cryptage, le code de caractère 97 est a. En d'autres termes, il s'agit d'un cryptage qui remplace les lettres romaines inférieures de a à z dans l'ordre inverse de z à a. Utilisez la fonction intégrée chr pour contrôler le code de caractère. Je me demandais s'il fallait utiliser la notation d'inclusion, mais je l'ai arrêtée car il semble gênant d'avoir join en dernier.

python:008.Cryptogramme.ipynb


def cipher(sentence):
    result = ''
    for char in sentence:
        if char.islower():
            result += chr(219-ord(char))
        else:
            result += char
    return result

print(cipher('I Am An Idiot'))

Résultat de sortie du terminal


I An Am Iwrlg

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.

Réponse: [009.Typoglycemia.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/01.%E6%BA%96%E5%82%99%E9%81%8B%E5%8B % 95 / 009.Typoglycémie.ipynb)

C'est un phénomène que certains mots d'une phrase peuvent être lus correctement même si l'ordre autre que la première et la dernière lettre est changé.

Je vois, vous pouvez le lire d'une manière ou d'une autre. Les caractères sont réorganisés à l'aide de la fonction «shuffle» du paquet «random».

python:009.Typoglycemia.ipynb


from random import shuffle

def typoglycemia(word):
    mid_chars = list(word[1:-1])
    shuffle(mid_chars)
    return word[0] + ''.join(mid_chars) + word[-1]

sentence = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
' '.join([word if len(word) <= 4 else typoglycemia(word) for word in sentence.split(' ')])

Résultat de sortie du terminal


"I cul'dnot beilvee that I culod altualcy udnnrseatd what I was riadeng : the paemhnenol peowr of the hmuan mind ."

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 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 (première moitié)
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
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]
PNL100: Chapitre 1 Mouvement préparatoire
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 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 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")