Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 1)

http://www.cl.ecei.tohoku.ac.jp/nlp100/ A été renouvelé, et il semble que la version 2015 soit sortie.

J'ai essayé d'utiliser mon python préféré (série 2). Je sais qu'il y a beaucoup d'articles similaires, mais (et je vois) http://qiita.com/tanaka0325/items/08831b96b684d7ecb2f7 Il est également ouvert au public sous forme de mémo de votre progression + partage. Si vous avez des suggestions, merci.

Je veux continuer après le chapitre 2 ... "Réhabilitation" n'a de sens que si elle continue!

Chapitre 1: Mouvement préparatoire

00. Ordre inverse des chaînes

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

Honnêtement


text = "stressed"
text_reverse = ""
n = len(text)
for i in xrange(n):
    text_reverse += text[n-i-1]
print text_reverse
#>>> desserts

Allez de la fin au début honnêtement en utilisant des indices. Cela fonctionne également lorsque text = "".

édition révisée


text = "stressed"
n = len(text)
text_reverse_list = [text[n-i-1] for i in xrange(n)]
text_reverse = ''.join(text_reverse_list)

print text_reverse
#>>> desserts

Post-scriptum: Il semble que la connexion à une chaîne de caractères avec une boucle for ne soit pas bonne en termes de vitesse d'exécution et de mémoire. Donc, je me suis référé à la méthode de "création d'une liste de chaînes de caractères → connexion avec jointure".

tranche


text = "stressed"
text_reverse = text[::-1]
print text_reverse
#>>> desserts

Simple avec des tranches. Objet chaîne [Index de début: Index de fin: Étape]

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.

python


text = u"Patatoku Kashii"
text_concat = text[0] + text[2] + text[4] + text[6]
print text_concat
#>>>Voiture Pat

J'ai donné la chaîne de caractères comme unicode.

python


text = u"Patatoku Kashii"
text_concat = text[::2]
print text_concat
#>>>Voiture Pat

Je vois, pouvez-vous faire la même chose avec des tranches?

02. "Patcar" + "Tax" = "Patatokukasie"

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

python


text1 = u"Voiture Pat"
text2 = u"Taxi"
text_concat = ""
m = len(text1)
n = len(text2)
for i in xrange(m):
    if i<n:
        text_concat += text1[i] + text2[i]
        if i == m-1:
            text_concat += text2[i+1:]
    else:
        text_concat += text1[i:]
        break

print text_concat
#>>>Patatoku Kashii

Regardons les deux chaînes depuis le début. Ce problème n'est pas un problème direct, Prenons le cas où text1 et text2 ne sont pas de la même longueur (m! = N). A ce moment, quand on a fini, L'autre a décidé de concaténer les chaînes suivantes.

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

python


sentence = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."

word_length = [len(x.strip(',.')) for x in sentence.split()]
print word_length
#>>> [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

J'aime le python parce qu'il peut être intelligemment en une seule ligne comme celui-ci.

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 la paix. Arthur King Can." 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.

python


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

word_list = [x.strip(',.') for x in sentence.split()]
word_dict = dict()
specified = [1, 5, 6, 7, 8, 9, 15, 16, 19]
for i, word in enumerate(word_list):
    if i in [x-1 for x in specified]:
        word_dict[word[:1]] = i+1
    else:
        word_dict[word[:2]] = i+1

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

J'ai mis i + 1 dans word_dict pour le rendre cohérent avec le "th" donné dans le problème. Eh bien, j'ai remarqué après l'avoir résolu, mais ai-je obtenu le "numéro atomique, c'est-à-dire le nombre de protons"? "Suihe, Ribe, ma fune" me manque.

Je me demande si le magnésium est «Mg»?

python


'Mi': 12
  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".

python


def n_gram(sentence_str, n, type):
    result = set()
    if type == 'word':
        words = [x.strip(',.') for x in sentence_str.split()]
    elif type == 'letter':
        words = sentence_str
    m = len(words)
    for i in xrange(m-n+1):
        result.add(tuple(words[i:i+n]))
    return result

#Si vous souhaitez également des informations de fréquence
from collections import defaultdict
def n_gram_freq(sentence_str, n, type):
    result = defaultdict(int)
    if type == 'word':
        words = [x.strip(',.') for x in sentence_str.split()]
    elif type == 'letter':
        words = sentence_str
    m = len(words)
    for i in xrange(m-n+1):
        result[tuple(words[i:i+n])] += 1
    return result


sentence_str = "I am an NLPer"
#sentence_list = ['I', 'am', 'an', 'NLPer']

