見出し画像

言語処理100本ノック 解答例 第二章 (10-19)

自然言語処理の入門トレーニングとして最適だと思ったので,取り組みます!

10. 行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ.
data = open('popular-names.txt','r')
lines = data.readlines()
data.close()
print(len(lines))

-----UNIX Command-----
wc -l popular-names.txt

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

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.
data = open('popular-names.txt','r')
lines = data.readlines()
data.close()

for line in lines:
   print(line.replace('\t', ' '), end='')

-----UNIX Command-----
sed 's/\t/ /g' popular-name.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', delimiter='\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)

-----UNIX Command-----
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コマンドを用いよ.
import pandas as pd

col1 = pd.read_csv('col1.txt', delimiter='\t', header=None)
col2 = pd.read_csv('col2.txt', delimiter='\t', header=None)
pd.concat([col1,col2], axis=1).to_csv('col1_col2.txt', sep='\t', header=False, index=False)

-----UNIX Command-----
paste col1.txt col2.txt > col1_2.txt

14. 先頭からN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.
import pandas as pd
n = int(input('先頭から出力したい行数を入力してください-->'))
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
print(df.head(n))

-----UNIX Command-----
head -n 5 popular-names.txt

15. 末尾のN行を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.
import pandas as pd
n = int(input('末尾から出力したい行数を入力してください-->'))
df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
print(df.tail(n))

-----UNIX Command-----
tail -n 5 popular-names.txt

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

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

n = int(input('N-->'))
df = pd.read_csv('popular-names.txt',delimiter='\t',header=None)
count = -(-len(df)//n)

files = glob.glob("popular-names-*txt")
if len(files) > 0:
   for f in files:
       os.remove(f)
   print('remove splited files')

for i in range(n):
   df_split = df.iloc[n*count:(n+1)*count]
   df_split.to_csv('popular-names-{}.txt'.format(i+1), sep='\t', header=False, index=False)

-----UNIX Command-----
ex)3つに分割する場合
split -n 3 popuar-names.txt

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

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

df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
ans = df[0].unique()
ans.sort()
print(ans)

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

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

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

df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
ans = df.sort_values(by=2,ascending=False)
print(ans)

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

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

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

df = pd.read_csv('popular-names.txt', delimiter='\t', header=None)
print(df[0].value_counts())

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

各問題のポイント

以下の個人サイトで各問題のポイントを説明しています.


この記事が気に入ったらサポートをしてみませんか?