【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の終わり

この記事が気に入ったらサポートをしてみませんか?