print n_gram(sentence_str, 2, 'word')
#>>> set([('am', 'an'), ('an', 'NLPer'), ('I', 'am')])
print n_gram(sentence_str, 2, 'letter')
#>>> set([('N', 'L'), ('m', ' '), ('e', 'r'), ('a', 'n'), ('I', ' '), ('n', ' '), ('L', 'P'), (' ', 'N'), (' ', 'a'), ('a', 'm'), ('P', 'e')])


print n_gram_freq(sentence_str, 2, 'word')
#>>> defaultdict(<type 'int'>, {('am', 'an'): 1, ('an', 'NLPer'): 1, ('I', 'am'): 1})
print n_gram_freq(sentence_str, 2, 'letter')
#>>>defaultdict(<type 'int'>, {('N', 'L'): 1, ('m', ' '): 1, ('e', 'r'): 1, ('a', 'n'): 1, ('I', ' '): 1, ('n', ' '): 1, ('L', 'P'): 1, (' ', 'N'): 1, (' ', 'a'): 2, ('a', 'm'): 1, ('P', 'e'): 1})

Prenez une chaîne comme argument. Vous permet de sélectionner le mot n-gramme et le caractère n-gramme avec un autre type d'argument.

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.

python


str_x = "paraparaparadise"
str_y = "paragraph"

X = n_gram(str_x, 2, 'letter')
Y = n_gram(str_y, 2, 'letter')

print X.union(Y) #Ensemble de somme. X|Synonyme de Y
#>>>set([('g', 'r'), ('p', 'h'), ('p', 'a'), ('s', 'e'), ('a', 'p'), ('a', 'g'), ('a', 'd'), ('i', 's'), ('r', 'a'), ('a', 'r'), ('d', 'i')])

print X.intersection(Y) #Ensemble de produits. X&Synonyme de Y
#>>>set([('a', 'p'), ('r', 'a'), ('p', 'a'), ('a', 'r')])

print X.difference(Y) #Ensemble de différences. X-Synonyme de Y
#>>>set([('a', 'd'), ('s', 'e'), ('d', 'i'), ('i', 's')])

tuple('se') in X
#>>> True
tuple('se') in Y
#>>> False

Utilisez la fonction définie dans la question précédente. Dans la définition de la fonction, le «se» donné est converti en tuple et la condition est jugée.

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.

python


from string import Template

def generate_sentence(x,y,z):
    t = Template("${x_tmpl}de temps${y_tmpl}Est${z_tmpl}")
    return t.safe_substitute(x_tmpl=x, y_tmpl=y, z_tmpl=z)

def generate_sentence_incomplete(x,y,z):
    t = Template("${x_tmpl}de temps${y_tmpl}Est${z_tmpl}")
    return t.safe_substitute(x_tmpl=x, y_tmpl=y)

x, y, z =12, "Température", 22.4
print generate_sentence(x,y,z)
#>>>La température à 12 heures est de 22.4
print generate_sentence_incomplete(x,y,z)
#>>>La température à 12 heures${z_tmpl}

Depuis que j'ai utilisé Template.safe_substitute () http://docs.python.jp/2/library/string.html#string.Template.safe_substitute

Identique à substitute (), mais au lieu de lancer une exception KeyError, l'espace réservé d'origine est inclus tel quel si le mappage ou kws ne trouve pas d'espace réservé correspondant.

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 Afficher les autres caractères tels quels Utilisez cette fonction pour crypter / décrypter les messages en anglais.

python



def cipher(input_str):
    result = ""
    for letter in input_str:
        #Si c'est en lettres minuscules
        if letter.isalpha() and letter.islower():
            result += chr(219-ord(letter))
        else:
            result += letter
    return result

english_message = "This is a pen."

#chiffrement
print cipher(english_message)
#>>> Tsrh rh z kvm.

#Décryptage
print cipher(cipher(english_message))
#>>> This is a pen.

Je ne connaissais pas ce sujet, mais il semble s'appeler le code Atbash. http://www.mitsubishielectric.co.jp/security/learn/info/misty/stage1.html

Le code était également utilisé dans l'Ancien Testament. L'un d'eux est le code de translittération hébreu Atbash. Ce code est créé en numérotant les caractères et en échangeant l'ordre du début et l'ordre de la fin. Si vous souhaitez crypter les 26 lettres de l'alphabet, changez l'ordre de A à Z, B à Y, et ainsi de suite.

