[PYTHON] 100 Sprachverarbeitung Knock UNIX-Befehle in Kapitel 2

Einführung

Ich löse 100 Klopfen bei der Sprachverarbeitung in einer Lernsitzung, die sich auf interne Mitglieder, aber den Antwortcode und die Lösung konzentriert Dies ist eine Zusammenfassung der Tricks, die ich dabei nützlich fand. Der größte Teil des Inhalts wurde von mir selbst untersucht und verifiziert, enthält jedoch auch Informationen, die von anderen Mitgliedern der Studiengruppe geteilt wurden.

Dieses Mal werde ich die Grundlagen der UNIX-Befehle zusammenfassen, aber die vorhergehenden @ moriwo und @segavvy Der Artikel segavvy / items / fb50ba8097d59475f760) enthält bereits eine ziemlich ausführliche Erklärung, daher möchte ich die Erklärung in diesem Artikel leicht konservativ halten. Wenn Sie nach dem Lesen der folgenden Fragen Fragen haben, wird empfohlen, die Artikel beider Parteien über den obigen Link zu lesen.

Serie

Umgebung

Code

10. Zählen der Anzahl der Zeilen

Python


def count_lines():
    with open('hightemp.txt') as file:
        return len(file.readlines())

count_lines()

Ergebnis (Python)


24

UNIX


!wc -l hightemp.txt

Ergebnis (UNIX)


      24 hightemp.txt

Der UNIX-Befehl war überwiegend präzise. Übrigens wird das ! Vor dem wc verwendet, wenn UNIX-Befehle in JupyterLab oder Notebook ausgeführt werden (in einigen Fällen funktioniert es ohne das !).

11. Ersetzen Sie die Registerkarten durch Leerzeichen

Python


def replace_tabs():
    with open('hightemp.txt') as file:
        return file.read().replace('\t', ' ')
    
print(replace_tabs())

UNIX


!cat hightemp.txt | sed $'s/\t/ /g'

Ergebnis (gemeinsam für Python und UNIX)


Präfektur Kochi Egawasaki 41 2013-08-12
40 Kumagai, Präfektur Saitama.9 2007-08-16
40 Tajimi, Präfektur Gifu.9 2007-08-16
Yamagata 40 Yamagata.8 1933-07-25
Präfektur Yamanashi Kofu 40.7 2013-08-10
...

In Bezug auf das UNIX-Symbol "sed" sollte beachtet werden, dass das "\ t" nicht als Tabulator-Symbol erkannt wird, es sei denn, das "$" -Symbol wird hinzugefügt.

12. Speichern Sie die erste Spalte in col1.txt und die zweite Spalte in col2.txt

Python


import pandas as pd

def separate_columns():
    df = pd.read_csv('hightemp.txt', sep='\t', header=None)
    df.iloc[:,0].to_csv('col1.txt', header=False, index=False)
    df.iloc[:,1].to_csv('col2.txt', header=False, index=False)

separate_columns()

UNIX


!cut -f 1 hightemp.txt > col1_unix.txt
!cut -f 2 hightemp.txt > col2_unix.txt

Wenn Sie das Ergebnis mit ! Head col1.txt col2.txt überprüfen, sieht es wie folgt aus. Gleiches gilt, wenn ! Head col1_unix.txt col2_unix.txt verwendet wird.

Ergebnis (Python)


==> col1.txt <==
Präfektur Kochi
Saitama
...
==> col2.txt <==
Egawazaki
Kumagai
...

13. Führen Sie col1.txt und col2.txt zusammen

Python


def merge_columns():
    with open('col1.txt') as col1_file, open('col2.txt') as col2_file, \
         open('merge.txt', mode='w') as new_file:
        
        for col1_line, col2_line in zip(col1_file, col2_file):
            new_file.write(f'{col1_line.rstrip()}\t{col2_line.rstrip()}\n')

merge_columns()

UNIX


!paste col[1-2].txt > merge_unix.txt

Ergebnis (gemeinsam für Python und UNIX)


Präfektur Kochi Egawazaki
Kumagai, Präfektur Saitama
Tajimi, Präfektur Gifu
Präfektur Yamagata Yamagata
...

