別棟備忘録4

*

マルコフ連鎖による文章生成_高校探究用

   

こちらのエントリでは分かち書きからマルコフ連鎖で文章生成をしてみました。
ただ、案外生徒に配布されているタブレットはインストールの制約が厳しいことがあり、Mecabのインストールの段で躓くこともあり。。
そして、配列の扱いが洗練されていて、逆に言うと授業でよく扱う「野暮ったいけど汎用性が高い」ものではないという、扱いにくさがありました。

そこで、インストールがpip install janomeで済むjanomeを分かち書きに使うことと、配列を2次元配列の入門的扱いまでとどめることを目標に、コードを修正しました。

こちらがコード。

# -*- coding: utf-8 -*-
from janome.tokenizer import Tokenizer
t = Tokenizer()
txt_data = '富山県はブラックラーメンが有名です。石川県は人が減少中。その高校はブラック校則が有名ですか。'
print("*******原文*******")
print(txt_data)
print("*******分かち書き*******")
Word_list = list(t.tokenize(txt_data,wakati=True))
print(Word_list)
#*******重複のないword_listの作成*********
Word_list_single = []
for word in Word_list:
    if word not in Word_list_single:
        Word_list_single.append(word)
gosu = len(Word_list_single)#重複しない単語の数
print(Word_list_single,gosu,"語")
#*******modelの生成*********************
Word_list.insert(0, "。")
Model = [[]for i in range(gosu)]
for i in range(gosu):
    Model[i].append(Word_list_single[i])
print("*******modelの生成*******")
print("0番目の要素に続く可能性のある語を1番目、2番目…の要素に追記します")
#print(model)
for j in range(gosu):
    word = Word_list_single[j]
    for i in range(len(Word_list)-1):
        if Word_list[i] == word:
            Model[j].append(Word_list[i+1])
print(Model)
#*******マルコフ連鎖による作文**************
print("*******マルコフ連鎖*******")
import random
sentence = ""
select_word = "。"#BoS(文章の始まり)の代わりに読点を使います。
for j in range(40):#最大で40語の文章を生成
    for i in range(gosu):
        if Model[i][0] == select_word:
            num = random.randint(1,len(Model[i])-1)
            select_word = Model[i][num]#後に続く語をランダムに選択
            break
    sentence = sentence + select_word
    print(Model[i][1:len(Model[i])]) #作文過程を表示する記述。省略可。
    print(sentence) #作文過程を表示する記述。省略可。
    if select_word == "。":#「。」が来ると作文を停止
        break

実行結果はこんな感じです。

以下、50分くらいの授業で(プログラムというより原理を)扱うワークシートです。
【提出用】2023情報Ⅰ_文章生成_20240828

 - Python, 備忘録