100 Language Processing Knock Chapitre 1 en Python

Ceci est le premier chapitre de Knock 100 Language Processing.

L'environnement est Windows 10, python 3.6.0. J'ai fait référence à ici.

00. Ordre inverse des chaînes

Obtenez une chaîne avec les lettres «accentuées» inversées.

# coding: utf-8
target = "stressed"
new_target = target[::-1]
print(new_target)
desserts

la valeur par défaut est 0,8 lorsque le pas est positif, 8,0 lorsque le pas est négatif

01. «Patatoku Cassie»

Retirez les 1er, 3ème, 5ème et 7ème caractères de la chaîne de caractères "Patatokukashi" et obtenez la chaîne de caractères concaténée.

# coding: utf-8
word = "Patatoku Kashii"
new_word = word[::2]
print(new_word)

Voiture Pat

** N'oubliez pas. ** **

02. "Pat car" + "Tax" = "Patatoku Cassie"

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

# cording utf-8
word1 = u"Voiture Pat"
word2 = u"Taxi"
mix_word = ""
for w1,w2 in zip (word1,word2):
    mix_word += w1 + w2
print(mix_word)

Patatoku Kashii

--Zip pour s'adapter au plus long

import itertools
target1 = '12345'
target2 = 'abc'
zipped = itertools.zip_longest(target1,target2)
print(list(zipped))
[('1', 'a'), ('2', 'b'), ('3', 'c'), ('4', None), ('5', None)]

--Définissez la valeur sur autre chose que None

import itertools
target1 = '12345'
target2 = 'abc'
zipped = itertools.zip_longest(target1,target2,fillvalue = False )
print(list(zipped))
[('1', 'a'), ('2', 'b'), ('3', 'c'), ('4', False), ('5', False)]

--Si vous zippez à nouveau (), il reviendra à l'original.

import itertools
target1 = '12345'
target2 = 'abc'
zipped = itertools.zip_longest(target1,target2,fillvalue = False )
zipped_list = list(zipped)
zizipped = zip(zipped_list[0],zipped_list[1],zipped_list[2],zipped_list[3],zipped_list[4])
print(list(zizipped))
[('1', '2', '3', '4', '5'), ('a', 'b', 'c', False, False)]

-Ver en utilisant *

import itertools
target1 = '12345'
target2 = 'abc'
zipped = itertools.zip_longest(target1,target2,fillvalue = False )
zipped_list = list(zipped)
zizipped = zip(*zipped_list)
print(list(zizipped))
[('1', '2', '3', '4', '5'), ('a', 'b', 'c', False, False)]

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

words = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
result = []
new_words = words.translate(str.maketrans("","",",."))
for word in new_words.split(' '):
    word_length = len(word)
    result.append(word_length)
print(result)
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

strip supprime la chaîne spécifiée des deux extrémités.

str.translate(str.maketrans("","",".,"))

Les 1er → 2ème et 3ème facteurs sont les chaînes de caractères que vous souhaitez supprimer.

words = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
result = [len(word.strip(",.")) for word in words.split(" ")]
print(result)
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
import re
words = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
result = [len(word) for word in (re.sub(r"[,.]","",words).split(" "))]
print(result)
[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. De nouvelles nations pourraient également signer une clause de sécurité de paix. Arthur King Can." Le premier mot est le premier caractère, les autres mots sont les deux premiers caractères, et le tableau associatif (type de 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) est créé. Créez-le.

sentence = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
words = [word.strip(',.') for word in sentence.split()]
dic = {word[0]:words.index(word) + 1 for word in words if words.index(word) in (0,4,5,6,7,8,14,15,18)}
dic.update({word[:2]:words.index(word) + 1 for word in words if words.index(word) not in (0,4,5,6,7,8,14,15,18)})
print(dic)
{'H': 1, 'B': 5, 'C': 6, 'N': 7, 'O': 8, 'F': 9, 'P': 15, 'S': 16, 'K': 19, 'He': 2, 'Li': 3, 'Be': 4, 'Ne': 10, 'Na': 11, 'Mi': 12, 'Al': 13, 'Si': 14, 'Cl': 17, 'Ar': 18, 'Ca': 20}

--Une autre solution 1

sentence = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
words = [word.strip(',.') for word in sentence.split()]
link = {}
for i,v in enumerate(words,1):
    length = 1 if i in [1,5,6,7,8,9,15,16,19] else 2
    link.update({v[:length]:i})
print(link)
{'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}

--Une autre solution 2

sentence ="Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
#Premier personnage(Ou 2 lettres)Et créez un dictionnaire qui associe l'index de ce mot
link = {w[:2-(i in (1,5,6,7,8,9,15,16,19))]:i for i,w in enumerate(sentence.split(),1)}
print(link)
{'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}

Utilisation de la valeur booléenne True = 1 False = 0

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

sentence_string = "I am an NLPer"
sentence_list = sentence_string.split()
def n_gram(sequence,n):
    u"""Caractère bi lorsqu'il est passé sous forme de chaîne-gram,Le mot bi lorsqu'il est passé sous forme de liste-Traité comme un gramme.
    """
    result = []
    if isinstance(sequence,str):
        sequence = list(re.sub("[,. ]","",sequence))
    for i in range(len(sequence)- n+1):
        result.append('-'.join(sequence[i:i+n]))        
    return result
print(n_gram(sentence_string,2))
print(n_gram(sentence_list,2))
['I-a', 'a-m', 'm-a', 'a-n', 'n-N', 'N-L', 'L-P', 'P-e', 'e-r']
['I-am', 'am-an', 'an-NLPer']
import re

sentence_string = "I am an NLPer"
sentence_list = sentence_string.split()

def n_gram(sequence, n):
    u"""Caractère bi lorsqu'il est passé sous forme de chaîne-gram,Le mot bi lorsqu'il est passé sous forme de liste-Traité comme un gramme.
    """
    if isinstance(sequence, str):
        sequence = list(re.sub("[,. ]", "", sequence))
    return ['-'.join(sequence[i:i+n])
            for i in range(len(sequence) - n + 1)]

print(n_gram(sentence_string, 2))
print(n_gram(sentence_list, 2))

Vous pouvez utiliser la notation d'inclusion. ..

06. Réunion

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

import re
X = "paraparaparadise"
Y = "paragraph"
def n_gram(sequence,n):
    result = []
    if isinstance(sequence,str):
        sequence = list(re.sub("[,. ]","",sequence))
    for i in range(len(sequence)- n+1):
        result.append('-'.join(sequence[i:i+n]))
    return result
​
X = (set(n_gram(X,2)))
Y = (set(n_gram(Y,2)))
print("X:",X)
print("Y:",Y)
print("Ensemble de somme:",X | Y)
print("Ensemble de produits:",X & Y)
print("Jeu de différences 1:",X - Y)
print("Jeu de différences 2:",Y - X)
if 's-e' in X:
    print('se est inclus dans X')
if 's-e' in Y:
    print('se est inclus dans Y')
X: {'a-d', 'a-r', 'r-a', 'i-s', 's-e', 'd-i', 'p-a', 'a-p'}
Y: {'a-r', 'r-a', 'p-h', 'g-r', 'a-g', 'p-a', 'a-p'}

Ensemble de somme: {'a-r', 'i-s', 'p-a', 'a-p', 'a-d', 'r-a', 'p-h', 'g-r ',' s-e ',' d-i ',' a-g '} Ensemble de produits: {'p-a', 'a-p', 'a-r', 'r-a'} Ensemble de différences 1: {'a-d', 'd-i', 's-e', 'i-s'} Jeu de différences 2: {'a-g', 'g-r', 'p-h'} se est inclus dans X

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.

def make_sentence(x,y,z):
    print(u"{0}de temps{1}Est{2}".format(x,y,z))
make_sentence(x = 12,y = "Température",z = 22.4)

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

08. Code

Implémentez le chiffrement de fonction 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 minuscules

import re
pat = re.compile(u"[a-z]") 
def cipher(string):
    return ''.join(chr(219-ord(c)) if pat.match(c) else c for c in string)

if __name__ == "__main__":
    sentence = u"Hello world!"
    ciphertext = cipher(sentence)
    print(sentence)
    print(ciphertext)
    print(cipher(ciphertext))
re.compile('[a-z]')
Hello world!
Hvool dliow!
Hello world!

--Version d'expression régulière sans utilisation (de shiracamus)


def cipher(string):
    return ''.join(chr(219 - ord(c)) if c.islower() else c for c in string)

if __name__ == "__main__":
    sentence = u"Hello world!"
    ciphertext = cipher(sentence)
    print(sentence)
    print(ciphertext)
    print(cipher(ciphertext))

Vous pouvez utiliser str.islower (). str.islower () semble être «True» même s'il s'agit d'une chaîne de caractères qui n'est pas sensible à la casse.

chr(i) Renvoie une chaîne qui représente un caractère dont le point de code Unicode est l'entier i. Par exemple, chr (97) renvoie la chaîne «a» et chr (8364) renvoie la chaîne «€». Le contraire de ord ().

La plage valide d'arguments est comprise entre 0 et 1 114 111 (0 x 10FFFF en hexadécimal). ValueError est déclenché si i est hors de portée.

  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. Phrases anglaises appropriées (par exemple "Je ne pouvais pas croire que je pourrais réellement" Comprenez ce que je lisais: la puissance phénoménale de l'esprit humain. ") Et vérifiez le résultat de l'exécution.
from random import shuffle
def change_order(sentence):
    produced_word_list = []
    word_list = sentence.split(' ')
    for word in word_list:
        if len(word) <= 4:
            produced_word_list.append(word)
        else:
            middle = list(word[1:-1])
            shuffle(middle)
            produced_word = word[0] + ''.join(middle) + word[-1]
            produced_word_list.append(produced_word)
    return ' '.join(produced_word_list)
sentence = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
print(change_order(sentence))
I cnud'olt bvieele that I cluod aucltaly uestradnnd what I was reading : the pnemonaehl power of the huamn mind .

--Une autre solution

import random
def change_order(sentence):
    produced_word_list = []
    word_list = sentence.split(' ')
    for word in word_list:
        if len(word) <= 4:
            produced_word_list.append(word)
        else:
            middle_list = list(word[1:-1])
            new_middle = ''
            while len(middle_list) > 0:
                rnd = random.randint(0,len(middle_list)-1)
                new_middle += middle_list.pop(rnd)
            new_word = word[0] + new_middle + word[-1]
            produced_word_list.append(new_word)
    return ' '.join(produced_word_list)
sentence = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
print(change_order(sentence))
I cl'oundt beevile that I culod aauctlly unnetdarsd what I was rdeaing : the pneoenhaml peowr of the haumn mind .
import random

def change_order(sentence):
    def produced_words():
        word_list = sentence.split()
        for word in word_list:
            if len(word) <= 4:
                yield word
            else:
                middle = list(word[1:-1])
                random.shuffle(middle)
                yield word[0] + ''.join(middle) + word[-1]
    return ' '.join(produced_words())

sentence = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
print(change_order(sentence))

Mystère du générateur

Je n'étais seulement pas bon en générateurs, mais comme c'était un gros problème, Classes and Itterators - Plongez dans la version japonaise de Python 3 Itérateur Python J'ai essayé de comprendre en référence à. ..

Le générateur est Est-il correct de reconnaître que l'instruction for contient les méthodes next () et ʻiter () et appelle les méthodes iter, nextdans la fonction de générateur (?)? .. L'objet itérateur a deux méthodes, La méthodeiter se renvoie elle-même et la méthode next` renvoie l'élément suivant.

Note de Classes and Iterators-Dive into Python 3 Japanese Version

>>> import plural6
>>> r1 = plural6.LazyRules()
>>> r2 = plural6.LazyRules()
>>> r1.rules_filename                               ①
'plural6-rules.txt'
>>> r2.rules_filename
'plural6-rules.txt'
>>> r2.rules_filename = 'r2-override.txt'           ②
>>> r2.rules_filename
'r2-override.txt'
>>> r1.rules_filename
'plural6-rules.txt'
>>> r2.__class__.rules_filename                     ③
'plural6-rules.txt'
>>> r2.__class__.rules_filename = 'papayawhip.txt'  ④
>>> r1.rules_filename
'papayawhip.txt'
>>> r2.rules_filename                               ⑤
'r2-overridetxt'

(1) Chaque instance de cette classe hérite de l'attribut nom_fichier_règles dont la valeur est définie dans la classe. (2) La modification de la valeur d'attribut d'une instance n'affecte pas la valeur d'attribut des autres instances ... ③ …… Ne modifiez pas les attributs de classe. Vous pouvez faire référence aux attributs de classe (plutôt qu'aux attributs d'instances individuelles) en utilisant l'attribut spécial class pour accéder à la classe elle-même. (4) Lorsque l'attribut de classe est modifié, l'instance (r1 dans ce cas) qui hérite toujours de la valeur est affectée. ⑤ L'instance qui écrase l'attribut (r2 dans ce cas) n'est pas affectée.

Les instances individuelles et les instances de classe sont différentes.

sample1.py


class MyIterator(object):
    def __init__(self, *numbers):
        self._numbers = numbers
        self._i = 0
    def __iter__(self):
        # next()Est implémenté par soi-même, donc il renvoie soi-même
        return self
    def next(self):
        if self._i == len(self._numbers):
            raise StopIteration()
        value = self._numbers[self._i]
        self._i += 1
        return value

my_iterator = MyIterator(10, 20, 30)
for num in my_iterator:
    print 'hello %d' % num

sample2.py


class Fib:
    '''iterator that yields numbers in the Fibonacci sequence'''

    def __init__(self, max):
        self.max = max

    def __iter__(self):
        self.a = 0
        self.b = 1
        return self

    def __next__(self):
        fib = self.a
        if fib > self.max:
            raise StopIteration
        self.a, self.b = self.b, self.a + self.b
        return fib

Pourquoi y a-t-il un cas où «next» est une méthode spéciale «next» et un cas où c'est une méthode normale «next» dans la classe? Le __next__ dans la classe est appelé à partir de la méthode externenext, tandis que le suivant dans la classe est exécuté dans la classe (?)

Je ne comprends pas.

Recommended Posts

100 Language Processing Knock Chapitre 1 en Python
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 traitements de langage avec Python
100 traitements de langage avec Python (chapitre 3)
100 Language Processing Knock Chapitre 1 par Python
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 traitements de langage avec Python (chapitre 2, partie 2)
100 traitements de langage avec Python (chapitre 2, partie 1)
100 coups de traitement du langage avec Python 2015
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 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 Language Processing Knock 2020 Chapitre 4: Analyse morphologique
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 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
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (05 ~ 09)
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 2020 Chapitre 1: Mouvement préparatoire
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
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (00 ~ 04)
J'ai fait 100 traitements linguistiques Knock 2020 avec GiNZA v3.1 Chapitre 4
[Programmeur nouveau venu "100 language processing knock 2020"] Résoudre le chapitre 1
100 traitements linguistiques Knock 2020 [00 ~ 69 réponse]
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
Traitement de fichiers en Python
Python: traitement du langage naturel
100 Traitement du langage Knock-52: Stemming
100 coups de traitement du langage ~ Chapitre 1
100 coups de langue amateur: 07
Traitement de texte avec Python
Traitement des requêtes en Python
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
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 14-16
Python: apprentissage profond du traitement du langage naturel: principes de base
Une personne inexpérimentée en Python essaie de frapper 100 traitement du langage 07-09
Une personne inexpérimentée en Python tente de frapper 100 traitement du langage 10 ~ 13
100 traitements du langage frappent l'analyse morphologique apprise au chapitre 4