【大規模言語モデル入門】8章8.3~8.4

208 Views

November 28, 24

スライド概要

profile-image

AI・機械学習を勉強したい学生たちが集まる、京都大学の自主ゼミサークルです。私たちのサークルに興味のある方はX(Twitter)をご覧ください!

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

2024年度後期輪読会#7(2024/11/28) 第8章 文字埋め込み(8.3 ~ 8.4) 最上 勇登 0

2.

アジェンダ ・教師なしSimCSEの実装 ・教師ありSimCSEの実装 ・Faissによる最近某探索 1

3.

文埋め込みモデルの実装 8.2章記載の教師なしSimCSEと教師ありSimCSEの日本語版を実装する 教師なしSimCSE ・訓練データ 日本語版Wikiから抽出した100万文のデータ 教師ありSimCSE ・データ JSNLI: 日本語の自然言語推論データセット。 京都大学が公開している、SNLIを日本語に翻訳したおよそ50万の前提文-仮説文ペアから なるデータセット。 前提文: 「田中さんはレストランで食事しました。」 仮説文: 「田中さんは外食しました。」 ラベル: 含意 前提文: 「山田さんは毎朝ジョギングします。」 仮説文: 「山田さんは毎朝泳ぎます。」 ラベル: 矛盾(Contradiction) 2

4.

教師なしSimCSE データセット: 訓練 日本語Wikiから文章を抜き出した、2439万件の前処理済データを使用。空の行は記事の区切り目を示す。 今回は空の行を削除してランダムに100万行を抜き出す。 from datasets import load_dataset # Hugging Face Hubのllm-book/jawiki-sentencesのリポ ジトリから # Wikipediaの文のデータを読み込み、SimCSEの訓練セットと して使用する unsup_train_dataset = load_dataset( "llm-book/jawiki-sentences", split="train" ) 3

5.

教師なしSimCSE データセット: テスト、検証 テスト及び検証データには、JSTSデータセットの訓練セットと検証セットを使用する。 文章ペアの関連度をラベルとして持つデータセット。 # Hugging Face Hubのllm-book/JGLUEのリポジトリから # JSTSデータセットの訓練セットと検証セットを読み込み、 # それぞれをSimCSEの検証セットとテストセットとして使用する valid_dataset = load_dataset( "llm-book/JGLUE", name="JSTS", split="train" ) test_dataset = load_dataset( "llm-book/JGLUE", name="JSTS", split="validation" ) # トークナイザの定義 from transformers import AutoTokenizer # Hugging Face Hubにおけるモデル名を指定する base_model_name = "cl-tohoku/bert-base-japanese-v3" # モデル名からトークナイザを初期化する tokenizer = AutoTokenizer.from_pretrained(base_model_name) 4

6.
[beta]
教師なしSimCSE
collate関数
・unsup_train_collate_fn()
トークナイザを適用した後の文章のペアをバッチ化、ラベルと一緒
に返す関数。SimCSEに必要な2入力とラベルを返す。それぞれに
異なるドロップアウトがd適用される。
import torch

・eval_collate_fn()
評価時には異なる文章のペアを返す。

tokenized_texts_1 = tokenizer(

from torch import Tensor

[example["sentence1"] for example in examples],

from transformers import BatchEncoding

padding=True,truncation=True,
max_length=512,

def unsup_train_collate_fn(examples: list[dict],
)-> dict[str, BatchEncoding | Tensor]:

return_tensors="pt",)
tokenized_texts_2 = tokenizer(

tokenized_texts = tokenizer(

[example["sentence2"] for example in examples],

[example["text"] for example in examples],

padding=True,truncation=True,

padding=True,

max_length=512,

truncation=True,

return_tensors="pt",)

max_length=32,

labels = torch.arange(len(examples))

return_tensors="pt",

label_scores = torch.tensor(

)

[example["label"] for example in examples]

labels = torch.arange(len(examples))

)

