Démarrer avec Python avec 100 coups sur le traitement du langage

Cet article s'adresse à ceux qui veulent commencer le traitement du langage naturel avec Python, avec un peu de compréhension de C mais peu de connaissances de Python. Nous visons la voie la plus courte pour résoudre le chapitre 1 de 100 Language Processing Knock 2015, qui est célèbre comme une introduction au traitement du langage naturel. .. (PostScript 4/8: le chapitre 1 est le même pour la version 2020)

Il existe déjà de nombreux articles sur cet exemple de réponse Qiita de 100 coups, mais l'explication n'est pas si complète et j'ai pensé que ce serait difficile pour les débutants en Python, j'ai donc écrit cet article.

La documentation officielle pour Python est assez gentille, et je pense que vous pouvez étudier par vous-même en lisant le Tutoriel, mais dans cet article Je voudrais toucher uniquement les questions nécessaires pour résoudre 100 coups.

Installation

faisons de notre mieux. $ brew install python3 pour MacOS, $ sudo apt install python3.7 python3.7-dev pour Ubuntu

Sous Windows ordinaire, il semble facile de se référer à Installation de Python (Win10).

(Il peut s'agir de Google Colaboratory.)

Exécuter du code en mode interactif

C'est OK si Python3 peut être démarré en tapant une commande telle que $ python3 ou $ python3.7 sur la ligne de commande. Python est maintenant prêt à fonctionner en mode interactif. Dans ce mode, si vous entrez une expression et appuyez sur Entrée, le résultat de l'évaluation de l'expression sera renvoyé.

>>> 1+2
3

L'une des fonctionnalités de Python est le "typage dynamique". Contrairement à C, vous n'avez pas besoin de déclarer le type de la variable, et le type entier (int) devient le type à virgule flottante (float).

>>> a = 1
>>> a = 5/2
>>> a
2.5

Type intégré

Tout d'abord, voyons quels types (types intégrés) peuvent être utilisés dans le standard Python. Les types numériques tels que int et float mentionnés dans l'exemple ci-dessus sont l'un d'entre eux. Dans le chapitre 1 de 100 coups, vous pouvez le résoudre si vous ne connaissez que les types suivants.

Type de chaîne (str)

Puisque nous traiterons la langue, nous commencerons par le type de chaîne de caractères. Pour écrire une chaîne en Python, placez-la simplement entre ' ou " ! Le japonais est parfait. Vous pouvez facilement combiner des chaînes.

>>> "Bienvenue"

'Bienvenue'

>>> 'hoge' + 'fuga'
'hogefuga'

--Peut être accédé par des indices, comme un tableau C

>>> word = 'Python'
>>> word[0]
'P'
>>> word[-1]
'n'
>>> word[1:4]
'yth'
>>> word[2:-1]
'tho'
>>> word[:2]
'Py'
>>> word[2:]
'thon'

--Avec word [i: j: k], vous pouvez obtenir les éléments de ʻith à moins de jth par k`

>>> word[1:5:2]
'yh'
>>> word[::2]
'Pto'
>>> word[::-2]
'nhy'

100 coups 00, 01

Faisons pleinement usage des tranches.

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

Voici un exemple de réponse.

nlp00.py


word = 'stressed'
word[::-1]
'desserts'

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.

Voici un exemple de réponse.

nlp01.py


word = 'Patatoku Cassie'
word[::2]

«Patcar»

Type de liste

Si vous considérez le type de liste comme une version sous tension du tableau appris en C, ce n'est pas grave. Écrivez comme suit.

squares = [1, 4, 9, 16, 25]

Écrivez une liste vide comme suit:

empty = []

Le type de liste peut être indexé et découpé de la même manière que le type de chaîne. Ces types intégrés sont collectivement appelés ** types de séquence **.

>>> squares[:3]
[1, 4, 9]

Méthode

En Python, il existe des fonctions dédiées à chaque type de données, appelées ** méthodes **. Par exemple, la méthode ʻappenddu type liste ajoute un élément à la liste. Pour l'appeler, écrivezlist.append ()` comme suit.

>>> squares.append(36)
>>> squares
[1, 4, 9, 16, 25, 36]

Je vais également présenter quelques méthodes de type chaîne. --x.split (sep) : Crée une liste en séparant la chaîne" x "par" sep ". --sep.join (list) : Crée une chaîne qui combine les éléments de list avec sep --x.strip (chars) : Renvoie la chaîne avec chars supprimée des deux extrémités de la chaîne --x.rstrip (chars) : Renvoie la chaîne avec chars supprimée du bord droit de la chaîne

** * Lorsque les arguments de split (), strip () et rstrip () sont omis, cela signifie "tout caractère vide" **

>>> 'I have a pen.'.split(' ')
['I', 'have', 'a', 'pen.']
>>> ' '.join(['I', 'have', 'a', 'pen.'])
'I have a pen.'

Il peut être un peu difficile de se rappeler que join () est une méthode de type chaîne plutôt qu'une méthode de type liste. Pour résumer stack overflow, chaque élément de la liste n'est pas une chaîne Parce que ce n'est pas applicable.

>>> 'ehoge'.strip('e')
'hog'
>>> 'ehoge'.rstrip('e')
'ehog'
>>> 'ehoge'.rstrip('eg') #Moyens de supprimer e ou g du bord droit autant que possible
'eho'

pour déclaration

Maintenant que vous comprenez la liste, traitons de l'instruction for utilisée pour répéter quelque chose. Par exemple, lors du calcul de la somme des éléments d'un tableau en C, j'ai écrit comme suit.

int i;
int squares[6] = {1, 4, 6, 16, 25, 36};
int total = 0;
for(i = 0; i < 6; i++) {
    total += squares[i];
}

L'instruction Python for ressemble à ceci.

total = 0
for square in squares:
    total += square

Chaque boucle prend un élément de «carrés» et l'assigne à «carré». En d'autres termes, square = 1, square = 4 ,,, et ainsi de suite. La formalisation de l'instruction for ressemble à ceci.

Variables de la liste qui représentent l'élément for: Contenu de traitement TAB

Immédiatement après, ʻin est trompé comme "liste", mais c'est OK même s'il s'agit d'un type de chaîne de caractères (car chaque caractère peut être considéré comme un élément d'une chaîne de caractères). Le nom générique des choses qui peuvent être placées immédiatement après ʻin dans l'instruction for est ** itérable.

L'indentation était facultative en C, mais obligatoire en Python!

Fonctions intégrées

print() Voyons en fait la valeur de la variable dans la boucle for. En mode interactif, la fonction print () est utilisée car elle n'évalue pas les variables dans le bloc for et affiche les valeurs. Les arguments sont générés par défaut même s'ils ne sont pas de type chaîne. Vous pouvez l'utiliser sans faire quelque chose comme # include en C. Ces fonctions sont appelées ** fonctions intégrées **.

for square in squares:
    print(square)

1
4
9
16
25
36

Comme vous pouvez le voir, la fonction print () de Python coupe automatiquement les lignes (par défaut). Pour éviter les sauts de ligne, spécifiez l'argument optionnel ʻend` comme suit.

for square in squares:
    print(square, end=' ')

1 4 9 16 25 36 

len() Je vais présenter des fonctions intégrées utiles. len () renvoie la longueur d'une liste, d'une chaîne, etc.

>>> len(squares)
6
>>> len('AIUEO')
5

range()

range () est généralement utilisé lorsque vous voulez faire pivoter l'instruction for n fois.

for i in range(3):
    print(i)
0
1
2
>>> range(3)
range(0, 3)
>>> list(range(4))
[0, 1, 2, 3]

100 coups 02

Essayons également d'enregistrer le code source dans un fichier et de l'exécuter. Par exemple, si vous enregistrez un fichier avec juste print ('Hello World') comme hello.py et tapez $ python3 hello.py sur la ligne de commande, il devrait afficher" Hello World ". .. Continuons avec 100 coups.

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

Faisons tout ce que nous avons appris jusqu'à présent. Voici un exemple de réponse.

nlp02.py


str_a = 'Voiture Pat'
str_b = 'Taxi'
for i in range(len(str_a)):
    print(str_a[i]+str_b[i], end='')

Patatoku Kashii

Dans un tel cas, vous pouvez l'écrire plus facilement en utilisant la fonction intégrée zip (). Cette fonction associe le i-ième élément de l'objet itérable argument.

>>> list(zip(str_a, str_b))

[('Pa', 'Ta'), ('À', 'Ku'), ('Ka', 'Shi'), ('ー', 'ー')]

Ainsi, le code ci-dessus peut être réécrit comme: C'est une fonction très fréquemment utilisée.

for a, b in zip(str_a, str_b):
    print(a+b, end='')

Patatoku Kashii

Au fait, cela semble vouloir dire resserrer la fermeture à glissière, quel que soit le format de fichier ZIP.

Type de tuple

Si vous ne pensez pas «Qu'est-ce que cette virgule?» Après avoir vu l'explication ci-dessus, ignorez cette section et résolvez la question 03.

L'objet que ce zip () récupère dans chaque boucle est comme une liste avec str_a [i] et str_b [i] comme éléments. Pour être correct, c'est un taple, une version immuable de la liste.

Puisque tapple est une sorte de séquence, l'accès en indice est possible, mais les éléments ne peuvent pas être ajoutés avec ʻappend () `etc. En Python, ce qui peut être changé est appelé mutable, et ce qui ne peut pas être changé est appelé immuable. Je suis passé par là, mais les listes sont mutables et les chaînes et les taples sont immuables.

>>> a = 'abc'
>>> a[1] = 'a'
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-56-ae17b2fd35d6> in <module>
      1 a = 'abc'
----> 2 a[1] = 'a'


TypeError: 'str' object does not support item assignment
>>> a = [0, 9, 2]
>>> a[1] = 1
>>> a
[0, 1, 2]

Le taple est décrit en l'enfermant dans (), mais normalement le () extérieur n'est pas nécessaire (il ne peut pas être omis à l'intérieur du () où l'argument de la fonction est écrit).

>>> 1, 2, 3
(1, 2, 3)

Méthode de substitution appelée pack taple et décompression séquentielle

En utilisant la spécification qui peut être décrite en omettant le () du taple, attribuer plusieurs valeurs séparées par , à une variable s'appelle un taple pack. En revanche, l'affectation d'une séquence à plusieurs variables à la fois est appelée déballage de séquence.

>>> a = 'a'
>>> b = 'b'
>>> t = a, b
>>> t
('a', 'b')
>>> x, y = t
>>> print(x)
>>> print(y)
a
b

La rue latérale est devenue longue, mais maintenant je sais ce qu'est pour a, b dans zip (str_a, str_b): est. Les taples renvoyés par la fonction zip dans chaque boucle sont décompressés dans les variables a et b.

100 coups 03

Faisons le.

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

Ce problème, les points et les virgules ne sont pas alphabétiques et doivent être supprimés pour obtenir un rapport circonférentiel.

Voici un exemple de réponse.

nlp03.py


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

Il existe en fait une meilleure façon de l'écrire (inclusion de liste), mais ce n'est pas grave si vous ne l'avez pas vu à ce stade.


ans = [len(word.rstrip('.,')) for word in words]

Type de dictée

Dans les chaînes et les listes, nous avons utilisé des indices, c'est-à-dire une plage d'entiers, pour accéder aux éléments, mais les types de dictionnaire sont accessibles avec une "clé" que nous définissons. Par exemple, puisque vous souhaitez mémoriser le nombre d'occurrences d'un certain mot, vous pouvez créer un dictionnaire avec la clé comme mot et la valeur comme nombre d'occurrences. L'objet dictionnaire est défini comme suit et la valeur est récupérée. Vous pouvez également ajouter facilement des paires clé / valeur à votre dictionnaire.

>>> dic = {'I':141, 'you':112}
>>> dic
{'I': 141, 'you': 112}
>>> dic['I']
141
>>> dic['have'] = 256
>>> dic
{'I': 141, 'you': 112, 'have': 256}

Type booléen

True ou False est renvoyé lorsqu'une équation ou une inégalité est évaluée.

>>> 1 == 1
True
>>> 1 == 2
False
>>> 1 < 2 <= 3
True

Vous pouvez inverser la valeur booléenne avec «not».

en arithmétique

ʻIn` sans pour détermine l'affiliation.

>>> 1 in [1, 2, 3]
True

Ceux pour lesquels des opérations ʻin` sont définies sont appelés ** types de conteneurs **. Les chaînes de caractères, les listes, les tapples et les dictionnaires sont tous des types de conteneurs.

if déclaration

Notez que l'instruction Python if est similaire à C, mais ʻelif au lieu de ʻelse if.

if 1==2:
    print('hoge')
elif 1==3:
    print('fuga')
else:
    print('bar')
bar

100 coups 04

Tirons pleinement parti de ce que nous avons appris jusqu'à présent.

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.

Voici un exemple de réponse.

nlp04.py


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

i = 1
ans = {}
for word in words:
    if i in positions:
        key = word[0]
    else:
        key = word[:2]
    ans[key] = i
    i += 1

print(ans)
{'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}

(Quoi, Mi n'a pas de symbole d'élément? En premier lieu, la version anglaise de mon vaisseau est comme une porte de démon ...)

La fonction intégrée ʻenumerate () `ajoutera le nombre de boucles ensemble, ce qui facilitera l'écriture. Comme il commence à 0 lorsqu'il est utilisé normalement, l'argument optionnel «start = 1» est spécifié.

ans = {}
for i, word in enumerate(words, start=1):
    if i in where:
        key = word[0]
    else:
        key = word[:2]
    ans[key] = i

ʻEnumerate () est très pratique et souvent utilisé comme ça, alors assurez-vous de le savoir. En fait, il existe un moyen de changer les éléments de words en utilisant ʻenumerate () même dans [03](# 100 knock 03) (vous pouvez éviter de créer une nouvelle liste ʻans`). ..

Définition des fonctions, 100 coups 05

Ensuite, essayons 100 coups 05.

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

Si vous souhaitez définir votre propre fonction en python, vous pouvez écrire comme suit.

def function_name(argument): Traitement TAB

Le format de sortie n'est pas spécifié, mais écrivons un code qui sort comme suit, par exemple. [['i', 'am'], ['am', 'an], ['an', 'nlper']] Cela semble correct si vous créez une fonction qui prend une séquence et n comme arguments.

