それでは毛玉諸君、これにて失敬

日々の精進を備忘録的に綴ります。

言語処理100本ノック 2020 【第2章】

ユニクロのマスクがお気に入り。ko_ya346です。
言語処理100本ノック2020(Rev 2)を始めたので解法をまとめていきます。
今回は第2章です。
確認のためのUNIXコマンドの方に苦戦しました。

popular-names.txtは,アメリカで生まれた赤ちゃんの「名前」「性別」「人数」「年」をタブ区切り形式で格納したファイルである.
以下の処理を行うプログラムを作成し,popular-names.txtを入力ファイルとして実行せよ.
さらに,同様の処理をUNIXコマンドでも実行し,プログラムの実行結果を確認せよ.

10. 行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ.

with open("popular-names.txt", "r") as f:
    cnt = 0
    for _ in f:
        cnt += 1
print(cnt)
wc -l popular-names.txt

11. タブをスペースに置換

タブ1文字につきスペース1文字に置換せよ.
確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

with open("popular-names.txt", "r") as f:
    t = f.read()
print(t.replace("\t", " "))
cat popular-names.txt | sed -e 's/\t/ /g' > 11.txt

12. 1列目をcol1.txtに,2列目をcol2.txtに保存

各行の1列目だけを抜き出したものをcol1.txtに,
2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.
確認にはcutコマンドを用いよ.

import pandas as pd


df = pd.read_csv("popular-names.txt", sep="\t", header=None)
df[0].to_csv("col1.txt", index=False, header=None)
df[1].to_csv("col2.txt", index=False, header=None)
cut -f 1 -d " " 11.txt
cut -f 2 popular-names.txt

13. col1.txtとcol2.txtをマージ

12で作ったcol1.txtとcol2.txtを結合し,
元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.
確認にはpasteコマンドを用いよ.

d1 = pd.read_csv("col1.txt", header=None)
d2 = pd.read_csv("col2.txt", header=None)

d = pd.concat([d1, d2], axis=1)
d.to_csv("13.txt", sep="\t", header=None)
paste -d "\t" col1.txt col2.txt

複数のreplaceをまとめて実行する方法ってないんですかね?

14. 先頭からN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,
入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.

N = int(input())
df = pd.read_csv("popular-names.txt", sep="\t", header=None)
df.head(N)
head -n 1 popular-names.txt

15. 末尾のN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,
入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.

N = int(input())
df = pd.read_csv("popular-names.txt", sep="\t", header=None)
df.tail(N)
tail -n 1 popular-names.txt

16. ファイルをN分割する

自然数Nをコマンドライン引数などの手段で受け取り,
入力のファイルを行単位でN分割せよ.同様の処理をsplitコマンドで実現せよ.

N = int(input())
df = pd.read_csv("popular-names.txt", sep="\t", header=None)
lcut = len(df)//N

for i in range(N):
    if i==N-1:
        display(df.iloc[i*lcut:])        
    else:
        display(df.iloc[i*lcut:(i+1)*lcut])
split -n 3 popular-names.txt

17. 1列目の文字列の異なり

1列目の文字列の種類(異なる文字列の集合)を求めよ.
確認にはcut, sort, uniqコマンドを用いよ.

df = pd.read_csv("popular-names.txt", sep="\t", header=None)
np.sort(df[0].unique())
cut -f 1 popular-names.txt | sort | uniq

18. 各行を3コラム目の数値の降順にソート

各行を3コラム目の数値の逆順で整列せよ
(注意: 各行の内容は変更せずに並び替えよ).
確認にはsortコマンドを用いよ
(この問題はコマンドで実行した時の結果と合わなくてもよい).

df = pd.read_csv("popular-names.txt", sep="\t", header=None)
df.sort_values(2, ascending=False)
sort -k 3 -r popular-names.txt

19. 各行の1コラム目の文字列の出現頻度を求め,出現頻度の高い順に並べる

各行の1列目の文字列の出現頻度を求め,
その高い順に並べて表示せよ.確認にはcut, uniq, sortコマンドを用いよ.

df = pd.read_csv("popular-names.txt", sep="\t", header=None)
df[0].value_counts()
cut -f 1 popular-names.txt | sort | uniq -c | sort -r