【AI人工知能】Pythonで日本語自然言語処理(n-gram+マルコフ連鎖)をやってみた
日本語の自然言語処理について体験してみようと思い,原始的アルゴリズム『n-gram + マルコフ連鎖』のプログラムを走らせてみました.
感想.比較的簡単なアルゴリズム.
2-gramで生成した文章は,ほぼ意味不明な文章になる.入力データが少ないと、そのまま出力する.つまり,入力データには少なくとも2回以上の同じ単語(2文字)がないと新しい分を生成しない.が入力データを増やせば,新たな文章を生成するが,意味不明な文章を生成する確率も増す.このあたりのバランスというかジレンマというか,効率が悪い.
""" 2gram_markov.pyプログラム
2-gramの連鎖により文章を作成
開始文字をしていすると文章を生成
プログラムと同じフォルダに,text.txtというファイル名の
日本語入力データを置いてください。
使い方 C:\>python 2gram_markov.py """
# -*- coding: utf-8 -*-
# このプログラムは文字コードutf-8で書かれています
# モジュールのインポート
import sys
import collections
import random
# 下請け関数の定義
# generates()関数
def generates(chr,listdata):
""" 文章の生成 """
# 開始文字の出力
print(chr, end = '')
# 続きの出力
while True:
# 次の文字の決定
n = random.randint(1,listdata.count(chr)) # 検索回数の設定
i = 0
for k, v in enumerate(listdata): # 文字chrを探す
if v == chr: # 文字があったら
i += 1 # 発見回数を数える
if i >= n: # 規定回数見つけたら
break # 検索終了
nextchr = listdata[k + 1] # 次の文字を設定
print(nextchr, end = '') # 一文字出力
if (nextchr == '。') or (nextchr == "."):# 句点なら出力終了
break
chr = nextchr # 次の文字に進
print()
# generates()関数の終わり
# メイン実行部
# ファイルオープンと読み込み
f = open("text.txt",'r',encoding="utf-8")
inputtext = f.read()
f.close()
# 1-gramの生成
listdata = list(inputtext)
# 開始文字の決定
startch = input("開始文字を入力してください:")
# 5回の分の生成
if startch in listdata: # 開始文字が存在するなら
for i in range(5) :
generates(startch, listdata)
else: # 開始文字が存在しない
print("開始文字",startch,"が存在しません")
# 2gram_markov.pyの終わり