Voici un exemple de réponse.

def ngram(seq, n):
    lis = []
    for i in range(len(seq) - n + 1):
        lis.append(seq[i:i+n])
    return lis

Si vous l'avez fait jusqu'à présent, enregistrez-le dans un fichier nommé nlp05.py avec ce qui suit et exécutez $ python3 nlp05.py sur la ligne de commande.

nlp05.py


def ngram(seq, n):
    lis = []
    for i in range(len(seq) - n + 1):
        lis.append(seq[i:i+n])
    return lis


if __name__ == '__main__':
    sent = 'I am an NLPer'
    words = sent.split(' ')
    lis = ngram(words, 2)
    print(lis)
    lis = ngram(sent, 2)
    print(lis)

ʻSi name == La partie de '__ main__': ʻest nécessaire car elle sera importée dans le prochain problème. Ceux qui se demandent ne devraient pas écrire cette ligne une seule fois.

De plus, la fonction ngram a la solution alternative suivante, qui est plus rapide, mais l'explication est un peu longue, je vais donc l'omettre.

def ngram(seq, n):
    return list(zip(*(seq[i:] for i in range(n))))

Type d'ensemble, 100 coups 06

Vient ensuite 100 coups 06.

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.

Pour l'instant, exécutons le code suivant.

from nlp05 import ngram

