前回は、Transformerについて調べている途中に理解が追いつかなくなってしまった所でした……。
そこで感じたのが、まずは何かしら手を動かして作ってみた方が良いのではないか、という事です。
今回は、ルールベースやNgramを作る前の準備段階になります。前回予告した通り、Pythonのコードの基礎についてまとめておこうと思います。内容が多いので、読みやすいように第1回、第2回、第3回に分けて投稿します。どうぞ肩の力を抜いて読んでいただけると嬉しいです。
①変数と型
主にデータを入れる箱(ラベル)として使用されるのが変数ですが、これには以下のような種類があります。
int型(整数)、float型(小数)、str型(文字)、bool型(真偽)、大体この4種類に分けられます。
そして、コードでは以下のように定義する事が出来ます。
x = 10 # int型
y = 3.14 # float型
name = "NAMAE" # str型
flag = True # bool型
ちなみに、bool型にはTrueかFalseが入るのですが、これがTrue == 1、False == 0として扱われることも出来る、という特徴があります。(boolにはintのサブクラスとしての側面があります)
今この変数は何の型を扱っているのかを確認する時は、
type(ここに変数名を書く)
を出力するコードを書く事で、型を確認する事が出来ます。
同じ変数の中でも、中身の値を後から別の型の値に変換する事が出来るという特徴があります。これを型変換と呼びます。型変換をする時には、以下のような形式で書くことになります。
int("10") # 文字列 → 数値
float(3) # 整数 → 小数
str(3.14) # 数値 → 文字列
bool(0) # False
bool(1) # True
ちなみに、Pythonには変数に対して、未設定・空・無効を表す特別な値があります。これは他の言語でいうnullと同じようなイメージで、値が存在しない事を表します。例外処理や初期化などに活用する事が出来ます。
value = None
②リスト
リストとは、一言で言えば、複数の箱をまとめて順番を持って管理するものです。変数では、1つの変数につき1つの箱を扱いますが、リストは、複数の箱を順番を保持した状態で扱う事が出来ます。また、それぞれの箱の値を個別で変更できる、という特徴もあります。(追加・削除・書き換え)
まず、リストを定義して中身を入れる時には、以下ようなコードを書きます。
words = ["あ", "い", "う"]
このリストには、それぞれ「あ」「い」「う」が入っている3つの箱が入っているイメージです。ちなみに、リストの順番を見る番号は0から始まるので、この場合は0番目に「あ」、1番目に「い」、2番目に「う」が入っています。
以下のコードで実際に確かめてみましょう。
print(words[1])
これは、wordsという名前のリストに入っている1番目を出力するコードです。ここでは「い」と出力されるはずです。
次に、リストの中の値を、書き換え・追加・削除する方法についてまとめます。
fruits = ["りんご", "みかん", "もも"]
このリストを定義した時、リストには「りんご」「みかん」「もも」の3つが入っています。
このリストの中身を書き換えてみましょう。
fruits[1] = "ぶどう"
これは、fruitsという名前のリストに入っている1番目を「ぶどう」に書き換えるコードです。実際に書き換えが行われているか、確かめてみましょう。
print(fruits)
これはリストの中身を全て出力するコードです。ここでは、["りんご", "ぶどう", "もも"]と出力されるはずです。
リストの追加と削除を行う時のコードを、以下にまとめておきます。
値をリストの最後に追加するとき
fruits.append("いちご")
値をリストの何番目かの位置(この例では1番目)に追加するとき
fruits.insert(1, "メロン")
特定の値(この例ではりんご)が入っている箱を削除するとき
fruits.remove("りんご")
リストの何番目かの値(この例では0番目)を削除するとき
del fruits[0]
それぞれ同じように、print(fruits)で確認しておくと良いでしょう。
最後に、print(リストの名前)以外の中身の出力方法についてまとめておきます。
以下のリストが定義されたとします。
data = [1, 2, 3, 4, 5]
最初の値を取り出す時、これはもちろん0番目を取り出すコードで大丈夫です。
print(data[0])
これで最初の値である1が出力されます。
最後の値を取り出す時には、-1番目として取り出す事が出来ます。
print(data[-1])
これで最後の値である5が出力されます。
さらに、スライス(部分取り出し)という出力方法もあります。
data = ["零", "一", "二", "三", "四"]
このリストを例とします。
1番目から4-1番目まで
print(data[1:4])
[一, 二, 三]と出力されます。
0番目(最初)から3-1番目まで
print(data[:3])
[零, 一, 二]と出力されます。
3番目から最後まで
print(data[3:])
[三, 四]と出力されます。
③辞書
辞書とは、外部から入力された値(キー)から、そのキーが書かれている箱の中の情報を取り出すための仕組みです。リストとの違いは、順番は重要ではない、という事です。
辞書は、内部で「ハッシュ値」を使って情報を高速検索しています。
まずはハッシュ値の仕組みについてまとめておきます。
ハッシュ値とは、入力されたキーを数字に変換したものです。この数値を使う事によって、辞書のどの場所にデータを保存するかを決めます。そして、キーを使って探したい場所にアクセスする事で、すぐに情報を出力する事が出来ます。
以上がハッシュ値の仕組みです。
例えば、以下のような辞書を定義したとき、
d = {"a": 1, "b": 2, "c": 3}
このコードを書くことで↓、
print(d)
このように出力されます↓。
{"a": 1, "b": 2, "c": 3}
次の例として以下のような辞書を定義します。
words = {"こんにちは": "挨拶", "雨": "天気"}
ここに「こんにちは」と入力する場合、
print(words["こんにちは"])
または、安全を重視するなら
print(words.get("こんにちは", "なし")) # "なし"(もし辞書に無かった時の出力)
のようなコードになり、挨拶と出力されます。
次に辞書の追加と更新についてまとめておきます。
counts["いちご"] = 5 # 新規追加
counts["りんご"] = 10 # 上書き
del counts["みかん"] # 削除
最後に、中身をまとめて出力したい時には、このような方法もあります。
キーを取り出す時
for key in counts:
print(key)
中身を取り出す時
for value in counts.values():
print(value)
どちらも取り出す時
for key, value in counts.items():
print(key, value)
まとめ
以上、ここまでがPythonの基礎コードの第1回でした!既にかなりの文章量になってしまいましたが、まだまだ続きます…!
「Ngramを作ろう!」と意気込んだものの、予想以上に多い前提知識に震えてしまいましたが、これからも言語モデルについて勉強していきますので、応援していただけると嬉しいです!