return {

return {

"tokenized_texts_1": tokenized_texts,

"tokenized_texts_1": tokenized_texts_1,

"tokenized_texts_2": tokenized_texts,

"tokenized_texts_2": tokenized_texts_2,

"labels": labels,

"labels": labels,

}

"label_scores": label_scores,
}

5

7.

教師なしSimCSE ・類似度行列 対角線(0, 1, 2..)が正例 6

8.

教師なしSimCSE モデルの定義 ・encode_texts() BERTなどのencoderに線形層と活性化層を追加するだけ。 推論時にはMLPを使用しない方が性能が上がる(論文より)。 # self.encoder = AutoModel.from_pretrained(base_model_name) def encode_texts(self, tokenized_texts: BatchEncoding) -> Tensor: """エンコーダを用いて文をベクトルに変換""" # トークナイズされた文をエンコーダに入力する encoded_texts = self.encoder(**tokenized_texts) # モデルの最終層の出力(last_hidden_state)の # [CLS]トークン(0番目の位置のトークン)のベクトルを取り出す encoded_texts = encoded_texts.last_hidden_state[:, 0] # self.mlp_only_trainのフラグがTrueに設定されていて # かつ訓練時でない場合、MLP層の変換を適用せずにベクトルを返す if self.mlp_only_train and not self.training: return encoded_texts # MLP層によるベクトルの変換を行う encoded_texts = self.dense(encoded_texts) encoded_texts = self.activation(encoded_texts) return encoded_texts 7

9.

教師なしSimCSE モデルの定義 ・forward() 1. 埋め込みを行ったベクトルに対して類似度行列sim_matrixを 作成。 ・sim_matrix : sim_matrixは文ペア間のコサイン類似度を格納した行列で、形状は [batch_size, batch_size] 。sim_matrix[i][j] はバッチ 内の文 i と文 j のコサイン類似度を示します。 ・labels: labelsは各文ペアの正例ペアのインデックスを示すテンソル。 通常、教師なし設定では同一文がポジティブペアとなるため対角線 のインデックスとなる。 1. CrossEntropyLossを求める 2. labelsをone_hotにして、sim_matrixから対応するインデックス のスコアを抜き出す 3. lossとscoreを返す # self.encoder = AutoModel.from_pretrained(base_model_name) def forward(self,tokenized_texts_1,tokenized_texts_2,labels,label_scores ) -> ModelOutput: """モデルの前向き計算を定義""" # 文ペアをベクトルに変換する encoded_texts_1 = self.encode_texts(tokenized_texts_1) encoded_texts_2 = self.encode_texts(tokenized_texts_2) # 文ペアの類似度行列を作成する sim_matrix = F.cosine_similarity( encoded_texts_1.unsqueeze(1), encoded_texts_2.unsqueeze(0), dim=2, ) # 交差エントロピー損失を求める loss = F.cross_entropy(sim_matrix / self.temperature, labels) #性能評価に使用するため、正例ペアに対するスコアのみをスコア(類似度)行列から取り出す lossでlabels(インデックス)を指定することで、異なるドロップアウ トが適用された同じ文章以外は全て負例となる。 positive_mask = F.one_hot(labels, sim_matrix.size(1)).bool() positive_scores = torch.masked_select( sim_matrix, positive_mask encode_texts()内部のBERT及びMLPを学習。似た文の埋め込み表現 は近く、似ていない文は遠くなるように学習する。 ) return ModelOutput(loss=loss, scores=positive_scores) 8

10.
[beta]
教師なしSimCSE
評価指標
・compute_metrics
評価指標としてスピアマンの順位相関係数を使用。
最高1,最低-1で、スコアを高い順に値を順位に変換して順位の
相関を見る。
from scipy.stats import spearmanr
from transformers import EvalPrediction

