見出し画像

[機械学習]-マルコフ連鎖で紫式部の新作をつくってみた

マルコフ連鎖とは、遷移確率に基づいてランダムな状態の系列を生成する手法です。つまり、紫式部の文書を学習させれば、紫式部のような文書を生成することが可能です。今回は、「源氏物語」の「初音」の帖を題材にして生成してみました。

「初音」の帖を題材にして生成

生成した文章内容
花園のさ短されたから信頼されて、女房がなお身の上であると気どって、その点で吹き出したふうを》を持たれてい艶《ひま》の感ぜられるが少しも、女房たちではした歌などは「ちょっとうたた寝をすることでいたの院へはいって、夜も取り寄せて別れていた。 花園の報いが、不快にも下品下のを言う言葉が選ばれただけのことですよ。 花園のももうその柔らかいふうな風采《あけぼの》にかぶって、尊《に出かけようと思わなかったお返しを払って、みずから慰めている六条院のをした。 花園の日で、料理のを祝って、音楽者がこの感情を紛らせて、心をされまして着物を席に行なわせずに、遠慮なく言った。 花園のに言った。

「初音」は光源氏の栄華を描いたお話であることから、吉祥の帖とされ、光源氏が、娘・明石の姫君が紫の上と暮らす屋敷を元旦に訪れたときの様子と、そこへ届いた実母・明石の君の和歌の情景が描かれています


このPythonプログラムは、マルコフ連鎖、新規文書生成するためのツールです。技術的には、各状態が過去の状態に依存する確率的な遷移を行うことで、初期状態から開始して次々に状態を遷移させることで系列(この場合、文書)を生成します。

マルコフ連鎖は、テキスト生成や予測モデリングなど、様々な応用で利用されます。

(1)はじめに

機械学習と数理最適化 Advent Calendar 2023 チャレンジ の文書です。

の下図のとおり、機械学習の分、作成です。

LLM (Language Model) との違い
LLM (Language Model) は、自然言語の文や文書の生成や評価を行うための統計的モデルです。LLM は、与えられた文脈から次の単語を予測する能力を持ちます。このモデルは、大規模なコーパス(文集合)を学習して単語の出現確率を推定し、次の単語を生成する際にその確率を考慮します。


具体的には、マルコフ連鎖を用いたテキスト生成では、学習データから遷移確率を推定し、初期状態から始めて次々に単語を遷移させることで新たな文章を生成します。一方、LLM は、このようなテキスト生成のタスクに応用されることがあります。遷移確率の推定は、統計的なアプローチや深層学習の手法を用いて行われます。

つまり、マルコフ連鎖は確率的な系列生成手法であり、LLM はその一部として考えることができるのです。

(2)想定している一般的な活用シーン

  1. テキスト生成: マルコフ連鎖(LLM含む)は、与えられたテキストデータから新しい文や文章を生成するために使用されます。例えば、小説や詩の自動生成、音楽の作曲、コンピューターゲームのイベントやダイアログの生成などに利用されています。

2.質問応答システム: マルコフ連鎖(LLM含む)は、質問応答システムにおいて活用されています。与えられた質問に対して、学習データから得られた遷移確率を基に回答を生成することができます。

(2)当コードについて


このPythonプログラムは、テキストデータからランダムな文を生成するために、形態素解析とマルコフ連鎖を使用しています。
指定された単語("花園")から始まる文を5つ生成するだけでなく、他の開始単語を指定しても新しい文を生成できます。

(3)コードの概要


以下に、コードの概要と詳細な説明を示します。

概要:

  1. 環境設定: JanomeとMarkovifyのライブラリをインストールし、必要なモジュールをインポートします。

  2. データ設定: 文を取得し、形態素解析のためにテキストを前処理して単語リストを作成します。

  3. 形態素解析: Janomeライブラリを使用してテキストを形態素解析し、単語リストを作成します。

  4. 文生成: マルコフ連鎖を使用してランダムな文を生成します。

  5. 結果出力: "花園"という単語から始まる5つのランダムな文を画面に出力します。

(4)コード詳細説明

[0] 環境設定:

  • !pip install janome および !pip install markovify でJanomeとMarkovifyライブラリをインストールします。

  • from janome.tokenizer import Tokenizerimport random で必要なモジュールをインポートします。

