100 traitements de langage avec Python (chapitre 2, partie 1)

introduction

Knock 100 language processing publié sur la page Web du laboratoire Inui-Okazaki de l'Université de Tohoku pour la formation au traitement du langage naturel et Python. Je vais contester nlp100 /). Je prévois de prendre note du code implémenté et des techniques à supprimer. Le code sera également publié sur GitHub.

Ceci est une suite du Chapitre 1. Seulement ici, je pense qu'il serait bon d'insérer une petite explication des commandes UNIX ainsi que Python. Pour les options détaillées des commandes UNIX, consultez la commande man ou le site Web d'ITpro, et vous l'apprendrez correctement!

Chapitre 2: Principes de base des commandes UNIX

hightemp.txt est un fichier qui stocke l'enregistrement de la température la plus élevée au Japon dans le format délimité par des tabulations de «préfecture», «point», «℃» et «jour». Créez un programme qui effectue le traitement suivant et exécutez hightemp.txt en tant que fichier d'entrée. De plus, exécutez le même processus avec une commande UNIX et vérifiez le résultat de l'exécution du programme.

10. Compter le nombre de lignes

Comptez le nombre de lignes. Utilisez la commande wc pour confirmation.

Réponse en Python

10.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 10.py

import sys

f = open(sys.argv[1])
lines = f.readlines()
print(len(lines))

f.close()

Commentaires sur la réponse python

Puisque l'énoncé du problème dit "hightemp.txt comme fichier d'entrée", je l'ai conçu pour qu'il puisse prendre des arguments de ligne de commande en utilisant sys.argv. Au moment de l'exécution, il est réglé sur $ python 10.py high temp.txt, donc dans ce cas sys.argv [0] ==" 10.py ", sys.argv [1] ==" hightemp.txt " Cela signifie que la chaîne de caractères est stockée.

Concernant la lecture des fichiers

  1. f = open (nom de fichier)
  2. hoge = f.read() / f.readline() / f.readlines()
  3. f.close()

J'irai avec le courant. Les trois types de fonctions qui apparaissent dans 2 . Se comportent comme suit. Veuillez utiliser correctement si nécessaire.

Motif utilisant avec

Pour lire (écrire) un fichier, il existe une méthode d'écriture qui utilise «with» en plus de la méthode d'écriture qui implique «close ()» comme décrit ci-dessus. Il semble que cela soit recommandé pour éviter d'oublier d'ajouter close () et d'oublier de gérer les exceptions, qui sont courantes lors de l'utilisation de with. Le programme suivant est une réécriture d'essai de 10.py using with.

Lors de l'utilisation de la syntaxe with


#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 10.py

import sys

with open(sys.argv[1]) as f:
    lines = f.readlines()

print(len(lines))

Après cela, en principe, utilisez with pour lire et écrire des fichiers. Seulement si vous ne pouvez pas écrire avec with (y a-t-il?), Programmez à l'ancienne.

Réponse sous UNIX

$ wc -l hightemp.txt
      24 hightemp.txt

Commentaires sur les réponses UNIX

La commande wc affichera le nombre de lignes, de mots et d'octets dans le fichier. Si aucune option n'est spécifiée, elle sera sortie dans l'ordre suivant.

$ wc hightemp.txt 
      24      98     813 hightemp.txt

Les options sont «-l» pour le nombre de lignes, «-w» pour le nombre de mots et «-c» pour le nombre d'octets.

11. Remplacez les onglets par des espaces

Remplacez chaque onglet par un espace. Utilisez la commande sed, la commande tr ou la commande expand pour confirmation.

Réponse en Python

11.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 11.py

import sys

with open(sys.argv[1]) as f:
    str = f.read()

print(str.replace("\t", " "))

Commentaires sur Python Answers

