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よりご視聴ください。
〇解説用スライド形式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
さんが
2026/02/15
に
編集
をしました。
(メッセージ: 初版)
-
taketea2018
さんが
2026/02/15
に
編集
をしました。
-
taketea2018
さんが
2026/02/15
に
編集
をしました。
-
taketea2018
さんが
2026/02/15
に
編集
をしました。
-
taketea2018
さんが
2026/02/15
に
編集
をしました。
-
taketea2018
さんが
2026/02/15
に
編集
をしました。
-
taketea2018
さんが
2026/02/15
に
編集
をしました。
-
taketea2018
さんが
2026/02/22
に
編集
をしました。
-
taketea2018
さんが
2026/02/22
に
編集
をしました。
ログインしてコメントを投稿する