LoginSignup
1
2

More than 1 year has passed since last update.

Pythonでマルコフ連鎖みたいなものを作ってみた

Posted at

概要

ある日私はこう思いました。

無限に文章を作るプログラムを作ってみたい!

と。

ですが私はAIを作る技術もありません。
そこで目に入ったのがマルコフ連鎖です。

janome入れる

janomeってのは日本語を分かち書きしたりするライブラリです。
janomeを入れるコマンドは以下のようになります。

pip install janome

もしくは

py -m pip install janome

ちなみに同じようなライブラリとしてMeCabというのもあるみたいです。

とりあえず書く

とりあえず書いてみましょう。テキストデータを先に作っておきます。これはBingAIに作らせました。

textdata.txt
C++の難しさについて笑ってみましょう
C++はプログラミング言語の中でも特に難しいと言われています。なぜでしょうか?
それは、C++が多くの機能を持ちすぎているからです。
C++はオブジェクト指向、ジェネリック、関数型、メタプログラミングなど、さまざまなパラダイムに対応しています。
しかし、それらの機能を使いこなすには高度な知識と経験が必要です。
C++は自由度が高い分、落とし穴も多いのです。

例えば、C++ではポインタという概念があります。
ポインタとは、メモリ上のある場所を指し示すものです。
ポインタを使えば、効率的にデータを扱うことができます。
しかし、ポインタを使い間違えると、
メモリリークやセグメンテーション違反などの深刻なエラーを引き起こす可能性があります。
ポインタを扱うには、メモリ管理の仕組みやアドレス空間の
構造などを理解しておく必要があります。

テキストデータは完成しました。
プログラム本体も書いてみましょう。

import random
from janome import tokenizer

word_dicts = {}

textdata_file = open("textdata.txt", "r", encoding="utf-8") #テキストデータを読み込みます。

textdata = textdata_file.read()
textdata = textdata.replace("\n", "")

Tokenizer = tokenizer.Tokenizer(wakati=True) #分かち書きモードのTokenizerを設定します。
textdata_wakati = Tokenizer.tokenize(textdata) #ここで分かち書きをします。

word_list = list(textdata_wakati)

word_list.append("EOS") #生成を終わらせる単語

for i in range(0, len(word_list) - 1):
    word = word_list[i]
    word_dicts[word] = []

for j in range(0, len(word_list) - 1):
    word = word_list[j]
    next_word = word_list[j + 1]
    word_dicts[word].append(next_word)    

#生成する

g_word = word_list[0]
print(g_word,end = "")
for i in range(100):
    g_word_list = word_dicts[g_word]
    indexs = word_list.index(g_word)
    if len(g_word_list) > 0:
        g_word = random.choice(g_word_list)
    else:
        g_word = word_list[ indexs + 1 ]

    if g_word == "EOS":
        break
    else:
        print(g_word, end = "")

汚いコードでごめんなさい
実行結果です。
一つ目

C++でも特に難しいと言われているからです。しかし、落とし穴も多いの機能を持ちすぎてみましょうC++が必要です。ポインタを使い間違えるとは、C++でも特に
難しいと、さまざまな知識と経験があります

二つ目

C++ではポインタを使い間違えるとは、ポインタを使えば、メタプログラミングなどの難しさについて笑っておく必要です。ポインタと経験が必要です。ポインタ 
を指し示すものです。ポインタという概念があります。C++では自由度があります。C++は自由度があります。C++は自由度が多くの中では、さまざまなエラーを扱 
うには、C++は高度なパラダイムにはオブジェクト指向、メモリ管理

終わりに

マルコフ連鎖であるのかはわかりませんでしたが、文章生成できたのでよしとしましょう。
若干不自然なところはありますけど悪いってわけでもないと思います。

ここまで読んでくれてありがとうございました。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2