def compute_metrics(p: EvalPrediction) -> dict[str, float]:
"""

モデルが予測したスコアと評価用データのスコアの
スピアマンの順位相関係数を計算
"""
scores = p.predictions
labels, label_scores = p.label_ids

spearman = spearmanr(scores, label_scores).statistic

return {"spearman": spearman}

9

11.

教師なしSimCSE Trainerの定義 ・SimCSETrainer 検証、テストセットのcollate関数としてeval_collate_fnを使用。 異なる二つの文章と、その相関が評価用のラベルとして与えられる。 ・パラメータ 各種パラメータの設定 from transformers import TrainingArguments from datasets import Dataset from torch.utils.data import DataLoader # 教師なしSimCSEの訓練のハイパーパラメータを設定する from transformers import Trainer unsup_training_args = TrainingArguments( class SimCSETrainer(Trainer): output_dir="outputs_unsup_simcse", per_device_train_batch_size=64, # 訓練時のバッチサイズ per_device_eval_batch_size=64, # 評価時のバッチサイズ learning_rate=3e-5, # 学習率 num_train_epochs=1, # 訓練エポック数 evaluation_strategy="steps", eval_steps=250, save_steps=250, fp16=True, # 検証セットによる評価のタイミング # チェックポイントを保存する訓練ステップ数の間隔 self, eval_dataset: Dataset | None = None 検証・テストセットのDataLoaderでeval_collate_fnを使うように Trainerのget_eval_dataloaderをオーバーライド """ if eval_dataset is None: # 保存するチェックポイントの最大数 # 自動混合精度演算の有効化 load_best_model_at_end=True, remove_unused_columns=False, eval_dataset = self.eval_dataset return DataLoader( # 最良のモデルを訓練終了後に読み込むか eval_dataset, # 最良のモデルを決定する評価指標 batch_size=64, metric_for_best_model="spearman", report_to="none", def get_eval_dataloader( """ # ロギングを行う訓練ステップ数の間隔 save_total_limit=1, """SimCSEの訓練に使用するTrainer""" ) -> DataLoader: # 検証セットによる評価を行う訓練ステップ数の間隔 logging_steps=250, ) # 結果の保存先フォルダ # データセットの不要フィールドを削除するか collate_fn=eval_collate_fn, # 外部ツールへのログを無効化 pin_memory=True, ) 10

12.

教師なしSimCSE 訓練 ・unsup_trainer.train() ・結果 # 教師なしSimCSEのTrainerを初期化する unsup_trainer = SimCSETrainer( model=unsup_model, args=unsup_training_args, data_collator=unsup_train_collate_fn, train_dataset=unsup_train_dataset, eval_dataset=valid_dataset, compute_metrics=compute_metrics, ) # 教師なしSimCSEの訓練を行う unsup_trainer.train() # 検証セットで教師なしSimCSEのモデルの評価を行う unsup_trainer.evaluate(valid_dataset) # テストセットで教師なしSimCSEのモデルの評価を行う unsup_trainer.evaluate(test_dataset) 11

13.

教師ありSimCSE 12

14.

教師ありSimCSE データセット: 訓練 JSNLI: 日本語の自然言語推論データセット。 京都大学が公開している、SNLIを日本語に翻訳したおよそ50万の前提文-仮説文ペアからなるデータセット。 from datasets import load_dataset # Hugging Face Hubのllm-book/jsnliのリポジトリから # JSNLIの訓練セットを読み込む jsnli_dataset = load_dataset("llm-book/jsnli", split="train") ・例 ラベル: 含意(Entailment) 前提文(Premise): 「田中さんはレストランで食事しまし た。」 仮説文(Hypothesis): 「田中さんは外食しました。」 ラベル: 矛盾(Contradiction) 前提文(Premise): 「山田さんは毎朝ジョギングします。」 仮説文(Hypothesis): 「山田さんは毎朝泳ぎます。」 ラベル: 中立(Neutral) 前提文(Premise): 「佐藤さんは週末に映画が好きです。」 仮説文(Hypothesis): 「佐藤さんは音楽をします。」 13

