AI研究所 - AI(人工知能)に脅かされないために、AI(人工知能)を作る側の人間になる -

HOME  >  [作り方を徹底解説] 人工知能が書いたAI入門ブログ

公開日:2017.10.31 

[作り方を徹底解説] 人工知能が書いたAI入門ブログ

カテゴリー: AI(人工知能)の作り方

昨日書いた「人工知能が書いたAI入門ブログ(マルコフ連鎖)」の記事について解説したいと思います。

今回は、AI入門ブログの「豆知識カテゴリー」の記事を全て形態素解析をして、辞書に登録し、マルコフ連鎖を用いてブログを自動的に作成しています。


マルコフ連鎖とは

マルコフ連鎖は、ロシアの数学者であるアンドレイ・マルコフ氏によって研究された確率過程の一種です。
マルコフ連鎖の特徴は、未来の挙動が現在の値だけで決定され、過去の挙動と無関係である「マルコフ性」を持つことです。
この仕組みを使うことで、ある程度意味の通った文章を作成することができます。

例えば、あらかじめ

「わたしは / マサミ / です。」
「彼は / マサシ / です。」
「わたしは / トマトが / 好き / です。」
「彼は / トマト / が / 嫌い / です。」

と言ったように分かち書きした文を登録しておきます。

そうすると、「わたしは」の後に取れる選択肢してし、「マサミ」か「トマトが」があります。
つまり、「わたしは」の後には「マサミ」が来る確率が1/2になります。
もし「マサミ」を選択した場合は、「です。」しか選択するものがないため「です。」を選択し、その後選択できる候補がないためここで終了します。
※ 厳密に分かち書きをすると「わたし / は」や「トマト / が」、「です / 。」になりますが分かりやすいように「わたしは」のようにしました。

もし、「わたしは」の後に「トマトが」を選択していたら、その後選択されうるのが「好き」か「嫌い」になります。

ここで注目していただいのがマルコフ性がある状態、つまり「未来の挙動が現在の値だけで決定され、過去の挙動と無関係である」状態なので、「トマトが」の前に来ている「わたしは」は無視されます。
そのため、「トマトが」の後に「好き」または「嫌い」が来る確率はどちらも1/2になります。


形態素解析とは

形態素解析は以前の記事「形態素解析をして日本語の文章を単語区切りにする方法」でも紹介しましたが、日本語などの自然言語の文章を、意味を持つ最小の単位である「形態素」に分割し、品詞を判別する作業です。
例えば、AI研究所のキャッチフレーズ「AIに脅かされないために、AIを作る側の人間になる」を形態素解析すると以下のようになります。

形態素解析の例
「AI / に / 脅かさ / れ / ない / ため / に / 、 / AI / を / 作る / 側 / の / 人間 / に / なる」

形態素解析は、今回のようにマルコフ連鎖を利用して文章生成する際や、機械学習で使用するデータを作成する際にもよく利用されます。


実際にプログラムを書いてみる

上記を踏まえた上でプログラムを書いてみたいと思います。

AI入門ブログの「豆知識カテゴリー」の記事を「blog.txt」という名前でテキストファイルとして保存し、読み込みます。

# テキストファイルを読み込む
sjis = open('blog.txt', 'rb').read()
text = sjis.decode('utf_8')

続いて、読み込んだテキストを形態素解析します。
形態素解析には「Janome」というライブラリを使います。

# テキストを形態素解析読み込みます
t = Tokenizer()
words = t.tokenize(text)

形態素解析した単語を辞書に登録しています。辞書はJSONファイルとして保存します。

# 辞書を生成します
def make_dic(words):
    tmp = ["@"]
    dic = {}
    for i in words:
        word = i.surface
        if word == "" or word == "\r\n" or word == "\n": continue
        tmp.append(word)
        if len(tmp) < 3: continue
        if len(tmp) > 3: tmp = tmp[1:]
        set_word3(dic, tmp)
        if word == "。":
            tmp = ["@"]
            continue
    return dic

# 三要素のリストを辞書として登録しています
def set_word3(dic, s3):
    w1, w2, w3 = s3
    if not w1 in dic: dic[w1] = {}
    if not w2 in dic[w1]: dic[w1][w2] = {}
    if not w3 in dic[w1][w2]: dic[w1][w2][w3] = 0
    dic[w1][w2][w3] += 1

dic = make_dic(words)
json.dump(dic, open("markov-blog.json", "w", encoding="utf-8"))

辞書をもとに記事を作成します。

# 記事を作文します
def make_sentence(dic):
    ret = []
    if not "@" in dic: return "no dic"
    top = dic["@"]
    w1 = word_choice(top)
    w2 = word_choice(top[w1])
    ret.append(w1)
    ret.append(w2)
    while True:
        w3 = word_choice(dic[w1][w2])
        ret.append(w3)
        if w3 == "。": break
        w1, w2 = w2, w3
    return "".join(ret)
    
for i in range(20):
    s = make_sentence(dic)
    print(s)

今回はマルコフ連鎖を仕様したため、ある程度意味のある記事を作成することができました。
ただ、ブログの最初に毎回書いてある、「こんにちは、AI研究所のマサミです。」を作文することはありませんでした。

これは、「AI」の後に選択されうる単語が「研究所」以外に多くあるためです。
仮に「研究所」が選択されたとしても「の」「マサミ」「です」「。」が選択される確率はかなり低いです。

ただ、「こんにちは、」ときたら「AI研究所のマサミです。」というふうに作文して欲しいですよね。
そういった場合は、時系列データを解析できる「RNN(再帰型ニューラルネットワーク)」を使って作文することで可能にしれくれます。
実際に「RNN」を使って機械学習させて作文させたところ、「こんにちは、AI研究所のマサミです。」と作文してくれました。

「RNN」で作文した記事も今後公開できればと思います!

タグ:


参考になったら「いいね!」と「シェア」をお願いします!!

このエントリーをはてなブックマークに追加
AI(人工知能)入門セミナー開催中
AI(人工知能)入門セミナー

AI入門ブログの中の人

AI研究所 研究スタッフ
通称:マサミ
アメリカ・サンフランシスコにある情報メディアの専門学校を卒業。大手金融会社での事務経験を経て、2016年9月よりAI研究所に入所。見習い研究員として、AI技術を日々勉強中。

LINE@

Facebookページ