x = set(ngram('paraparaparadise', 2))
print(x)
{'is', 'se', 'di', 'ap', 'ad', 'ar', 'pa', 'ra'}

La fonction ngram créée plus tôt dans la partie from nlp05 import ngram est" importée ".

Le type d'ensemble peut être défini manuellement comme x = {'pa', 'ar'}, mais il peut également être créé à partir d'autres objets itérables en utilisant set ().

L'ensemble de somme peut être calculé avec «|», le produit avec «&» et la différence avec «-».

Voici un exemple de réponse.

nlp06.py


from nlp05 import ngram

x = set(ngram('paraparaparadise', 2))
y = set(ngram('paragraph', 2))
print(x | y)
print(x & y)
print(x - y)
print(y - x)
print('se' in x)
print('se' in y)
{'is', 'se', 'di', 'ph', 'ap', 'ag', 'ad', 'ar', 'pa', 'gr', 'ra'}
{'ra', 'ap', 'pa', 'ar'}
{'is', 'se', 'ad', 'di'}
{'ag', 'gr', 'ph'}
True
False

Si vous appliquez cela en fonctionnement à une liste comme le problème 04, cela prendra O (n), utilisez-le donc comme type d'ensemble si possible.

Formatage des cordes, 100 coups 07

Résoudre 100 coups 07.

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.

