taketea2018 が 2026年02月22日11時01分06秒 に編集
コメント無し
本文の変更
# ** データサイエンス入門 ** AIプログラミングで学ぶデータサイエンス ## 第2回 Python によるマルコフ連鎖で文章生成に挑戦! 
Pythonを用いた日本語の自動文章生成の仕組みと実践方法を解説します。
第1回で準備設定したGoogleColaboratory(以後、GoogleColab)環境はうまく使えているでしょうか。
まず、MeCabライブラリを活用し、文章を最小単位に分解する形態素解析の重要性について説明します。
文章生成型AIと呼ばれるChatGPTがテレビやネット新聞紙上をにぎわせています。自然な文章で質問を入力でき、自然な文章で答えを生成してくれるAIの代表格がChatGPTです。指示文章から画像を生成してくれるAIも増えているようです。
次に、分解された単語のつながりを確率的に選択するマルコフ連鎖というアルゴリズムを用いて、新しい文章を組み立てる手順を紹介しています。Google Colaboratoryでの具体的なプログラミング手法が示されており、辞書の作成から読みやすい形式への加工までを網羅しています。
生成型AIを仕事や学業に利用するのは是か非か、利点や問題点はどのような部分か、今後の利用方針はどうすればいいかなど、様々な議論が始まっています。AIを利用する方法に話題は集中しています。しかし、プログラムにより動いているAIを作るにはどんな知識や技術が必要なのかはあまり知られていないに感じます。その動作原理がわかれば、より理解を深めることができます。
最終的に、生成AIの基盤となる技術を理解することで、国産AIの活性化や技術への深い洞察を促す内容となっています。
世界中にあふれている文章を解析する技術を「テキストマイニング」といいます。文章を解析するには単語単位に分解することが必要です。単語や助詞など文章を構成する最小単位を形態素といい、分解解析することが「形態素解析」です。その一つが「分かち書き」です。「私は昨日旅行に行きました。」は形態素解析すると「私/は/昨日/旅行/に/行きました/。」と分かち書きされます。
登場するのは、オリジナルキャラクターの「あいぴ」です。
英文を代表とする多くの言語において単語は空白で区切られた状態で文章中に存在しており、改めて分かち書きする必要はありません。その点日本語は漢字とひらがな、カタカナが混在した世界でも類を見ない複雑な言語のひとつです。そのために分かち書きなど文章を解析する技術が発達しました。
### 〇動画は下記URLよりご視聴ください。
生成型AIプログラミングを試すには、日本語文章を形態素解析により分かち書きするなどAIが処理しやすい形にする必要があります。そこで、生成型AIプログラミングの前段階として、マルコフ連鎖を利用したPythonプログラムによる文章生成に挑戦しましょう。 Pythonは文字を扱うための豊富なライブラリが揃っているので、文章生成プログラムを試すにはもってこいです。形態素解析ライブラリとしてmecab(和布蕪)を利用します。mecabは分かち書きだけでなく、品詞分類もできる多機能な形態素解析ライブラリです。 登場するのはオリジナルキャラクターの「あいぴ」です。 ###〇動画は下記URLよりご視聴ください。
https://youtu.be/mfFhUTdv3w0
### 〇PDF解説書です。
## 〇解説用スライド形式pdfです。
https://drive.google.com/file/d/1VgRc7LRKMiHx6hvW_6Kj9U9TuZOtXG9b/view?usp=drive_link
### 〇マルコフ連鎖用元文書です。
## 〇マルコフ連鎖用元文書です。
https://drive.google.com/file/d/1DGFBC4hjzeWFjgFA2R7k0SE73rXp1B9f/view?usp=drive_link
### 〇サンプルプログラム
## 〇サンプルプログラム
GoogleColaboratoryにアップロードすればすぐに動作を確認できます。実行結果のサンプル付きです。
``` !pip install mecab-python3 !pip install unidic !python -m unidic download !apt-get -q -y install mecab libmecab-dev file !git clone --depth 1 https://github.com/neologd/mecab-unidic-neologd.git !echo yes | mecab-unidic-neologd/bin/install-mecab-unidic-neologd -n ``` ``` #!/usr/bin/env python # -*- coding: utf-8 -*- import random import MeCab #import codecs from google.colab import drive drive.mount('/content/drive') #filename = "/content/drive/MyDrive/data_science/tonari_missile.txt" filename = "/content/drive/MyDrive/data_science/tonari_takato.txt" #filename = "/content/drive/MyDrive/data_science/hajimeni.txt" source_text=open(filename,"r",encoding="utf-8").read() #print("元文書:",source_text) temp1 = MeCab.Tagger("-Owakati") temp1 = temp1.parse(source_text) wakachi = temp1.rstrip(" \n").split(" ") print("分かち書き結果:",wakachi) # マルコフ連鎖用辞書の作成 mjisho={} #jishoという名前で空辞書準備 kotoba_mae="" #連鎖用前の言葉 kotoba_ato="" #連鎖用後の言葉 for tango in wakachi: #wakachiからkotobaに単語を取り出す if (kotoba_mae,kotoba_ato) not in mjisho: mjisho[(kotoba_mae,kotoba_ato)]=[] mjisho[(kotoba_mae,kotoba_ato)].append(tango) kotoba_mae=kotoba_ato kotoba_ato=tango print("辞書:",mjisho) #文書生成 count = 0 bunsho="" mkey=list(mjisho.keys()) print("辞書のキー:",mkey) kotoba1,kotoba2=random.choice(mkey) print("分かち書きした単語の数:",len(wakachi)) while count < 200: tango = random.choice(mjisho[(kotoba1, kotoba2)]) print(kotoba1,kotoba2,tango) bunsho += tango kotoba1=kotoba2 kotoba2=tango count += 1 print("元文章:",filename) print('\n***** あいぴが執筆しました *****\n') count=1 for kotoba in bunsho: if kotoba=='「': print('\n') print (kotoba,end='') elif kotoba=='」': print(kotoba) print('\n',end='') count=1 elif kotoba=='\n': kotoba=' ' else: print(kotoba,end='') if count % 40== 0: print('\n',end='') count=1 count +=1 ```
https://drive.google.com/file/d/1R2sB8azQTfWE0nzfgv4fjZqcOZh68DCj/view?usp=drive_link
### 〇補足
## 〇補足
公開している動画とPDFは電波新聞社刊行電子工作マガジンに連載された同題名の内容をGoogle NotebookLMにてまとめています