言語処理100本ノック 2020 第2章
Created: 2020-04-26
言語処理100本ノック 2020 - NLP100 2020
関連記事: tag 言語処理100本ノック
code
.
.
.
.
.
.
# 準備
target_dir = '/users/tbsmcd/Documents/'
file_path = target_dir + 'popular-names.txt'
# 010
with open(file_path) as f:
for i, r in enumerate(f, 1): # 最初のキーを1として取得(デフォルトは0)
pass
print(i)
# wc popular-names.txt
# 2780 11120 55026 popular-names.txt
# 011
res = ''
with open(file_path) as f:
for row in f:
res += row.replace("\t", " ")
print(res)
#cat popular-names.txt | tr '\t' ' '
# 012
col1 = []
col2 = []
with open(file_path) as f:
for row in f:
cols = row.split("\t")
col1.append(cols[0])
col2.append(cols[1])
with open(target_dir + 'col1.txt', mode='w') as f:
f.write('\n'.join(col1) + '\n')
with open(target_dir + 'col2.txt', mode='w') as f:
f.write('\n'.join(col2) + '\n')
# cut -f 1 ./popular-names.txt
# cut -f 2 ./popular-names.txt
# 013
col1 = []
col2 = []
with open(target_dir + 'col1.txt') as f:
for row in f:
col1.append(row.strip())
with open(target_dir + 'col2.txt') as f:
for row in f:
col2.append(row.strip())
cols = []
for c1, c2 in zip(col1, col2):
cols.append(c1 + '\t' + c2)
with open(target_dir + 'col1+2.txt', mode='w') as f:
f.write('\n'.join(cols))
# paste col1.txt col2.txt
paste コマンド超便利
# 014
import argparse
parser = argparse.ArgumentParser(description='先頭からN行を出力する')
parser.add_argument('lines', help='出力したい行数')
args = parser.parse_args(args=['5'])
with open(file_path) as f:
text = f.read()
print('\n'.join(text.split('\n')[0:int(args.lines)]))
# head -n 5 popular-names.txt
Jupyter を使っているため parser.parse_args()
にはあらかじめ引数を与えておく。実際にコマンドとして使う際には空にする。
# 015
import argparse
parser = argparse.ArgumentParser(description='末尾からN行を出力する')
parser.add_argument('lines', help='出力したい行数')
args = parser.parse_args(args=['5'])
with open(file_path) as f:
text = f.read().strip()
print('\n'.join(text.split('\n')[-int(args.lines):]))
# tail -n 5 popular-names.txt
strip()
が無いと最終行のあとの改行文字でも分割され、空の要素が生まれる。
# 016
import argparse
import math
parser = argparse.ArgumentParser(description='末尾からN行を出力する')
parser.add_argument('split', help='分割したい個数')
args = parser.parse_args(args=['5'])
step = int(args.split)
with open(file_path) as f:
rows = f.read().strip().split('\n')
row_num = math.ceil(len(rows) / step)
splited = [rows[i:i + row_num] for i in range(0, row_num, step)]
# あとは join で文字列にするだけ
# split -n 5 popular-names.txt
# mac だと使えないオプションが違う
range()
の第3引数の step 個飛ばしでループさせているだけ。split コマンドの -n は mac のデフォルトだと使えない。
# 017
with open(file_path) as f:
rows = f.read().strip().split('\n')
set([r.split('\t')[0] for r in rows])
# cut -f 1 popular-names.txt | sort | uniq
Python 側もだいぶ短いコードで実現できる。
# 018
with open(file_path) as f:
rows = f.read().strip().split('\n')
sorted(rows, key=lambda x: int(x.split('\t')[2])*-1)
# あとは join などで……
# sort -brn -k 3 popular-names.txt
文字列連結部分は繰り返しなので省略している。
# 019
with open(file_path) as f:
rows = f.read().strip().split('\n')
names = [r.split('\t')[0] for r in rows]
names_dic = {}
for n in set(names):
names_dic[n] = names.count(n)
sorted(names_dic.items(), key=lambda x: x[1], reverse=True)
# cut -f 1 popular-names.txt | sort | uniq -c | sort -brn -k 1
items() を使えばタプルとして取得できる(x[1]
)のをよく忘れる。