15.
[beta]
教師ありSimCSE
データセット: 前処理
文章ごとに対応するラベルに文章を振り分ける。
それぞれの文章に対して「含意」(Entailment)、「矛盾」(Contradiction)、「中立」(Neutral)の文章を登録する。
{

import csv

'田中さんはレストランで食事しました。': {
'entailment': ['田中さんは外食しました。'],
'neutral': [],
'contradiction': ['田中さんは家で食事しました。']
},
'山田さんは毎朝ジョギングします。': {
'entailment': [],
'neutral': [],
'contradiction': ['山田さんは毎朝泳ぎます。']
},
'佐藤さんは週末に映画が好きです。': {
'entailment': [],
'neutral': ['佐藤さんは音楽をします。'],
'contradiction': []
}

import random
from typing import Iterator

# JSNLIの訓練セットから、前提文とラベルごとに仮説文をまとめたdictを作成する
premise2hypotheses = {}

premises = jsnli_dataset["premise"]

# 前提文

hypotheses = jsnli_dataset["hypothesis"]
labels = jsnli_dataset["label"]

# 仮説文

# ラベル
}

for premise, hypothesis, label in zip(premises, hypotheses, labels):
if premise not in premise2hypotheses:
premise2hypotheses[premise] = {
"entailment": [],
"neutral": [],
"contradiction": [],
}

premise2hypotheses[premise][label].append(hypothesis)

14

16.
[beta]
教師ありSimCSE
データセット: 前処理
各前提分に対してランダムに「含意」と「矛盾」仮説を1つ選び、組を生成する(同じ組み合わせになることもある)。
「中立」は使用しない。
def generate_sup_train_example() -> Iterator[dict[str, str]]:

[
{

"""教師ありSimCSEの訓練セットの事例を生成"""

"premise": "田中さんはレストランで食事しました。",
"entailment_hypothesis": "田中さんは外食しました。",
"contradiction_hypothesis": "田中さんは家で食事しました。"

# JSNLIのデータから (前提文,「含意」ラベルの仮説文,「矛盾」ラベルの仮説文)の三つ組を生成する
for premise, hypotheses in premise2hypotheses.items():

},
{

# 「矛盾」ラベルの仮説文が一つもない事例はスキップする

"premise": "田中さんはレストランで食事しました。",
"entailment_hypothesis": "田中さんは食事を楽しみました。",
"contradiction_hypothesis": "田中さんは食事をしませんでした。"

if len(hypotheses["contradiction"]) == 0:
continue
# 「含意」ラベルの仮説文一つにつき、「矛盾」ラベルの仮説文一つをランダムに関連付ける

}
]

for entailment_hypothesis in hypotheses["entailment"]:
contradiction_hypothesis = random.choice(
hypotheses["contradiction"])

# (前提文,「含意」ラベルの仮説文,「矛盾」ラベルの仮説文) の三つ組をdictとして生成する
yield {
"premise": premise,
"entailment_hypothesis": entailment_hypothesis,
"contradiction_hypothesis": contradiction_hypothesis,
}
# 定義したジェネレータ関数を用いて、教師ありSimCSEの訓練セットを構築する
sup_train_dataset = Dataset.from_generator(generate_sup_train_example)

15

17.
[beta]
教師ありSimCSE
Collate関数
・sup_train_collate_fn()
「含意」と「矛盾」仮説を含むミニバッチを作成し、それぞれにトークナイザを適用する。
検証セットとテストセットのcollate関数は教師なしSimCSEと同じものを使用。
今回は前提文と「含意」の文章ペアのみを正例として、「矛盾」や他の文章は負例として学習
def sup_train_collate_fn(examples: list[dict]) -> dict[str, BatchEncoding | Tensor]:
"""訓練セットのミニバッチを作成"""
premises = []