[1] データ設定:

  • https://miraimeisatu.github.io/covid19_2021/murasaki-sikibu.txt からテキストデータを読み込みます。

  • line 変数は、後で形態素解析で得られたトークンを連結するための空の文字列です。

[2] 形態素解析:

  • Tokenizer() を使用してテキストを形態素解析し、各トークンを line に連結します。

  • word_list には、トークンを | で区切った単語のリストが格納されます。

  • dictionary は、各単語に続く単語のリストを格納するための辞書です。

[3] 文生成:

  • generator 関数は、指定された開始単語からランダムな文を生成します。生成は次の単語を辞書からランダムに選んで繰り返し、句点が出現するまで続けられます。

[4] 結果出力:

  • "花園"から始まる5つのランダムな文を生成し、画面に出力します。generator 関数を5回呼び出すことで、5つの異なる文を表示します。


Google Colaboratory(通称Colab)は、Googleが提供するクラウドベースのJupyterノートブック環境で動作するようにしてあります。
元データを設定して、自社環境に合う形で使ってくさい。

今回は全文です。

# **********************
# [0] 環境設定 *********
# **********************
!pip install janome
!pip install markovify

from janome.tokenizer import Tokenizer
import random

#環境初期化
t = Tokenizer()

# **********************
# [1] データ設定 *******
# **********************
##個人のGITHUB環境です
with open('https://miraimeisatu.github.io/covid19_2021/murasaki-sikibu.txt', mode='r', encoding='shift_jis') as f:
    s = f.read()

line = ""

# **********************
# [2] 形態素解析 *******
# **********************
for token in t.tokenize(s):
    line += token.surface
    line += "|"

word_list = line.split("|")
word_list.pop()

dictionary = {}
queue = ""
for word in word_list:
    if queue != "" and queue != "。":
        if queue not in dictionary:
            dictionary[queue] = []
            dictionary[queue].append(word)
        else:
            dictionary[queue].append(word)
    queue = word

# **********************
# [3] 文生成 ***********
# **********************
def generator(start):
    sentence = start
    now_word = start
    for i in range (100):
        if now_word == "。":
            break
        else:
            next_word = random.choice(dictionary[now_word])
            now_word = next_word
            sentence += next_word
    return sentence

# **********************
# [4] 結果出力 *********
# **********************
# 画面に単語:"花園"に関連する文を
# 5行出力します
for i in range(5):
    print(generator("花園"))


Colabについてわかりやすく説明します。

  1. 無料で利用可能: Colabは無料で利用できます。Googleアカウントを持っていれば、ブラウザ上で簡単に利用できます。GPUやTPUも利用でき、機械学習やディープラーニングのトレーニングなどに便利です。

  2. Jupyterノートブック形式: ColabはJupyterノートブック形式を採用しています。コードセルとテキストセルを組み合わせ、コードの実行と説明文を同じ場所で管理できます。

  3. クラウドベース: Colabはクラウド上で動作するため、自分のマシンに環境を構築する必要がありません。また、Google Driveとの連携も容易で、ノートブックを保存し、共有することができます。

  4. 豊富なライブラリとハードウェアアクセラレーション: Colabには多くの機械学習やデータサイエンスに使用されるライブラリが事前にインストールされています。また、GPUやTPUなどのハードウェアアクセラレーションも利用可能で、大規模な計算を高速に行うことができます。

  5. 共有と協力: ノートブックはGoogle Driveに保存され、他のユーザーと共有しやすいです。また、リアルタイムで共同作業も可能です。

  6. データの可視化と解析: Colabにはデータの可視化や解析に役立つツールが豊富に組み込まれています。例えば、MatplotlibやSeabornなどのライブラリを使ってグラフを描画することができます。

Colabは教育、研究、プロトタイピング、データ解析、機械学習のトレーニングなど、さまざまな目的に利用されています。無料で使えるため、手軽に始めることができ、Googleのクラウドリソースを利用できる点が魅力です。

追記:


機械学習と数理最適化について

機械学習と数理最適化 Advent Calendar 2023 チャレンジ している理由

#機械学習 ,#ChatGPT,#量子コンピューター,#AI,
#クリスマス ,#AIとやってみた,#アドベントカレンダー,#量子コンピューター,#数理最適化,#量子アニーリング

よろしければサポートよろしくお願いします。いただいたサポートは、日中韓とアメリカのリアルタイム感情分析を進めるために使わせていただきます