[PYTHON] 100 Language Processing Knock: Chapitre 2 Principes de base des commandes UNIX (à l'aide de pandas)

"Chapitre 2: Principes de base des commandes UNIX" De Language Processing 100 Knock 2015 Il s'agit d'un enregistrement de ecei.tohoku.ac.jp/nlp100/#ch2). Le chapitre 2 est lié aux opérations sur les fichiers CSV. C'est un examen de ce que j'ai fait il y a plus d'un an. Au moment où je l'ai fait, je me suis dit "Je n'ai pas besoin d'utiliser des commandes UNIX, mais Python va bien", mais lorsqu'il s'agit de gros fichiers, les commandes UNIX sont généralement plus rapides. ** Les commandes UNIX méritent d'être rappelées **. Cette fois, j'utilise beaucoup de packages Pandas pour la partie Python. C'est vraiment pratique pour gérer des données matricielles telles que CSV.

environnement

type version Contenu
OS Ubuntu18.04.01 LTS Il fonctionne virtuellement
pyenv 1.2.15 J'utilise pyenv car j'utilise parfois plusieurs environnements Python
Python 3.6.9 python3 sur pyenv.6.J'utilise 9
3.7 ou 3.Il n'y a aucune raison profonde de ne pas utiliser la série 8
Les packages sont gérés à l'aide de venv

Chapitre 2: Principes de base des commandes UNIX

contenu de l'étude

Découvrez les outils UNIX utiles pour la recherche et l'analyse des données. Grâce à ces réimplémentations, vous ferez l'expérience de l'écosystème des outils existants tout en améliorant vos compétences en programmation.

head, tail, cut, paste, split, sort, uniq, sed, tr, expand

Contenu frappé

hightemp.txt enregistre la température la plus élevée au Japon en tant que «préfecture», «point» et «℃». Il s'agit d'un fichier stocké dans le format délimité par des tabulations de «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.

[010. Counting lines.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/02.UNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3 % 83% 89% E3% 81% AE% E5% 9F% BA% E7% A4% 8E / 010.% E8% A1% 8C% E6% 95% B0% E3% 81% AE% E3% 82% AB% E3% 82% A6% E3% 83% B3% E3% 83% 88.ipynb)

En Python, il devrait être le plus rapide à lire à la fois avec readlines (je n'ai pas beaucoup vérifié).

Partie Python


print(len(open('./hightemp.txt').readlines()))

Résultat de sortie du terminal


24

wc est une abréviation de Word Count. Comptez le code de saut de ligne avec l'option -l. ** Les gros fichiers sont utiles car il faut du temps simplement pour les ouvrir avec un éditeur de texte **.

Partie Bash


wc hightemp.txt -l

Résultat de sortie du terminal


24 hightemp.txt

11. Remplacez les tabulations par des espaces

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

[011. Remplacez les onglets par spaces.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/02.UNIX%E3%82%B3%E3%83%9E%E3%83%B3% E3% 83% 89% E3% 81% AE% E5% 9F% BA% E7% A4% 8E / 011.% E3% 82% BF% E3% 83% 96% E3% 82% 92% E3% 82% B9 % E3% 83% 9A% E3% 83% BC% E3% 82% B9% E3% 81% AB% E7% BD% AE% E6% 8F% 9B.ipynb)

Remplacez en utilisant la fonction replace. J'utilise pprint car il est difficile de voir le résultat sans saut de ligne.

Partie Python


from pprint import pprint

with open('./hightemp.txt') as f:
    pprint([line.replace('\t', ' ')for line in f])

Résultat de sortie du terminal


['Préfecture de Kochi Egawasaki 41 2013-08-12\n',
 '40 Kumagai, Préfecture de Saitama.9 2007-08-16\n',
 '40 Tajimi, Préfecture de Gifu.9 2007-08-16\n',

Omission

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

sed peut remplacer des chaînes et supprimer des lignes. L'exécution de cette commande imprime uniquement le résultat sur le terminal, elle ne met pas à jour le contenu du fichier. J'ai fait référence à "[sed] Remplacer les chaînes de caractères et supprimer les lignes".

Partie Bash


sed 's/\t/ /g' ./hightemp.txt

Résultat de sortie du terminal


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

Omission

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

Enregistrez la 12.1ème colonne dans col1.txt et la 2è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.

[012.1 Enregistrez la première colonne dans col1.txt et la deuxième colonne dans col2.txt.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/02.UNIX%E3%82%B3%E3 % 83% 9E% E3% 83% B3% E3% 83% 89% E3% 81% AE% E5% 9F% BA% E7% A4% 8E / 012,1% E5% 88% 97% E7% 9B% AE% E3 % 82% 92col1.txt% E3% 81% AB% EF% BC% 8C2% E5% 88% 97% E7% 9B% AE% E3% 82% 92col2.txt% E3% 81% AB% E4% BF% 9D % E5% AD% 98.ipynb)

J'ai utilisé «Pandas». Les colonnes à lire par le paramètre ʻusecols` sont limitées aux 1ère et 2ème colonnes. C'est pratique.

Partie Python


import pandas as pd

df = pd.read_table('./hightemp.txt', header=None, usecols=[0, 1])
df[0].to_csv('012.col1.txt',index=False, header=False)
df[1].to_csv('012.col2.txt',index=False, header=False)

Vérifiez le contenu avec «cut». J'ai fait référence à "[cut] command-cut out from a line in fixed length or field units".

Partie Bash


cut -f 1 ./hightemp.txt
cut -f 2 ./hightemp.txt

Résultat de sortie du terminal(1ère rangée)


Préfecture de Kochi
Saitama
Préfecture de Gifu

Omission

Préfecture de Yamanashi
Préfecture de Yamagata
Préfecture d'Aichi

Résultat de sortie du terminal(2e rangée)


Egawazaki
Kumagai
Tajimi
Yamagata

Omission

Otsuki
Tsuruoka
Nagoya

Fusionner 13.col1.txt et col2.txt

Combinez les col1.txt et col2.txt créés en 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.

[Merge 013.col1.txt et col2.txt.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/02.UNIX%E3%82%B3%E3%83%9E%E3% 83% B3% E3% 83% 89% E3% 81% AE% E5% 9F% BA% E7% A4% 8E / 013.col1.txt% E3% 81% A8col2.txt% E3% 82% 92% E3% 83% 9E% E3% 83% BC% E3% 82% B8.ipynb)

J'ai lu deux fichiers avec pandas et les ai connectés.

Partie Python


import pandas as pd

result = pd.read_csv('012.col1.txt', header=None)
result[1] = pd.read_csv('012.col2.txt', header=None)

result.to_csv('013.col1_2.txt', index=False, header=None, sep='\t')

J'ai fait référence à "Paste command summary [Linux command collection]". Le résultat de sortie est omis.

Partie Bash


paste 012.col1.txt 012.col2.txt

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.

[014. Sortie de N lignes depuis le début.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/02.UNIX%E3%82%B3%E3%83%9E%E3%83%B3 % E3% 83% 89% E3% 81% AE% E5% 9F% BA% E7% A4% 8E / 014.% E5% 85% 88% E9% A0% AD% E3% 81% 8B% E3% 82% 89N% E8% A1% 8C% E3% 82% 92% E5% 87% BA% E5% 8A% 9B.ipynb)

La fonction «input» reçoit l'argument.

Partie Python


from pprint import pprint

n = int(input('N Lines--> '))

with open('hightemp.txt') as f:
    for i, line in enumerate(f):
        if i < n:
            pprint(line)
        else:
            break

Résultat de sortie du terminal


'Préfecture de Kochi\t Egawasaki\t41\t2013-08-12\n'
'Saitama\t Kumagai\t40.9\t2007-08-16\n'
'Préfecture de Gifu\t Tajimi\t40.9\t2007-08-16\n'

Je me suis référé au "Résumé détaillé de la commande head affiché depuis le début du fichier [Linux command collection]".

Partie Bash


head hightemp.txt -n 3

Résultat de sortie du terminal


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

15. Sortir les N dernières lignes

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

[015. Sortir les N dernières lignes.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/02.UNIX%E3%82%B3%E3%83%9E%E3%83%B3 % E3% 83% 89% E3% 81% AE% E5% 9F% BA% E7% A4% 8E / 015.% E6% 9C% AB% E5% B0% BE% E3% 81% AEN% E8% A1% 8C% E3% 82% 92% E5% 87% BA% E5% 8A% 9B.ipynb)

C'était assez déroutant. Je ne voulais pas lire tous les éléments lorsque le fichier était volumineux, donc après avoir vérifié tous les éléments avec le paquet Linux head, linecache package Je pensais que j'utiliserais .html), mais si c'est le cas, tail est très bien. J'ai fini par utiliser «readlines».

Partie Python


from pprint import pprint

n = int(input('N Lines--> '))

with open('hightemp.txt') as f:
    pprint(f.readlines()[-n:])

Résultat de sortie du terminal


['Préfecture de Yamanashi\t Otsuki\t39.9\t1990-07-19\n',
 'Préfecture de Yamagata\t Tsuruoka\t39.9\t1978-08-03\n',
 'Préfecture d'Aichi\t Nagoya\t39.9\t1942-08-02\n']

Partie Bash


tail hightemp.txt -n 3

Résultat de sortie du terminal


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

16. Divisez le fichier en N

Recevez le nombre naturel N au moyen d'arguments de ligne de commande et divisez le fichier d'entrée en N ligne par ligne. Réalisez le même traitement avec la commande de fractionnement.

[016. Divisez le fichier en N.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/02.UNIX%E3%82%B3%E3%83%9E%E3%83%B3% E3% 83% 89% E3% 81% AE% E5% 9F% BA% E7% A4% 8E / 016.% E3% 83% 95% E3% 82% A1% E3% 82% A4% E3% 83% AB % E3% 82% 92N% E5% 88% 86% E5% 89% B2% E3% 81% 99% E3% 82% 8B.ipynb)

Le quotient est arrondi à l'aide de la fonction ceil du package math. L'écriture de fichier est ajoutée en une seule fois avec la fonction writelines.

Partie Python


import math

n = int(input('N spilits--> '))

with open('./hightemp.txt') as f:
    lines = f.readlines()

unit = math.ceil(len(lines) / n)

for i in range(0, n):
    with open('016.hightemp{}.txt'.format(i), 'w') as out_file:
        out_file.writelines(lines[i*unit:(i+1)*unit])

J'ai fait référence à «[split] command-split files».

Partie Bash


split -n 3 -d hightemp.txt 016.hightemp-u

Différence de chaîne de caractères dans la première colonne

Recherchez le type de chaîne de caractères dans la première colonne (un ensemble de chaînes de caractères différentes). Utilisez les commandes sort et uniq pour confirmation.

[017. Différence dans la chaîne de caractères dans la première colonne.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/02.UNIX%E3%82%B3%E3%83%9E%E3%83 % B3% E3% 83% 89% E3% 81% AE% E5% 9F% BA% E7% A4% 8E / 017.% EF% BC% 91% E5% 88% 97% E7% 9B% AE% E3% 81% AE% E6% 96% 87% E5% AD% 97% E5% 88% 97% E3% 81% AE% E7% 95% B0% E3% 81% AA% E3% 82% 8A.ipynb)

J'ai utilisé la fonction «pandas» «unique». pandas rend ce type de traitement très facile.

Partie Python


import pandas as pd

df = pd.read_table('hightemp.txt', header=None, usecols=[0])

print(df[0].unique())

Résultat de sortie du terminal


['Préfecture de Kochi' 'Saitama' 'Préfecture de Gifu' 'Préfecture de Yamagata' 'Préfecture de Yamanashi' 'Préfecture de Wakayama' 'Préfecture de Shizuoka' 'Préfecture de Gunma' 'Préfecture d'Aichi' 'Préfecture de Chiba' 'Préfecture d'Ehime' 'Préfecture d'Osaka']

J'ai fait référence à "Un résumé détaillé de la commande de tri [collection de commandes Linux]".

Partie Bash


cut --fields=1 hightemp.txt | sort | uniq > result.txt

Résultat de sortie du terminal


Préfecture de Chiba
Préfecture de Wakayama
Saitama
Préfecture d'Osaka
Préfecture de Yamagata
Préfecture de Yamanashi
Préfecture de Gifu
Préfecture d'Ehime
Préfecture d'Aichi
Préfecture de Gunma
Préfecture de Shizuoka
Préfecture de Kochi

18. Trier chaque ligne par ordre décroissant de la valeur numérique dans la troisième colonne

Disposez chaque ligne dans l'ordre inverse des nombres de la troisième colonne (Remarque: réorganisez le contenu de chaque ligne sans changer) Utilisez la commande sort pour confirmation (ce problème ne doit pas nécessairement correspondre au résultat de l'exécution de la commande).

[018. Triez chaque ligne dans l'ordre décroissant des nombres de la troisième colonne.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/02.UNIX%E3%82%B3%E3%83%9E% E3% 83% B3% E3% 83% 89% E3% 81% AE% E5% 9F% BA% E7% A4% 8E / 018.% E5% 90% 84% E8% A1% 8C% E3% 82% 923 % E3% 82% B3% E3% 83% A9% E3% 83% A0% E7% 9B% AE% E3% 81% AE% E6% 95% B0% E5% 80% A4% E3% 81% AE% E9 % 99% 8D% E9% A0% 86% E3% 81% AB% E3% 82% BD% E3% 83% BC% E3% 83% 88.ipynb)

J'ai utilisé la fonction sort_values de pandas.

Partie Python


import pandas as pd

df = pd.read_table('hightemp.txt', header=None, usecols=[0])

print(df.sort_values(2, ascending=False))

Résultat de sortie du terminal


       0     1     2           3
0 Préfecture de Kochi Egawasaki 41.0  2013-08-12
2 Tajimi, préfecture de Gifu 40.9  2007-08-16
1 Kumagai 40, Préfecture de Saitama.9  2007-08-16

Omission

21 Préfecture de Yamanashi Otsuki 39.9  1990-07-19
22 Tsuruoka, préfecture de Yamagata 39.9  1978-08-03
23 Nagoya, Aichi 39.9  1942-08-02

Partie Bash


sort hightemp.txt -k 3 -n -r

Résultat de sortie du terminal


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

Omission

Toyonaka 39, Osaka.9	1994-08-08
39 Hatoyama, Préfecture de Saitama.9	1997-07-05
39 Shigehara, Chiba.9	2013-08-11

19. Trouvez la fréquence d'apparition de la première colonne de chaque ligne et classez-les par ordre décroissant de fréquence d'apparition

Trouvez la fréquence d'apparition de la première colonne de chaque ligne, et affichez-les par ordre décroissant. Utilisez les commandes cut, uniq et sort pour confirmation.

[019. Trouvez la fréquence d'apparition de la première colonne de chaque ligne et disposez-les par ordre décroissant de fréquence d'apparition.ipynb](https://github.com/YoheiFukuhara/nlp100/blob/master/02.UNIX%E3%82 % B3% E3% 83% 9E% E3% 83% B3% E3% 83% 89% E3% 81% AE% E5% 9F% BA% E7% A4% 8E / 019.% E5% 90% 84% E8% A1% 8C% E3% 81% AE1% E3% 82% B3% E3% 83% A9% E3% 83% A0% E7% 9B% AE% E3% 81% AE% E6% 96% 87% E5% AD% 97% E5% 88% 97% E3% 81% AE% E5% 87% BA% E7% 8F% BE% E9% A0% BB% E5% BA% A6% E3% 82% 92% E6% B1% 82% E3% 82% 81% EF% BC% 8C% E5% 87% BA% E7% 8F% BE% E9% A0% BB% E5% BA% A6% E3% 81% AE% E9% AB% 98% E3% 81% 84% E9% A0% 86% E3% 81% AB% E4% B8% A6% E3% 81% B9% E3% 82% 8B.ipynb)

J'ai utilisé la fonction «value_counts» de «pandas».

Partie Python


import pandas as pd

df = pd.read_table('hightemp.txt', header=None, usecols=[0])

print(df[0].value_counts(ascending=False))

Résultat de sortie du terminal


Préfecture de Saitama 3
Préfecture de Yamanashi 3
Préfecture de Yamagata 3

Omission

Préfecture d'Ehime 1
Préfecture de Kochi 1
Préfecture d'Osaka 1

Partie Bash


cut -f 1 hightemp.txt | sort | uniq -c | sort -r

Résultat de sortie du terminal


3 Préfecture de Gunma
3 Préfecture de Yamanashi
3 Préfecture de Yamagata

Omission

1 Préfecture d'Ehime
1 Préfecture d'Osaka
1 Préfecture de Wakayama

Recommended Posts

100 Language Processing Knock: Chapitre 2 Principes de base des commandes UNIX (à l'aide de pandas)
100 points de traitement du langage naturel Chapitre 2 Bases des commandes UNIX (première moitié)
100 Language Processing Knock 2020 Chapitre 2: Commandes UNIX
100 traitement du langage knock-31 (en utilisant des pandas): verbe
100 traitement du langage knock-38 (en utilisant des pandas): histogramme
100 traitement du langage knock-35 (utilisant des pandas): concaténation de nomenclature
100 Language Processing Knock-39 (en utilisant des pandas): la loi de Zipf
100 traitement de langage knock-34 (utilisant des pandas): "B of A"
100 Traitement du langage Knock Chapitre 1
100 Language Processing Knock 2020 Chapitre 3
100 Language Processing Knock 2020 Chapitre 2
100 langage de traitement knock-20 (à l'aide de pandas): lecture de données JSON
100 Language Processing Knock-32 (utilisant des pandas): Prototype de verbe
Traitement de 100 langues knock-98 (en utilisant des pandas): Clustering par méthode Ward
100 traitement du langage knock-99 (à l'aide de pandas): visualisation par t-SNE
100 traitement du langage knock-95 (en utilisant des pandas): Note avec WordSimilarity-353
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
100 traitement du langage knock-36 (en utilisant des pandas): fréquence d'occurrence des mots
100 Language Processing Knock-83 (en utilisant des pandas): Mesure de la fréquence des mots / contextes
100 Language Processing Knock-30 (en utilisant des pandas): lecture des résultats de l'analyse morphologique
100 Language Processing Knock 2015 Chapitre 5 Analyse des dépendances (40-49)
100 traitements de langage avec Python
100 Language Processing Knock Chapitre 1 en Python
100 Language Processing Knock 2020 Chapitre 9: RNN, CNN
100 traitement du langage knock-76 (en utilisant scicit-learn): étiquetage
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 3
100 traitements de langage avec Python (chapitre 3)
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
[Traitement du langage 100 coups 2020] Chapitre 2: Commandes UNIX
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 1
100 Language Processing Knock 2020 Chapitre 1: Mouvement préparatoire
100 traitement du langage knock-73 (en utilisant scikit-learn): apprentissage
100 Language Processing Knock Chapitre 1 par Python
100 Language Processing Knock 2020 Chapitre 3: Expressions régulières
100 Language Processing Knock 2015 Chapitre 4 Analyse morphologique (30-39)
100 traitement du langage knock-74 (en utilisant scicit-learn): prédiction
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 2
J'ai essayé 100 traitements linguistiques Knock 2020: Chapitre 4
100 Language Processing Knock-84 (en utilisant des pandas): Création d'une matrice de contexte de mots
100 traitement du langage knock-97 (en utilisant scicit-learn): clustering k-means
J'ai fait 100 traitements linguistiques Knock 2020 avec GiNZA v3.1 Chapitre 4
100 coups de traitement linguistique (2020): 28
J'ai essayé de résoudre 100 traitements linguistiques Knock 2020 version [Chapitre 2: Commandes UNIX 10 à 14]
100 Language Processing Knock-71 (en utilisant Stanford NLP): Stopword
100 traitements de langage avec Python (chapitre 2, partie 2)
100 traitements de langage avec Python (chapitre 2, partie 1)
100 coups de traitement linguistique (2020): 38
[Programmeur nouveau venu "100 language processing knock 2020"] Résoudre le chapitre 1
J'ai essayé de résoudre 100 traitements linguistiques Knock 2020 version [Chapitre 2: Commandes UNIX 15-19]
100 traitement de la langue frapper 00 ~ 02
100 traitement du langage knock-93 (en utilisant des pandas): calcul du taux de précision de la tâche d'analogie
100 traitement du langage knock-90 (en utilisant Gensim): apprendre avec word2vec
100 langage de traitement knock-79 (en utilisant scikit-learn): dessin de graphe avec rappel de précision
[Pandas] Principes de base du traitement des données de date à l'aide de dt
100 traitement du langage knock-75 (en utilisant scicit-learn): poids de l'identité