hypotheses = []
for example in examples:
premises.append(example["premise"])
entailment_hypothesis = example["entailment_hypothesis"]
contradiction_hypothesis = example["contradiction_hypothesis"]
hypotheses.extend([entailment_hypothesis, contradiction_hypothesis])

# ミニバッチに含まれる前提文と仮説文にトークナイザを適用する
tokenized_premises = tokenizer(premises,padding=True,truncation=True,max_length=32,return_tensors="pt",)
tokenized_hypotheses = tokenizer(hypotheses,padding=True,truncation=True,max_length=32,return_tensors="pt",)
labels = torch.arange(0, 2 * len(premises), 2)

return {

"tokenized_texts_1": tokenized_premises,
"tokenized_texts_2": tokenized_hypotheses,
"labels": labels,
}

16

18.

教師なしSimCSE ・類似度行列 含意仮説(0, 2, 4..)が正例 17

19.

教師ありSimCSE モデル ・sup_model 教師ありSimCSEではモデル訓練時と推論時の両方でMLP 層を使用する。 ・SimCSETrainer 教師なしで定義したtrainerと同じ # 教師ありSimCSEのモデルを初期化する from datasets import Dataset sup_model = SimCSEModel(base_model_name, mlp_only_train=False) from torch.utils.data import DataLoader from transformers import Trainer # 教師ありSimCSEの訓練のハイパーパラメータを設定する sup_training_args = TrainingArguments( output_dir="outputs_sup_simcse", # 結果の保存先フォルダ per_device_train_batch_size=128, # 訓練時のバッチサイズ per_device_eval_batch_size=128, # 評価時のバッチサイズ """SimCSEの訓練に使用するTrainer""" def get_eval_dataloader( self, eval_dataset: Dataset | None = None ) -> DataLoader: learning_rate=5e-5, # 学習率 """ num_train_epochs=3, # 訓練エポック数 検証・テストセットのDataLoaderでeval_collate_fnを使うように evaluation_strategy="steps", eval_steps=250, save_steps=250, # ロギングを行う訓練ステップ数の間隔 Trainerのget_eval_dataloaderをオーバーライド """ if eval_dataset is None: # チェックポイントを保存する訓練ステップ数の間隔 save_total_limit=1, fp16=True, # 検証セットによる評価のタイミング # 検証セットによる評価を行う訓練ステップ数の間隔 logging_steps=250, # 保存するチェックポイントの最大数 eval_dataset = self.eval_dataset return DataLoader( # 自動混合精度演算の有効化 load_best_model_at_end=True, remove_unused_columns=False, eval_dataset, # 最良のモデルを訓練終了後に読み込むか metric_for_best_model="spearman", ) class SimCSETrainer(Trainer): batch_size=64, # 最良のモデルを決定する評価指標 collate_fn=eval_collate_fn, # データセットの不要フィールドを削除するか pin_memory=True, ) 18

20.

教師ありSimCSE 訓練 ・sup_trainer.train() ・性能評価 # 教師ありSimCSEのTrainerを初期化する sup_trainer = SimCSETrainer( model=sup_model, args=sup_training_args, data_collator=sup_train_collate_fn, train_dataset=sup_train_dataset, eval_dataset=valid_dataset, compute_metrics=compute_metrics, ) # 教師ありSimCSEの訓練を行う sup_trainer.train() # 検証セットで教師なしSimCSEのモデルの評価を行う unsup_trainer.evaluate(valid_dataset) # テストセットで教師なしSimCSEのモデルの評価を行う unsup_trainer.evaluate(test_dataset) 19

21.