Il est difficile de faire cela en combinant des chaînes de caractères avec «+». Il existe trois façons en Python.

format printf

>>> x = 12
>>> y = 'Température'
>>> '%A l'heure%s' % (x, y)

«Température de 12 heures»

str.format () (Python 2.6 ou version ultérieure)

>>> '{}de temps{}'.format(x, y)

«Température de 12 heures»

f-string (Python 3.6 ou version ultérieure)

>>> f'{x}de temps{y}'

«Température de 12 heures»

Lequel dois-je utiliser?

Fondamentalement, f-string est le plus simple. Cependant, les barres obliques inverses ne peuvent pas être utilisées dans {}. De plus, lors de la spécification du nombre de chiffres, le format printf semble être plus rapide (Référence) Avec cela, vous pouvez faire 07 sans aucune hésitation.

100 coups 08, 09

08 peut être fait en utilisant les fonctions intégrées ʻord () ʻetchr (), qui convertissent entre les caractères et les points de code. Vous pouvez utiliser des points de code pour déterminer la casse, ou vous pouvez utiliser str.islower (). Un point de code est comme un index de caractères sur un ordinateur. La conversion d'une chaîne d'octets en un point de code s'appelle décodage, et vice versa s'appelle encodage, et la correspondance entre eux est appelée code de caractère. Il peut être bon de connaître une telle histoire.

