最近、仕事で言語処理を扱うようになったので、業務時間の合間に東北大100本ノックでいろはから勉強しています。
第二章からアップしていきます。
2章のテーマ
2章のテーマはファイルの入出力を行います。指定のファイルの読み込みや、変形したファイルをOSのファイルシステム上に書き出します。
共通
#coding:utf-8
import os
import codecs
base_dir = "/path"
file_name = "hightemp.txt"
f = os.path.join(base_dir,file_name)
10.行数のカウント
行数をカウントせよ.確認にはwcコマンドを用いよ.
# コーデックの処理
ff = codecs.open(f,'r','utf-8')
i = 0
for lines in ff.readlines():
i += 1
ff.close()
print('ptyhonによる読み込み',str(i))
os上での確認
wc -l hightemp.txt
11. タブをスペースに置換
タブ1文字につきスペース1文字に置換せよ.
確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.
ff = codecs.open(f,'r','utf-8')
for lines in ff.readlines():
print(lines.replace('\t',' '))
ff.close()
# os上の確認
# sed -e 's/\t/ /g' /home/jovyan/work/study/tohoku100/hightemp.txt
12. 1列目をcol1.txtに,2列目をcol2.txtに保存
各行の1列目だけを抜き出したものをcol1.txtに,
2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.
確認にはcutコマンドを用いよ.
ff = codecs.open(f,'r','utf-8')
f1 = os.path.join(base_dir,'co1.txt')
ff1 = codecs.open(f1,'w','utf-8')
f2 = os.path.join(base_dir,'co2.txt')
ff2 = codecs.open(f2,'w','utf-8')
for lines in ff.readlines():
list = lines.split('\t')
ff1.writelines(list[0] + '\n')
ff2.writelines(list[1] + '\n')
ff.close()
ff1.close()
ff2.close()
# >cut -f 1,2 hightemp.txt
13. ファイルの結合 col1.txtとcol2.txtをマージ
12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.
確認にはpasteコマンドを用いよ.
f1 = os.path.join(base_dir,'co1.txt')
ff1 = codecs.open(f1,'r','utf-8')
f2 = os.path.join(base_dir,'co2.txt')
ff2 = codecs.open(f2,'r','utf-8')
f12 = os.path.join(base_dir,'col12.txt')
print(f12)
ff12 = codecs.open(f12,'w','utf-8')
for line1,line2 in zip(ff1.readlines(),ff2.readlines()):
line1 = line1.replace('\n','')
line2 = line2.replace('\n','')
print(line1 + '\t' + line2)
# ff12.writelines(line1 + '\t' + line2)
ff12.writelines(line1 + '\t' + line2 + '\n')
ff1.close()
ff2.close()
ff12.close()
14. 先頭からN行を出力
自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.
→25以上を指定したときにきれいに24行目で終了するように調整した
# 任意に設定
n = 25
ff = codecs.open(f,'r','utf-8')
i = 0
while True:
line = ff.readline()
print(str(i + 1),line)
i += 1
if i >= n - 1:
break
ff.close()
head -n 25 hightemp.txt
15. 末尾のN行を出力(詰まってます)
自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.
→これ詰まってます。 reversedを使うのか?
やろうとしたいこと
# 任意に設定
n = 5
ff = list(codecs.open(f,'r','utf-8'))
i = 0
while True:
line = reversed(ff).readlines
print(str(i + 1),line)
i += 1
if i >= n - 1:
break
参考URL
言語処理100本ノック 2015
http://www.cl.ecei.tohoku.ac.jp/nlp100/