taketea2018のアイコン画像
taketea2018 2026年02月15日作成 (2026年02月22日更新)
セットアップや使用方法 セットアップや使用方法 閲覧数 118
taketea2018 2026年02月15日作成 (2026年02月22日更新) セットアップや使用方法 セットアップや使用方法 閲覧数 118

データサイエンス入門 第2回 Python によるマルコフ連鎖で文章生成に挑戦!

** データサイエンス入門 **

AIプログラミングで学ぶデータサイエンス

第2回 Python によるマルコフ連鎖で文章生成に挑戦!

キャプションを入力できます

第1回で準備設定したGoogleColaboratory(以後、GoogleColab)環境はうまく使えているでしょうか。

文章生成型AIと呼ばれるChatGPTがテレビやネット新聞紙上をにぎわせています。自然な文章で質問を入力でき、自然な文章で答えを生成してくれるAIの代表格がChatGPTです。指示文章から画像を生成してくれるAIも増えているようです。

生成型AIを仕事や学業に利用するのは是か非か、利点や問題点はどのような部分か、今後の利用方針はどうすればいいかなど、様々な議論が始まっています。AIを利用する方法に話題は集中しています。しかし、プログラムにより動いているAIを作るにはどんな知識や技術が必要なのかはあまり知られていないに感じます。その動作原理がわかれば、より理解を深めることができます。

世界中にあふれている文章を解析する技術を「テキストマイニング」といいます。文章を解析するには単語単位に分解することが必要です。単語や助詞など文章を構成する最小単位を形態素といい、分解解析することが「形態素解析」です。その一つが「分かち書き」です。「私は昨日旅行に行きました。」は形態素解析すると「私/は/昨日/旅行/に/行きました/。」と分かち書きされます。

英文を代表とする多くの言語において単語は空白で区切られた状態で文章中に存在しており、改めて分かち書きする必要はありません。その点日本語は漢字とひらがな、カタカナが混在した世界でも類を見ない複雑な言語のひとつです。そのために分かち書きなど文章を解析する技術が発達しました。

生成型AIプログラミングを試すには、日本語文章を形態素解析により分かち書きするなどAIが処理しやすい形にする必要があります。そこで、生成型AIプログラミングの前段階として、マルコフ連鎖を利用したPythonプログラムによる文章生成に挑戦しましょう。

Pythonは文字を扱うための豊富なライブラリが揃っているので、文章生成プログラムを試すにはもってこいです。形態素解析ライブラリとしてmecab(和布蕪)を利用します。mecabは分かち書きだけでなく、品詞分類もできる多機能な形態素解析ライブラリです。

登場するのはオリジナルキャラクターの「あいぴ」です。

〇動画は下記URLよりご視聴ください。

https://youtu.be/mfFhUTdv3w0

〇解説用スライド形式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にてまとめています

taketea2018のアイコン画像
終刊してしまいましたが、電子工作マガジンにデータサイエンス入門を連載させて頂いていました。内容をリニューアルしての再掲載とその続きを投稿する予定です。一読いただければ幸いです。
ログインしてコメントを投稿する