最近傍探索ライブラリFaissを使った検索 Faissとは? Meta Reserachによって開発されているベクトルの最近某探索やクラスタリングを行うためのライブラリ。 特長 ・文埋め込みのような高次元のベクトルを効率的にインデックス化し、クエリのベクトルに対して類似した ベクトルを高速に検索できる。本体はC++による実装。pipでインストール可能。 探索の手法(IVFが一般的) ・Flat 与えられたベクトルをメモリ空間にそのまま展開(検索は総当り) ・IVF ベクトルをクラスタリングし、検索時は、指定したベクトルに近いクラスタをを対象に検索 エンコーディング手法 ・PQ 直積量子化 ・RQ 回帰分析の残差 20

22.
[beta]
最近傍探索ライブラリFaissを使った検索
データセット
・日本語wikiからデータを取得。
段落ごとにテキストが保存されている。各記事の最初の段
落のみを使うようにフィルタリング

・内容

from datasets import load_dataset

{'html_tag': 'p',

from pprint import pprint

'id': '5-89167474-0',
'pageid': 5,

# Hugging Face Hubのllm-book/jawiki-paragraphsのリポジトリから

'paragraph_index': 0,

# Wikipediaの段落テキストのデータを読み込む

'revid': 89167474,

paragraph_dataset = load_dataset(

'section': '__LEAD__',

"llm-book/jawiki-paragraphs", split="train"

'text': 'アンパサンド(&, 英語: '

)

'ampersand)は、並立助詞「...と...」を意味する記号である。ラテン語で「...と...」
を表す接続詞 "et" '

# 段落データの内容を確認する
pprint(paragraph_dataset[0])

'の合字を起源とする。現代のフォントでも、Trebuchet MS など一部のフォントでは、
"et" '

pprint(paragraph_dataset[1])

'の合字であることが容易にわかる字形を使用している。',
'title': 'アンパサンド'}

# 段落データのうち、各記事の最初の段落のみを使うようにする
paragraph_dataset = paragraph_dataset.filter(
lambda example: example["paragraph_index"] == 0
)

{'html_tag': 'p',
'id':
……
'title': 'アンパサンド'}
……

21

23.
[beta]
最近傍探索ライブラリFaissを使った検索
トークナイザ
・定義、呼び出し
from transformers import AutoModel, AutoTokenizer

・埋め込み関数
def embed_texts(texts: list[str]) -> np.ndarray:
"""SimCSEのモデルを用いてテキストの埋め込みを計算"""

# Hugging Face Hubにアップロードされた

# テキストにトークナイザを適用

# 教師なしSimCSEのトークナイザとエンコーダを読み込む

tokenized_texts = tokenizer(

model_name = "llm-book/bert-base-japanese-v3-unsup-simcse-jawiki"

texts,

tokenizer = AutoTokenizer.from_pretrained(model_name)

padding=True,

encoder = AutoModel.from_pretrained(model_name)

truncation=True,

max_length=128,
# 読み込んだモデルをGPUのメモリに移動させる
device = "cuda:0"
encoder = encoder.to(device)

return_tensors="pt",
).to(device)
# トークナイズされたテキストをベクトルに変換
with torch.inference_mode():

# 段落データのすべての事例に埋め込みを付与する
paragraph_dataset = paragraph_dataset.map(

with torch.cuda.amp.autocast():
encoded_texts = encoder(

lambda examples: {
"embeddings": list(embed_texts(examples["text"]))

)

**tokenized_texts
).last_hidden_state[:, 0]

},

# ベクトルをNumPyのarrayに変換

batched=True,

emb = encoded_texts.cpu().numpy().astype(np.float32)
# ベクトルのノルムが1になるように正規化
emb = emb / np.linalg.norm(emb, axis=1, keepdims=True)

return emb

22

24.
[beta]
最近傍探索ライブラリFaissを使った検索
トークナイザ
・埋め込みデータの確認
# 埋め込みを付与した段落データの形式と事例数を確認する

print(paragraph_dataset)
# 埋め込みを計算した段落データの内容を確認する
pprint(paragraph_dataset[0])

# 埋め込みを付与した段落データをディスクに保存する

paragraph_dataset.save_to_disk(
"outputs_unsup_simcse/embedded_paragraphs"
)