Um das Ergebnis zu überprüfen, verwenden Sie ! Head merge.txt oder! Head merge_unix.txt und Sie sollten die obige Ausgabe erhalten.

14. Geben Sie N Zeilen von Anfang an aus

Python


def show_head():
    n = int(input())

    with open('hightemp.txt') as file:
        for line in file.readlines()[:n]:
            print(line.rstrip())
    
show_head()

UNIX


!head -3 hightemp.txt

Ergebnis (gemeinsam für Python und UNIX)


Präfektur Kochi Egawasaki 41 2013-08-12
40 Kumagai, Präfektur Saitama.9	2007-08-16
40 Tajimi, Präfektur Gifu.9	2007-08-16

Wenn Sie für Python eine Liste von einer Funktion zurückgeben möchten, schreiben Sie möglicherweise Folgendes:

Python


def show_head():
    n = int(input())

    with open('hightemp.txt') as file:
        return [line for line in file.readlines()[:n]]
    
print(*show_head())

Andererseits ist es unter UNIX schwierig, eine Ganzzahl in der Befehlszeile wie Python zu empfangen. Sie können jedoch angeben, wie viele Zeilen angezeigt werden sollen, indem Sie eine Ganzzahl nach - schreiben. Als angewandte Verwendung zum Beispiel am Ende der Antwort von "12"

UNIX


!cat hightemp.txt | sed $'s/\t/ /g' | head -5

Sie können auch nur die ersten 5 Zeilen schreiben und anzeigen.

15. Geben Sie die letzten N Zeilen aus

Python


def show_tail():
    n = int(input())

    with open('hightemp.txt') as file:
        return [line for line in file.readlines()[-n:]]

print(*show_tail())

UNIX


!tail -3 hightemp.txt

Ergebnis (gemeinsam für Python und UNIX)


Otsuki, Yamanashi 39.9	1990-07-19
39 Tsuruoka, Präfektur Yamagata.9	1978-08-03
Präfektur Aichi Nagoya 39.9	1942-08-02

Fast das gleiche wie 14.

16. Teilen Sie die Datei in N.

Python


import math

def split_file():
    n = int(input())

    with open('hightemp.txt') as file:
        lines = file.readlines()
        num = math.ceil(len(lines) / n)
        for i in range(n):
            with open('split{}.txt'.format(i + 1), mode='w') as new_file:
                text = ''.join(lines[i * num:(i + 1) * num])
                new_file.write(text)

split_file()

UNIX


!split -n 5 -d hightemp.txt split_unix

Ergebnis (Python)


==> split1.txt <==
Präfektur Kochi Egawasaki 41 2013-08-12
40 Kumagai, Präfektur Saitama.9	2007-08-16
40 Tajimi, Präfektur Gifu.9	2007-08-16
Yamagata 40 Yamagata.8	1933-07-25
Präfektur Yamanashi Kofu 40.7	2013-08-10

==> split5.txt <==
Toyonaka 39, Osaka.9	1994-08-08
Otsuki, Yamanashi 39.9	1990-07-19
39 Tsuruoka, Präfektur Yamagata.9	1978-08-03
Präfektur Aichi Nagoya 39.9	1942-08-02

Das Obige ist die Ausgabe von Python, die durch ! Head split1.txt split5.txt bestätigt wurde.

Auf der anderen Seite funktioniert der obige UNIX-Befehl in meiner Umgebung nicht, daher habe ich dies mit Colab (Google Colaboratory) versucht. Es scheint, dass der Befehl -n im Allgemeinen unter Linux bereitgestellt wird (@ IT). Es scheint nicht mit dem Standard-MacOS zu funktionieren.

