言語処理100本ノックをやってみる。
pythonに慣れていきたい。
こちらの教材が素晴らしいということだったので、初心者的に始めてみることにしました。
基本は文字列の操作についてなどなどが学べます。
最後の方はなかなか難しいらしいので、果たしてやり切れるのやら、、、。
以下は解いてみたものを貼り付けているだけです。
あと単語に区切るような操作は絶対正規表現使った方がいいんだろうなと思いながら、","とか":"とかの対応もせずにやってしまったので、
正規表現の章に入ったら、ちゃんとしていきたいですね。
#00. 文字列の逆順 #文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ. s="stressed" #0 1 2 3 4 5 6 7 8 #| s | t | r | e | s | s | e | d | #-9 -8 -7 -6 -5 -4 -3 -2 -1 #x[arg1:arg2:arg3] #x[::-1]で逆順になる。 rev_s=s[::-1] print(rev_s)
#00. 文字列の逆順 #文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ. s="stressed" #01. 「パタトクカシーー」 #「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ. import io,sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') s=u"パタトクカシーー" s1="" for i in [1,3,5,7]: s1+=s[i-1] print(s1)
#02. 「パトカー」+「タクシー」=「パタトクカシーー」 #「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ. import io,sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') s1=u"パトカー" s2=u"タクシー" s3="" for (x,y) in zip(s1,s2): s3+=x+y print(s3)
#03. 円周率 #"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を #単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ. import io,sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') s=u"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics." s=s.replace(",","") s=s.replace(".","") slist=s.split(" ") l=[] for i in slist: l.append(len(i)) print(l)
#04. 元素記号 #"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can." #という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し, #取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ. import io,sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') s=u"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can." s=s.replace(",","") s=s.replace(".","") slist=s.split(" ") n=len(slist) dic={} one=[1,5,6,7,8,9,15,16,19] for i in range(n): if i+1 in one: dic[slist[i][0:1]]=i+1 else: dic[slist[i][0:2]]=i+1 print(dic)
#05. n-gram #与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ. import io,sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') def word_ngram(s,n): s=s.replace(",","") s=s.replace(".","") sw=s.split(" ") ngram=[] for i in range(len(sw)-n+1): chank="" for j in range(i,i+n): if(j==i+n-1): chank+=sw[j] else: chank+=sw[j]+" " ngram.append(chank) return ngram def char_ngram(s,n): s=s.replace(",","") s=s.replace(".","") sc=list(s.replace(" ","")) ngram=[] for i in range(len(sc)-n+1): chank="" for j in range(i,i+n): chank+=sc[j] ngram.append(chank) return ngram
#06. 集合 #"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め, #XとYの和集合,積集合,差集合を求めよ.さらに,'se'というbi-gramがXおよびYに含まれるかどうかを調べよ. import io,sys def word_ngram(s,n): s=s.replace(",","") s=s.replace(".","") sw=s.split(" ") ngram=[] for i in range(len(sw)-n+1): chank="" for j in range(i,i+n): if(j==i+n-1): chank+=sw[j] else: chank+=sw[j]+" " ngram.append(chank) return ngram def char_ngram(s,n): s=s.replace(",","") s=s.replace(".","") sc=list(s.replace(" ","")) ngram=[] for i in range(len(sc)-n+1): chank="" for j in range(i,i+n): chank+=sc[j] ngram.append(chank) return ngram sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') x="paraparaparadise" y="paragraph" X=set(char_ngram(x,2)) Y=set(char_ngram(y,2)) X_or_Y=X|Y X_and_Y=X&Y X_sub_Y=X-Y if "se" in X: print("se is in X") if "se" in Y: print("se is in Y")
#07. テンプレートによる文生成 #引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.さらに,x=12, y="気温", z=22.4として,実行結果を確認せよ. import io,sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') x=12 y="気温" z="22.4" print("%s時の%sは%s" % (x,y,z))
#08. 暗号文 #与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ. #英小文字ならば(219 - 文字コード)の文字に置換 #その他の文字はそのまま出力 #この関数を用い,英語のメッセージを暗号化・復号化せよ. import io,sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') s="This is a 5000kg pen." def encode(s): ss=list(s) sss=[] for i in ss: if i.islower(): sss.append(chr(219-ord(i))) else: sss.append(i) s_code="" for i in sss: s_code+=i return s_code def decode(s): ss=list(s) sss=[] for i in ss: if i.islower(): sss.append(chr(219-ord(i))) else: sss.append(i) s_code="" for i in sss: s_code+=i return s_code print(decode(encode(s)))
#09. Typoglycemia #スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し, #それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ. #ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文 #(例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .") #を与え,その実行結果を確認せよ. import random def rand_change(s): sss=s.split(" ") sentence=[] for i in sss: if "," in i: ii.insert() if len(i)>4: ii=list(i[1:len(i)-1]) random.shuffle(ii) ii.insert(0,i[0:1]) ii.append(i[len(i)-1:len(i)]) sentence.append("".join(ii)) else: sentence.append(i) s_rand=" ".join(sentence) return s_rand s="I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ." print(rand_change(s))