Edited at

言語処理100本ノック 00〜09

More than 1 year has passed since last update.

はじめました。まだ折り返しまで来たとこですが、忘れそうなのでちょっとずつまとめます。


00. 文字列の逆順

文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

print("stressed"[::-1])


01. 「パタトクカシーー」

「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.

print("パタトクカシーー"[0:-1:2])


02. 「パトカー」+「タクシー」=「パタトクカシーー」

「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

class String(str):

def __init__(self, char):
self._char = char

def at(self, index):
if index >= len(self._char):
return ''
return self._char[index]

def concat(a, b):
a = String(a)
b = String(b)
max_len = max(len(a), len(b))
return ''.join([a[i] + b[i] for i in range(max_len)])

print(concat("パトカー", "タクシー"))

out of index range気持ち悪かったので、疑似Stringオブジェクトを作ってout of index rangeを起きないようにした。


03. 円周率

"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

def get_word_length(word):

word = word.strip(",.")
return len(word)

pieces = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics.".split(" ")
print("".join([str(get_word_length(c)) for c in pieces]))


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文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

def get_atomic_symbol(index, word):

if (index + 1) in [1, 5, 6, 7, 8, 9, 15, 16, 19]:
return word[0:1]
return word[0:2]

pieces = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can.".split()
symbol_map = { i:get_atomic_symbol(i, pieces[i]) for i in range(len(pieces)) }
print(symbol_map)


05. n-gram

与えられたシーケンス(文字列やリストなど)からn-gramを作る関数を作成せよ.この関数を用い,"I am an NLPer"という文から単語bi-gram,文字bi-gramを得よ.

def ngram(target, n):

ngram = []
for i in range(len(target) - n + 1):
ngram.append(target[i:(i + n)])
return ngram

print(ngram("I am an NLPer", 2))
print(ngram(["I", "am", "an", "NLPer"], 2))


06. 集合

"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,'se'というbi-gramがXおよびYに含まれるかどうかを調べよ.

def ngram(target, n):

ngram = []
for i in range(len(target) - n + 1):
ngram.append(target[i:(i + n)])
return ngram

X = set(ngram("paraparaparadise", 2))
Y = set(ngram("paragraph", 2))

print(X | Y)
print(X & Y)
print(X - Y)


07. テンプレートによる文生成

引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.さらに,x=12, y="気温", z=22.4として,実行結果を確認せよ.

def generate(x, y, z):

return "%s時の%sは%s" % (x, y, z)

print(generate(12, "気温", 22.4))


08. 暗号文

与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.

英小文字ならば(219 - 文字コード)の文字に置換

その他の文字はそのまま出力

この関数を用い,英語のメッセージを暗号化・復号化せよ.

import re

def cipher(sentence):
encrypted = ""
for char in sentence:
if re.match("^[a-z]$", char):
encrypted += chr(219 - ord(char))
else:
encrypted += char
return encrypted

print(cipher("I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind."))
print(cipher(cipher("I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind.")))


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 typoglycemia(sentence):
result = []
for word in sentence.split(" "):
if len(word) > 4:
shuffle = random.sample(word[1:len(word) - 1], len(word) - 2)
result.append(word[0] + "".join(shuffle) + word[-1])
else:
result.append(word)
return " ".join(result)

text = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
print(typoglycemia(text))