Als ich das oben genannte in Colab ausführte, wurden 5 Dateien von "split_unix00" bis "split_unix04" erstellt, aber als ich versuchte, die Erweiterung "txt" hinzuzufügen, hatte ich das Gefühl, dass dies etwas problematisch sein würde. .. [@ moriwos Artikel](https://qiita.com/moriwo/items/9d2a73a75f543e2ea6af#16-%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) führt ein Implementierungsbeispiel mit awk usw. ein, aber ich verwende Python Ich fragte mich, ob es einfacher wäre, den Code zu lesen.

17. Unterschied in der Zeichenfolge in der ersten Spalte

Python


import pandas as pd

def get_chars_set():
    df = pd.read_csv('hightemp.txt', sep='\t', header=None)
    return set(df.iloc[:, 0])

print(get_chars_set())

Ergebnis (Python)


{'Präfektur Chiba', 'Saitama', 'Präfektur Yamagata', 'Präfektur Wakayama', 'Präfektur Shizuoka', 'Präfektur Kochi', 'Präfektur Osaka', 'Präfektur Gifu', 'Präfektur Gunma', 'Präfektur Ehime', 'Präfektur Yamanashi', 'Präfektur Aichi'}

UNIX


!sort -u col1_unix.txt

Ergebnis (UNIX)


Präfektur Chiba
Saitama
Präfektur Osaka
Präfektur Yamagata
...

UNIX-Befehle können auch als ! Sort col1_unix.txt | uniq geschrieben werden, indem der Sortier- und Deduplizierungsprozess weitergeleitet wird.

18. Sortieren Sie jede Zeile in absteigender Reihenfolge der Zahlen in der dritten Spalte

Python


def sort_rows():
    df = pd.read_csv('hightemp.txt', sep='\t', header=None)
    df.rename(columns={0: 'Prefect', 1: 'City', 2: 'Temp', 3: 'Date'}, inplace=True)
    df.sort_values(by='Temp', inplace=True)
    return df

sort_rows()

Ergebnis (Python)


   Prefect  City  Temp        Date
23 Nagoya, Aichi 39.9  1942-08-02
21 Präfektur Yamanashi Otsuki 39.9  1990-07-19
20 Toyonaka, Osaka 39.9  1994-08-08
...

UNIX


!sort hightemp.txt -k 3

Ergebnis (UNIX)


Präfektur Aichi Nagoya 39.9	1942-08-02
39 Tsuruoka, Präfektur Yamagata.9	1978-08-03
Otsuki, Yamanashi 39.9	1990-07-19
Toyonaka 39, Osaka.9	1994-08-08
...

Ich bin nicht sicher, ob das Wort "umgekehrte Reihenfolge" die Umkehrung der ursprünglichen oder der absteigenden Reihenfolge bedeutet, aber ich habe versucht, es mit der letzteren Interpretation zu lösen. Ich bin besonders stark von diesem Problem betroffen, dass UNIX-Befehle kurz geschrieben werden können.

19. Ermitteln Sie die Häufigkeit des Auftretens der ersten Spalte jeder Zeile und ordnen Sie sie in absteigender Reihenfolge der Häufigkeit des Auftretens an.

Python


def count_freq():
    df = pd.read_csv('hightemp.txt', sep='\t', header=None)
    return df[0].value_counts()
    
count_freq()

Ergebnis (Python)


Präfektur Gunma 3
Präfektur Yamanashi 3
Präfektur Yamagata 3
Präfektur Saitama 3

UNIX


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

Ergebnis (UNIX)


3 Präfektur Gunma
3 Präfektur Yamanashi
3 Präfektur Yamagata
3 Präfektur Saitama

Der UNIX-Befehl ist etwas länger, aber schneiden Sie zuerst die erste Spalte (cut -f 1) aus, finden Sie dann ihre Häufigkeit ( sort | uniq -c) und schließlich in umgekehrter Reihenfolge der Häufigkeit. Ich habe es so geschrieben, dass der Ablauf des Arrangierens (sort -r) leicht zu verstehen ist.

Angesichts der hervorragenden Leistung von value_counts () von Pandas denke ich jedoch, dass es hier einfacher ist, Python zu verstehen.

Zusammenfassung

Das ist alles für dieses Kapitel, aber wenn Sie einen Fehler machen, kommentieren Sie bitte.

Recommended Posts

100 Sprachverarbeitung Knock UNIX-Befehle in Kapitel 2
100 Sprachverarbeitung Knock 2020 Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Klopfen Sie auf reguläre Ausdrücke, die Sie in Kapitel 3 gelernt haben
100 Sprachverarbeitung Knock Kapitel 1 in Python
[Sprachverarbeitung 100 Schläge 2020] Kapitel 2: UNIX-Befehle
100 Sprachverarbeitung Knock Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 3
100 Sprachverarbeitung Knock 2020 Kapitel 2
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 2: UNIX-Befehle 10-14]
Ich habe versucht, die Version 2020 mit 100 Sprachverarbeitung zu lösen [Kapitel 2: UNIX-Befehle 15-19]
100 Sprachverarbeitung klopft Morphologische Analyse in Kapitel 4 gelernt
100 Sprachverarbeitung Knock Kapitel 1 (Python)
100 Sprachverarbeitung Knock Kapitel 2 (Python)
100 Sprachverarbeitung Knock: Kapitel 2 UNIX-Befehlsgrundlagen (mit Pandas)
100 Sprachverarbeitung Knock 2015 Kapitel 5 Abhängigkeitsanalyse (40-49)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 1)
100 Sprachverarbeitung Knock 2020 Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 9: RNN, CNN
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 3
100 Sprachverarbeitungsklopfen mit Python (Kapitel 3)
100 Sprachverarbeitungsklopfen: Kapitel 1 Vorbereitungsbewegung
100 Sprachverarbeitung Knock 2020 Kapitel 6: Maschinelles Lernen
100 Sprachverarbeitung Knock Kapitel 4: Morphologische Analyse
100 Sprachverarbeitung Knock 2020 Kapitel 10: Maschinelle Übersetzung (90-98)
100 Sprachverarbeitung Knock 2020 Kapitel 5: Abhängigkeitsanalyse
100 Sprachverarbeitung Knock 2020 Kapitel 7: Word Vector
100 Sprachverarbeitung Knock 2020 Kapitel 8: Neuronales Netz
Ich habe versucht, 100 Sprachverarbeitung klopfen 2020: Kapitel 1
100 Sprachverarbeitung Knock 2020 Kapitel 1: Vorbereitende Bewegung
100 Sprachverarbeitung Knock Kapitel 1 von Python
100 Sprachverarbeitung Knock 2020 Kapitel 3: Reguläre Ausdrücke
100 Language Processing Knock 2015 Kapitel 4 Morphologische Analyse (30-39)
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 2
Ich habe versucht, 100 Sprachverarbeitung zu klopfen 2020: Kapitel 4
100 Klicks in der Verarbeitung natürlicher Sprache Kapitel 2 Grundlagen des UNIX-Befehls (zweite Hälfte)
100 Klicks in der Verarbeitung natürlicher Sprache Kapitel 2 Grundlagen des UNIX-Befehls (erste Hälfte)
100 Sprachverarbeitungsklopfen (2020): 28
100 Sprachverarbeitungsklopfen (2020): 38
100 Sprachverarbeitung klopfen 00 ~ 02
Ich habe mit GiNZA v3.1 Kapitel 4 100 Sprachverarbeitungsklopfen 2020 durchgeführt
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 2)
100 Sprachverarbeitungsklopfen mit Python (Kapitel 2, Teil 1)
[Programmierer-Neuling "100 Sprachverarbeitung klopfen 2020"] Lösen Sie Kapitel 1
100 Sprachverarbeitung klopfen 2020 [00 ~ 39 Antwort]
100 Sprachverarbeitung klopfen 2020 [00-79 Antwort]
100 Sprachverarbeitung klopfen 2020 [00 ~ 69 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 17
100 Sprachverarbeitung klopfen 2020 [00 ~ 49 Antwort]
100 Sprachverarbeitung Knock-52: Stemming
100 Sprachverarbeitungsklopfen ~ Kapitel 1
100 Amateur-Sprachverarbeitungsklopfen: 07
100 Sprachverarbeitung klopft Kapitel 2 (10 ~ 19)
100 Amateur-Sprachverarbeitungsklopfen: 09
100 Amateur-Sprachverarbeitungsklopfen: 47
100 Sprachverarbeitung Knock-53: Tokenisierung
100 Amateur-Sprachverarbeitungsklopfen: 97
100 Sprachverarbeitung klopfen 2020 [00 ~ 59 Antwort]
100 Amateur-Sprachverarbeitungsklopfen: 67
[Programmierer-Neuling "100 Sprachverarbeitung klopft 2020"] Löse Kapitel 2 [Erste Hälfte: 10 ~ 15]
100 Sprachverarbeitungsklopfen mit Python 2015
100 Sprachverarbeitung Knock-51: Wortausschnitt