Contrairement au précédent qui se concentrait sur les lignes, cette fois je veux juste remplacer les caractères à la fois, donc j'utilise simplement read (). La fonction replace () apparue dans le chapitre précédent remplace le caractère de tabulation (\ t) par un espace. ~~ Je n'aime pas les sauts de ligne supplémentaires laissés à la fin du résultat de sortie, mais c'est assez mignon ...? ~~ Par défaut, print () aura un saut de ligne à la fin. Pour éviter cela, dans Python 2, vous pouvez ajouter une virgule à la fin, comme print" hogehoge ",. Dans Python 3, vous pouvez spécifier le caractère à ajouter à la fin avec ʻend, tel que print ("hogehoge", end = "") , ainsi vous pouvez spécifier" "`.

Réponse sous UNIX

//version sed (notez que cela dépend de l'environnement)
$ sed -e s/$'\t'/" "/g hightemp.txt
// tr version
$ cat hightemp.txt | tr "\t" " "
// expand version
$ expand -t 1 hightemp.txt

//le résultat est le même
Préfecture de Kochi Egawasaki 41 2013-08-12
40 Kumagai, Préfecture de Saitama.9 2007-08-16
40 Tajimi, Préfecture de Gifu.9 2007-08-16
(Omis...)
Otsuki, Yamanashi 39.9 1990-07-19
39 Tsuruoka, Préfecture de Yamagata.9 1978-08-03
Préfecture d'Aichi Nagoya 39.9 1942-08-02

Commentaires sur les réponses UNIX

sed est une commande pratique qui peut gérer diverses modifications de caractères, mais à des fins limitées (remplacement de caractères) comme cette fois, il serait sage d'utiliser la commande ( tr) à cette fin. Au contraire, «développer» a des utilisations trop limitées, vous n'aurez donc peut-être pas la chance de le toucher.

12. Enregistrez la première colonne dans col1.txt et la deuxième colonne dans col2.txt

Enregistrez uniquement la première colonne de chaque ligne sous col1.txt et la deuxième colonne sous col2.txt. Utilisez la commande cut pour confirmation.

Réponse en Python

12.py


#! /usr/bin/env python
# -*- coding:utf-8 -*-
# 12.py

import sys


def write_col(source_lines, colunm_number, filename):
    col = []
    for line in source_lines:
        col.append(line.split()[colunm_number] + "\n")
    with open(filename, "w") as writer:
        writer.writelines(col)


with open(sys.argv[1]) as f:
    lines = f.readlines()

write_col(lines, 0, "col1.txt")
write_col(lines, 1, "col2.txt")


Commentaires sur Python Answers

J'en ai fait une fonction car il effectue un traitement similaire. Écrit la ligne spécifiée dans le 2ème argument de la liste reçue dans le 1er argument comme nom de fichier du 3ème argument. ʻAppend () `ajoute un caractère de saut de ligne pour améliorer l'apparence.

Je n'utilise aucune nouvelle technologie, je peux donc en parler beaucoup, mais je suis gêné que les algorithmes soient différents selon le programme ... Les détails seront décrits plus tard, mais ils sont affichés tels quels pour réflexion.

Réponse sous UNIX

$ cut -f 1 hightemp.txt
Préfecture de Kochi
Saitama
Préfecture de Gifu
(Omis...)
Préfecture de Yamanashi
Préfecture de Yamagata
Préfecture d'Aichi
$ cut -f 2 hightemp.txt
Egawazaki
Kumagai
Tajimi
(Omis...)
Otsuki
Tsuruoka
Nagoya

Commentaires sur les réponses UNIX

Comme avec Python, ce que nous faisons est de spécifier des champs (lignes) avec -f. Notez qu'en Python, il était basé sur zéro (ligne 0, ligne 1 ...), alors que dans les commandes UNIX, il était basé sur un (ligne 1, ligne 2 ...).

13. Fusionnez col1.txt et col2.txt

Combinez les col1.txt et col2.txt créés dans 12 pour créer un fichier texte dans lequel les première et deuxième colonnes du fichier d'origine sont disposées en tabulation. Utilisez la commande coller pour confirmation.

Réponse en Python

13.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 13.py

with open("col1.txt") as f1, open("col2.txt") as f2:
    lines1, lines2 = f1.readlines(), f2.readlines()

with open("merge.txt", "w") as writer:
    for col1, col2 in zip(lines1, lines2):
        writer.write("\t".join([col1.rstrip(), col2]))

