<jupyter_start><jupyter_text>Chapter 1 : ストレッチ  00. 文字列の逆順文字列"stressed"の文字を逆に（末尾から先頭に向かって）並べた文字列を得よ．<jupyter_code>"stressed"[::-1]<jupyter_output><empty_output><jupyter_text>01. 「パタトクカシーー」「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ．<jupyter_code>"パタトクカシーー"[::2]<jupyter_output><empty_output><jupyter_text>02. 「パトカー」＋「タクシー」＝「パタトクカシーー」「パトカー」＋「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ．<jupyter_code>"".join([i+j for i, j in zip(list("パトカー"), list("タクシー"))])<jupyter_output><empty_output><jupyter_text>03. 円周率"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し，各単語の（アルファベットの）文字数を先頭から出現順に並べたリストを作成せよ．<jupyter_code>src = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
[len(i.strip(",.")) for i in src.split(" ")]<jupyter_output><empty_output><jupyter_text>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文字を取り出し，取り出した文字列から単語の位置（先頭から何番目の単語か）への連想配列（辞書型もしくはマップ型）を作成せよ．<jupyter_code>src = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
one_letter = [1, 5, 6, 7, 8, 9, 15, 16, 19]
elements = [v[:1] if i + 1 in one_letter else v[:2] for i, v in enumerate(src.split(" "))]
{i: v for i, v in enumerate(elements)}<jupyter_output><empty_output><jupyter_text>05. n-gram与えられたシーケンス（文字列やリストなど）からn-gramを作る関数を作成せよ．この関数を用い，"I am an NLPer"という文から単語bi-gram，文字bi-gramを得よ．<jupyter_code>def bigram(text):
    return ["".join(text[i:i + 2]) for i in range(len(text) - 1)]
text = "I am an NLPer"
# 単語 bi-gram
bigram(text.split(" "))
# 文字 bi-gram
bigram(list(text))<jupyter_output><empty_output><jupyter_text>06. 集合"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を，それぞれ, XとYとして求め，XとYの和集合，積集合，差集合を求めよ．さらに，'se'というbi-gramがXおよびYに含まれるかどうかを調べよ．<jupyter_code># bigram生成
X = set(bigram(list("paraparaparadise")))
Y = set(bigram(list("paragraph")))
# 和集合
X | Y
# 積集合
X & Y
# 差集合
X - Y
# 差集合
Y - X
# Xに'se'が含まれるか
'se' in X
# Yに'se'が含まれるか
'se' in Y<jupyter_output><empty_output><jupyter_text>07. テンプレートによる文生成引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ．さらに，x=12, y="気温", z=22.4として，実行結果を確認せよ．<jupyter_code>from string import Template

tmp = Template("$x時の$yは$z")
tmp.substitute(x=12, y="気温", z=22.4)<jupyter_output><empty_output><jupyter_text>08. 暗号文与えられた文字列の各文字を，以下の仕様で変換する関数cipherを実装せよ．    英小文字ならば(219 - 文字コード)の文字に置換    その他の文字はそのまま出力この関数を用い，英語のメッセージを暗号化・復号化せよ．<jupyter_code>def cipher(msg: str):
    return "".join([chr(219 - ord(i)) if i.isalpha() and i.islower() else i for i in list(msg)])
# 暗号化
cipher("I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .")
# 復号化
cipher("I xlfowm'g yvorvev gszg I xlfow zxgfzoob fmwvihgzmw dszg I dzh ivzwrmt : gsv ksvmlnvmzo kldvi lu gsv sfnzm nrmw .")<jupyter_output><empty_output><jupyter_text>09. Typoglycemiaスペースで区切られた単語列に対して，各単語の先頭と末尾の文字は残し，それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ．ただし，長さが４以下の単語は並び替えないこととする．適当な英語の文（例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."）を与え，その実行結果を確認せよ．<jupyter_code>import random

def typoglycemia(text):
    random_word_list = []
    for i in text.split(" "):
        if len(i) <= 4:
            random_word_list.append(i)
        else:
            random_word_list.append(i[0] + "".join(random.sample(i[1:len(i) - 1], len(i) - 2)) + i[-1])
    return " ".join(random_word_list)
text = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."
typoglycemia(text)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.13671770077894171, 'fraction_numerical': 0.021756647864625302, 'mean_word_length': 6.646817248459959, 'pattern_counts': {'":': 0, '<': 42, '<?xml version=': 0, '>': 41, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '10', 'dir': 'jupyter-structured-clean-dedup', 'id': '435053', 'license': 'MIT', 'n_tokens_mistral': 2056, 'n_tokens_neox': 1990, 'n_words': 314, 'path': '2015/chapter01.ipynb', 'repo_name': 'ayatk/nlp100', 'size': '3723'}