human
4. N-Gram Language Modeling"
Please write code following the instructions in jupyter notebook style.
assistant
#Here is code to 4.

CONTEXT_SIZE = 2
EMBEDDING_DIM = 10

training_sentence = """Government-linked companies play a substantial role in Singapore's economy, 
which are owned through the sovereign wealth fund Temasek Holdings, which holds majority stakes
in several of the nation's largest companies, such as Singapore Airlines, SingTel, ST Engineering
and MediaCorp.""".split() 

print (training_sentence)

# 文章からトリグラムを取得
trigrams = [([training_sentence[i], training_sentence[i + 1]], training_sentence[i + 2])
            for i in range(len(training_sentence) - 2)]

#最初の要素（文字列リスト）がcontext, 次の要素（文字列）がtargetと呼ばれる
# contextからそれに連なるtargetを予測する言語モデルを作っているため
print(trigrams[:3])

# ワードリストをセット形式に置き換えたvocabを使ってindexをアサイン
vocab = set(training_sentence)
word_to_ix = {word: i for i, word in enumerate(vocab)}

# セットへ変換した際に、ワードの登録順も変わっている
print(vocab)

# N-gramの言語モデルクラスを定義
class NGramLanguageModeler(nn.Module):

    def __init__(self, vocab_size, embedding_dim, context_size):
        super(NGramLanguageModeler, self).__init__()
        self.embeddings = nn.Embedding(vocab_size, embedding_dim) #ワード数:vocab_size, 埋め込み層次元数:embedding_dim
        self.linear1 = nn.Linear(context_size * embedding_dim, 128) #(contextサイズx埋め込み層次元数,128)
        self.linear2 = nn.Linear(128, vocab_size)

    def forward(self, inputs):
        embeds = self.embeddings(inputs).view((1, -1))
        out = F.relu(self.linear1(embeds))
        out = self.linear2(out)
        log_probs = F.log_softmax(out)
        return log_probs

# N-gram言語モデルクラスのインスタンスを生成
# EMBEDDING_DIM = 10
# CONTEXT_SIZE = 2
model = NGramLanguageModeler(len(vocab), EMBEDDING_DIM, CONTEXT_SIZE)

# SGDをベースとした最適化関数を生成
optimizer = optim.SGD(model.parameters(), lr=0.001)

losses = []  # 損失の時系列変化を調べるためリストに値を格納しておく
loss_function = nn.NLLLoss()  #損失関数は　negative log likelihood loss 

for epoch in range(100):
    total_loss = torch.Tensor([0])  # 損失初期値は0
    for context, target in trigrams:

        print('context:',context,'\ttarget:',target)
        # Contextに含まれている単語をインデックスに変換
        context_idxs = [word_to_ix[w]...