Commentaires sur Python Answers

Je m'habitue à Python, j'ai donc écrit la première moitié de la partie lecture avec un peu de familiarité. C'est fort de pouvoir écrire comme ça. Pour la partie d'écriture dans la seconde moitié, j'ai essayé d'écrire en utilisant zip () comme révision du chapitre 1. Contrairement à 12., cette fois les deux caractères de saut de ligne restent à la fin de «col1 et col2», donc le caractère de saut de ligne à la fin de «col1» est supprimé par «rstrip ()».

Voici une revue et réécrit dans la notation d'inclusion.

Une fois réécrit par la notation d'inclusion


#S'il est entre parenthèses, il sera interprété correctement même si un saut de ligne se produit dans le code
with open("merge.txt", "w") as writer:
    writer.write(
        "\n".join(
            ["\t".join([col1.rstrip(), col2.rstrip()])
                for col1, col2 in zip(lines1, lines2)]
        )
    )
    

Comparaison du temps d'exécution

Depuis que diverses notations sont sorties, j'ai mesuré et comparé le temps d'exécution de chaque méthode en utilisant timeit.

Programme de mesure du temps d'exécution avec timeit


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 13_timeit.py

import timeit

#Prétraitement; col1,col2.Lire txt
s0 = """
with open("col1.txt") as f1, open("col2.txt") as f2:
    lines1, lines2 = f1.readlines(), f2.readlines()
"""

#mise en œuvre naïve;Ajouter des chaînes
s1 = """
merged_txt = ""
for i in xrange(len(lines1)):
    merged_txt = merged_txt + lines1[i].rstrip() + "\t" + lines2[i]

with open("merge.txt", "w") as writer:
    writer.write(merged_txt)
"""

#Implémentation avec zip
s2 = """
with open("merge.txt", "w") as writer:
    for col1, col2 in zip(lines1, lines2):
        writer.write("\t".join([col1.rstrip(), col2]))
"""

#Notation d'inclusion(connotation)Mise en œuvre par
# "\\n"Si vous n'écrivez pas, vous obtiendrez SyntaxError ... pourquoi?
s3 = """
with open("merge.txt", "w") as writer:
    writer.write(
        "\\n".join(
            ["\t".join([col1.rstrip(), col2.rstrip()])
                for col1, col2 in zip(lines1, lines2)]
        )
    )
"""

print("naive:", timeit.repeat(stmt=s1, setup=s0, number=100000))
print("zip:", timeit.repeat(stmt=s2, setup=s0, number=100000))
print("connotation:", timeit.repeat(stmt=s3, setup=s0, number=100000))

C'est le temps de calcul (en secondes) lorsque 100 000 tours de boucle sont effectués 3 fois (par défaut) par 3 types de méthodes. Selon le Document officiel, le temps d'exécution doit être évalué par la valeur minimale et non par la valeur moyenne ou maximale.

Résultat d'exécution


$ python 13_timeit.py
('naive:', [32.61601686477661, 47.96871089935303, 33.15881299972534])
('zip:', [49.846755027770996, 45.05450105667114, 58.70397615432739])
('connotation:', [46.472286224365234, 52.708040952682495, 46.71139121055603])

En conséquence, en termes de temps d'exécution uniquement, la méthode consistant simplement à ajouter des chaînes de caractères était la meilleure. Même si l'ordre est changé. En général, il semble que l'on puisse s'attendre à une accélération avec la notation d'inclusion, mais quelle est la frontière entre l'accélération et la non-accélération?

Réponse sous UNIX

$ paste col1.txt col2.txt 
Préfecture de Kochi Egawazaki
Kumagai, Préfecture de Saitama
Tajimi, préfecture de Gifu
(Omis...)
Préfecture de Yamanashi Otsuki
Tsuruoka, préfecture de Yamagata
Préfecture d'Aichi Nagoya

Commentaires sur les réponses UNIX

La commande paste concatène les fichiers horizontalement. Tab est le délimiteur par défaut, mais il peut être spécifié avec l'option -d.