09 peut être fait en utilisant le shuffle () ou sample () du module random. Notez que shuffle () est une méthode qui détruit les données d'origine et n'a pas de valeur de retour. Bien sûr, n'oubliez pas d'importer.

en conclusion

Vous devriez maintenant pouvoir acquérir les bases de Python. En fait, je voulais gérer le contenu de la notation d'inclusion, de l'itérateur, du générateur, de l'expression lambda, du déballage de la liste d'arguments et de map (), mais je l'ai omis à cause du désir de couper l'intestin. Si vous êtes intéressé, veuillez le vérifier.

(Post-scriptum 4/25) [Chapitre 2] Introduction à Python avec 100 coups de traitement du langage a été publié! En utilisant les problèmes du chapitre 2, je vais expliquer certains des contenus que je voulais traiter ci-dessus, en plus des entrées / sorties de fichiers et des commandes Unix.

Recommended Posts

Démarrer avec Python avec 100 coups sur le traitement du langage
Premiers pas avec Python 3.8 sous Windows
1.1 Premiers pas avec Python
Premiers pas avec Python
Premiers pas avec Python
100 coups de traitement du langage avec Python 2015
Introduction aux fonctions Python
Premiers pas avec Python Django (1)
Premiers pas avec Python Django (4)
Premiers pas avec Python Django (3)
Introduction à Python Django (6)
Premiers pas avec Python Django (5)
[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
Premiers pas avec Python responder v2
100 traitements de langage avec Python
Premiers pas avec les applications Web Python
Premiers pas avec Python pour les classes PHPer
100 traitements de langage avec Python (chapitre 3)
Premiers pas avec Python Bases de Python
Traitement d'image avec la binarisation Python 100 knocks # 3
Commençant par USD sur Windows
100 traitement d'image par Python Knock # 2 Échelle de gris
Premiers pas avec les algorithmes génétiques Python
Premiers pas avec Python pour les fonctions PHPer
100 traitements linguistiques frappent 03 ~ 05
100 coups de traitement linguistique (2020): 32
100 coups de traitement linguistique (2020): 35
100 coups de traitement linguistique (2020): 47
100 coups de traitement linguistique (2020): 39
100 coups de traitement linguistique (2020): 22
100 coups de traitement linguistique (2020): 26
100 coups de traitement linguistique (2020): 34
100 coups de traitement linguistique (2020): 42
100 coups de traitement linguistique (2020): 29
100 coups de traitement linguistique (2020): 49
Le traitement de 100 langues frappe 06 ~ 09
100 coups de traitement linguistique (2020): 43
100 coups de traitement linguistique (2020): 24
100 coups de traitement linguistique (2020): 45
100 coups de traitement linguistique (2020): 10-19
100 coups de traitement linguistique (2020): 30
100 coups de traitement linguistique (2020): 00-09
100 coups de traitement linguistique (2020): 31
100 coups de traitement linguistique (2020): 48
100 coups de traitement linguistique (2020): 44
100 coups de traitement linguistique (2020): 41
100 coups de traitement linguistique (2020): 37
100 coups de traitement linguistique (2020): 25
100 coups de traitement linguistique (2020): 23
100 coups de traitement linguistique (2020): 33
100 coups de traitement linguistique (2020): 20
100 coups de traitement linguistique (2020): 27
100 coups de traitement linguistique (2020): 46
100 coups de traitement linguistique (2020): 21
100 coups de traitement linguistique (2020): 36
Premiers pas avec python3 # 1 Apprenez les connaissances de base
Premiers pas avec Python Web Scraping Practice