C'est pourquoi le cryptage et le décryptage peuvent être réalisés avec la même fonction. (Vous pouvez obtenir la chaîne d'origine en appliquant la même fonction deux fois).

Cliquez ici pour les fonctions intégrées utilisées.

Fonctions intégrées


str.isalpha()
str.islower()
ord()
chr()
unichr()

# http://docs.python.jp/2.6/library/functions.html#ord
# http://docs.python.jp/2.6/library/functions.html#chr
# http://docs.python.jp/2.6/library/functions.html#unichr
  1. 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.

python


import random

def random_shuffled_str(input_str):
    input_list = list(input_str)
    random.shuffle(input_list)
    result = ''.join(input_list)
    return result

def typoglycemia(sentence):
    str_list = sentence.split()
    result_list = [x[0]+ random_shuffled_str(x[1:-1]) +x[-1] if len(x) > 4 else x for x in str_list]
    return ' '.join(result_list)

message = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."

print typoglycemia(message)
#>>> I cunl'dot beveile that I cloud aallucty unsrndtead what I was rdaineg : the phaenmneol pweor of the huamn mind .

print typoglycemia(message)
#>>> I cu'dolnt bivelee that I cloud aculltay udetnnasrd what I was ridneag : the pheonaenml peowr of the hamun mind .

Lorsque vous souhaitez utiliser else dans la notation d'inclusion de la liste

python


if len(x) > 4 else x

Je vais l'amener à cette position ... Et aléatoire.shuffle.

http://docs.python.jp/2/library/random.html

random.shuffle(x[, random]) Mélanger la séquence x par modification directe. L'argument optionnel random est une fonction qui n'a pas d'arguments qui renvoient un nombre à virgule flottante aléatoire avec une plage de [0.0, 1.0); par défaut, cette fonction est random ().

Notez que même avec un len (x) assez petit, la séquence de x sera plus grande que la période de la plupart des générateurs aléatoires; cela signifie que la plupart des séquences ne seront pas générées pour de longues séquences. Veux dire

Recommended Posts

Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 1)
Réhabilitation des compétences Python et PNL à partir de «Knock 100 Language Processing 2015» (chapitre 2 deuxième semestre)
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 2 premier semestre)
100 traitements de langage avec Python
100 traitements de langage avec Python (chapitre 3)
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 Language Processing Knock Chapitre 1 (Python)
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
100 Language Processing Knock Chapitre 1 par Python
Après avoir effectué 100 traitements de langage en 2015, j'ai acquis beaucoup de compétences de base en Python Chapitre 1
J'ai fait 100 traitements linguistiques Knock 2020 avec GiNZA v3.1 Chapitre 4
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
[Chapitre 6] Introduction à scicit-learn avec 100 coups de traitement du langage
Apprenez facilement 100 traitements linguistiques Knock 2020 avec "Google Colaboratory"
100 traitement de la langue knock-42: Affichage de la phrase de la personne concernée et de la personne concernée
100 langage de traitement knock-70 (en utilisant Stanford NLP): Obtention et formatage des données
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
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 5: Analyse des dépendances
10 fonctions du "langage avec batterie" python
100 Traitement du langage Knock 2020 Chapitre 7: Vecteur de mots
100 Language Processing Knock 2020 Chapitre 8: Neural Net
100 traitement du langage knock-59: analyse de la formule S
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 1
100 Language Processing Knock 2020 Chapitre 1: Mouvement préparatoire
Coexistence de Python2 et 3 avec CircleCI (1.0)
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)
Comparaison de vitesse du traitement de texte intégral de Wiktionary avec F # et Python
Bases du traitement d'images binarisées par Python
Traitement d'image par Python 100 knock # 10 filtre médian
Réponses et impressions de 100 chocs de traitement linguistique - Partie 1
Traitement du langage 100 knocks-44: Visualisation des arbres dépendants
Réponses et impressions de 100 chocs de traitement de la langue - Partie 2
100 Language Processing Knock-26: suppression du balisage accentué
100 Language Processing Knock-71 (en utilisant Stanford NLP): Stopword
3. Traitement du langage naturel par Python 2-1. Réseau de co-occurrence
Traitement d'image par Python 100 knock # 12 motion filter
3. Traitement du langage naturel par Python 1-1. Word N-gram
Dessin avec Matrix-Reinventor of Python Image Processing-
[Programmeur nouveau venu "100 language processing knock 2020"] Résoudre le chapitre 1
Traitement du langage 100 knocks-88: 10 mots à haute similitude
J'ai 0 ans d'expérience en programmation et je défie le traitement des données avec python