14. Sortie de N lignes depuis le début

Recevoir le nombre naturel N au moyen d'un argument de ligne de commande et afficher uniquement les N premières lignes de l'entrée. Utilisez la commande head pour confirmation.

Réponse en Python

14.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 14.py

# Usage: python 14.py [filename] [number of lines]

import sys

with open(sys.argv[1]) as f:
    lines = f.readlines()

for line in lines[:int(sys.argv[2])]:
    print line,

Commentaires sur Python Answers

Au début, j'ai utilisé l'implémentation suivante en utilisant xrange (), mais

xrange()Implémentation utilisant


#Omission

for i in xrange(int(sys.argv[2])):
    print lines[i],

Si vous faites cela, ʻIndexErrorapparaîtra lorsque vous spécifiez un nombre qui dépasse le nombre de lignes dans le fichier, donc je pense qu'il serait sage d'implémenter en utilisant des tranches. Je pense que le problème est que la valeur d'entrée n'est pas vérifiée et que la gestion des erreurs n'est pas écrite en premier lieu ... Concernant la sortie, comme expliqué en 11., nous avons ajouté,à la fin de l'instructionprint` pour supprimer les sauts de ligne inutiles.

Réponse sous UNIX

$ head -3 hightemp.txt
Préfecture de Kochi Egawasaki 41 2013-08-12
40 Kumagai, Préfecture de Saitama.9	2007-08-16
40 Tajimi, Préfecture de Gifu.9	2007-08-16 

Commentaires sur les réponses UNIX

C'est également simple, vous pouvez spécifier le nombre de lignes en option.

15. Sortez les N dernières lignes

Recevoir le nombre naturel N au moyen d'un argument de ligne de commande et n'afficher que les N dernières lignes de l'entrée. Utilisez la commande tail pour confirmation.

Réponse en Python

15.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 15.py

import sys

with open(sys.argv[1]) as f:
    lines = f.readlines()

for line in lines[len(lines) - int(sys.argv[2]):]:
    print line,

Commentaires sur Python Answers

C'est presque le même que les 14 précédents. Bien que la spécification de tranche soit légèrement compliquée.

Réponse sous UNIX

$ tail -3 hightemp.txt

Otsuki, Yamanashi 39.9	1990-07-19
39 Tsuruoka, Préfecture de Yamagata.9	1978-08-03
Préfecture d'Aichi Nagoya 39.9	1942-08-02

Commentaires sur les réponses UNIX

Presque la même chose que «head».

en conclusion

Comme il est devenu long, j'ai divisé l'article sur le chapitre 2. Passez au chapitre 2, partie 2.

Recommended Posts

100 traitements de langage avec Python (chapitre 2, partie 2)
100 traitements de langage avec Python (chapitre 2, partie 1)
100 traitements de langage avec Python
100 coups de traitement du langage avec Python 2015
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 Language Processing Knock Chapitre 1 en Python
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
J'ai fait 100 traitements linguistiques Knock 2020 avec GiNZA v3.1 Chapitre 4
Traitement d'image avec Python (partie 2)
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
Réhabilitation des compétences Python et PNL à partir de "100 Language Processing Knock 2015" (Chapitre 1)
[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 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 10: Traduction automatique (90-98)
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)
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 1
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)
100 coups de traitement linguistique (2020): 28
100 coups de traitement linguistique (2020): 38
100 traitement de la langue frapper 00 ~ 02
Traitement d'image par Python 100 knock # 10 filtre médian
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)
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
[Programmeur nouveau venu "100 language processing knock 2020"] Résoudre le chapitre 1
Traitement du langage 100 knocks-88: 10 mots à haute similitude
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]
100 coups de traitement du langage amateur: 17
100 traitements linguistiques Knock 2020 [00 ~ 49 réponse]
Python: traitement du langage naturel
100 coups de traitement du langage ~ Chapitre 1
100 coups de langue amateur: 07
Traitement d'image avec Python
100 coups de traitement du langage amateur: 09
100 coups en traitement du langage amateur: 47
Traitement 100 langues knock-53: Tokenisation