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.
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.)
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
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.
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'
th à moins de
jth avec
word [i: j]`
--Si vous omettez «i» ou «j», cela signifie «fin».>>> 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'
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»
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]
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, écrivez
list.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'
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!
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]
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.
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)
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.
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]
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}
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».
ʻ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.
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
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`). ..
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))))
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.
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.
>>> x = 12
>>> y = 'Température'
>>> '%A l'heure%s' % (x, y)
«Température de 12 heures»
>>> '{}de temps{}'.format(x, y)
«Température de 12 heures»
>>> f'{x}de temps{y}'
«Température de 12 heures»
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.
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.
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