・データ
{'embeddings': [0.04253670945763588,
-0.041921038180589676,
-0.03232395276427269
………
0.006959658116102219,
-0.023598121479153633,
-0.0010074099991470575,
0.001247039414010942],
'html_tag': 'p',
'id': '5-89167474-0',
'pageid': 5,
'paragraph_index': 0,
'revid': 89167474,
'section': '__LEAD__',
'text': 'アンパサンド(&, 英語: '
'ampersand)は、並立助詞「...と...」を意味する記号である。ラテン語で「...と...」
を表す接続詞 "et" '
'の合字を起源とする。現代のフォントでも、Trebuchet MS など一部のフォントでは、
"et" '
'の合字であることが容易にわかる字形を使用している。',
'title': 'アンパサンド'}

23

25.

最近傍探索ライブラリFaissを使った検索 Faissによる最近傍探索 ・最近傍探索 import faiss # ベクトルの次元数をエンコーダの設定値から取り出す emb_dim = encoder.config.hidden_size # ベクトルの次元数を指定して空のFaissインデックスを作成する index = faiss.IndexFlatIP(emb_dim) # 段落データの"embeddings"フィールドのベクトルからFaissインデックスを構築する paragraph_dataset.add_faiss_index("embeddings", custom_index=index) query_text = "日本語は、主に日本で話されている言語である。" # 最近傍探索を実行し、類似度上位10件の事例とスコアを取得する scores, retrieved_examples = paragraph_dataset.get_nearest_examples( "embeddings", embed_texts([query_text])[0], k=10 ) # 取得した事例の内容をスコアとともに表示する titles = retrieved_examples["title"] texts = retrieved_examples["text"] for score, title, text in zip(scores, titles, texts): print(score, title, text) ・結果 0.78345203 日本の言語 日本の言語(にほんのげんご)は、日本の国土で使用されている言語について記述する。日本# 言語も参照。 0.75877357 日本語教育 日本語教育(にほんごきょういく)とは、外国語としての日本語、第二言語としての日本語につ いての教育の総称である。 0.7494176 日本語学 日本語学(にほんごがく)とは、日本語を研究の対象とする学問である。 0.74729466 日本語 日本語(にほんご、にっぽんご、英語: Japanese)は、日本国内や、かつての日本領だった国、そ して国外移民や移住者を含む日本人同士の間で使用されている言語。日本は法令によって公用語を規定し ていないが、法令その他の公用文は全て日本語で記述され、各種法令において日本語を用いることが規定 され、学校教育においては「国語」の教科として学習を行う等、事実上、日本国内において唯一の公用語 となっている。 0.7045407 国語 (教科) 国語(こくご、英: Japanese Language)は、日本の学校教育における教科の一つ。 0.7029643 和製英語 和製英語(わせいえいご)は、日本語の中で使われる和製外来語の一つで、日本で日本人により作 られた、英語の言葉や英語に似ている言葉(固有名詞や商品名などを除く)である。英語圏では別表現をす るために理解されなかったり、もしくは、全く異なった解釈をされたりする場合がある。 0.6956495 口語 口語(こうご)とは、普通の日常的な生活の中での会話で用いられる言葉遣いのことである。書記言語 で使われる文語と違い、方言と呼ばれる地域差や社会階層などによる言語変種が応じやすく、これらと共 通語などを使い分ける状態はダイグロシアと呼ばれる。 0.6944481 ジャパン ジャパン(英語: Japan)は、英語で日本を意味する単語。 0.6911353 日本語学科 日本語学科(にほんごがっか)とは、日本語を教育研究することを目的として大学や専門学校な どの高等教育機関に置かれる学科の名称である。 0.6908301 日本語学校 日本語学校(にほんごがっこう)とは、主に日本語を母語としない者を対象として、第二言語・ 外国語としての日本語教育を実施する機関。日本国内外に存在している。 24