言語処理100本ノック2020 第2章 UNIXコマンド

はじめに

言語処理100本ノック2020

言語処理100本ノックは東北大学が公開している自然言語処理の問題集です。

とても良質なコンテンツで企業の研修や勉強会で使われています。

そんな言語処理100本ノックが2020年に改定されてました。昨今の状況を鑑みて、深層ニューラルネットワークに関する問題が追加されました。(その他にも細かい変更があります)

この記事では、言語処理100本ノック2020にPythonで取り組んでいきます。

他にも色々な解法があると思うので、一つの解答例としてご活用ください!

全100問の解説に戻る

10. 行数のカウント

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

この章はPandasを使ってみようと思います。

1
2
3
import pandas as pd
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
print (len(df))

pandasで表形式のデータを読み込む際はread_csvを用います。read_csvdelimiterを適切に指定することで、csvファイル以外にも使えます。また、header=Noneをつけないとファイルの一行目がヘッダーとして読み込まれてしまうので注意しましょう。

1
wc popular-names.txt

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

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

1
2
3
import pandas as pd
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
df.to_csv('space.txt', sep=' ',header=False, index=False)

保存する際はto_csvを使います。その際にsepで区切り文字を指定します。保存する際に、DataFrameのヘッダーやインデックスが出力されないように注意します。

1
sed 's/\t/ /g' popular-names.txt > replaced.txt

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

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

1
2
3
4
import pandas as pd
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
df.iloc[:,0].to_csv('col1.txt', sep=' ',header=False, index=False)
df.iloc[:,1].to_csv('col2.txt', sep=' ',header=False, index=False)

ilocを使うことで行や列を指定して取得することができます。

1
2
cut -f 1  popular-names.txt > col1.txt
cut -f 2 popular-names.txt > col2.txt

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

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

1
2
3
4
5
import pandas as pd
df1 = pd.read_csv('col1.txt', delimiter='\t', header=None)
df2 = pd.read_csv('col2.txt', delimiter='\t', header=None)
df = pd.concat([df1, df2], axis=1)
df.to_csv('col1_2.txt', sep='\t',header=False, index=False)

concatで結合ができます。横方向に連結したいのでaxis=1を指定します。

1
paste col1.txt col2.txt > col1_2.txt

14. 先頭からN行を出力

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

1
2
3
import pandas as pd
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
print (df.head(5))

headで指定した行数を確認することができます。

1
head -n 5 popular-names.txt

15. 末尾のN行を出力

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

1
2
3
import pandas as pd
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
print (df.tail(5))

Pandasで先頭から取得する場合はhead、末尾から取得する場合はtailを使います。UNIXコマンドと同様ですね。

1
tail -n 5 popular-names.txt

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

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

1
2
3
4
5
6
7
N = 3
import pandas as pd
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
step = - (-len(df) // N)
for n in range(N):
df_split = df.iloc[n*step:(n+1)*step]
df_split.to_csv('popular-names'+str(n)+'.txt', sep='\t',header=False, index=False)

Pythonで切り上げ除算をする際は以下のように実装すると良いです。

1
step = - (-len(df) // N)
1
split -n 3 popuar-names.txt

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

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

1
2
3
4
5
import pandas as pd
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
new = df[0].unique()
new.sort()
print (new)

uniqueを使うことで集合を求めることができます。

1
cut -f 1  popular-names.txt | sort | uniq

uniqはソートされていることを前提としています。そのため、前処理としてsortが必要です。

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

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

1
2
3
4
import pandas as pd
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
new = df[2].sort_values(ascending=False)
print (new)

sort_valuesでソートできます。

1
cut -f 3  popular-names.txt | sort -n -r

sortはデフォルトでは文字列としてソートをするため、-nオプションで数値としてソートする必要があります。-rオプションで降順ソートになります。

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

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

1
2
3
4
5
6
7
8
import pandas as pd
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
vc = df[0].value_counts()
vc = pd.DataFrame(vc)
vc = vc.reset_index()
vc.columns = ['name','count']
vc = vc.sort_values(['count','name'],ascending=[False,False])
print (vc)

value_countsを用いることで出現頻度の高い順に並べ替えることができます。その後の処理はUNIXコマンドと結果を合わせるためにnameをソートしています。

1
cut -f 1  popular-names.txt | sort | uniq -c | sort -n -r

uniq-cオプションでカウントすることができます。

最後に

全100問の解説に戻る

記事情報

  • 投稿日:2020年5月9日
  • 最終更新日:2020年5月9日