Skip to content

Instantly share code, notes, and snippets.

@Shirataki2
Created February 27, 2018 07:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Shirataki2/ba07a342bb55970696f1c17081330b5c to your computer and use it in GitHub Desktop.
Save Shirataki2/ba07a342bb55970696f1c17081330b5c to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
import MeCab
import random
import re
from collections import defaultdict
# 所感
# 句点数で終了かどうかの合図としたけどツイッターに句点つけて投稿する律儀な人ってあんまいなくないですか
class MarkovChain:
def isalnum(self,s):
return self.alnumReg.match(s) is not None
def __init__(self,sentence, maxn=512):
self.alnumReg = re.compile(r'^[a-zA-Z0-9]+$')
self.sentence=sentence
self.pre=''
self.head=[]
self.maxn=maxn
def convertWakati(self,sentence):
mecab = MeCab.Tagger("-Owakati")
return mecab.parse(str(sentence))
def makeWakatiText(self,sentence):
wakati = self.convertWakati(sentence)
self.kutenNum=wakati.count('。')
words = wakati.split(' ')
words.append('\n')
return words
def buildTable(self,words):
markov=defaultdict(list)
for word in words:
if not self.pre:
self.pre = word
self.head.append(word)
else:
markov[self.pre].append(word)
self.pre = word
return markov
def buildSentence(self, table):
result = self.pre = random.choice(self.head)
kuten = 0
for _ in range(0,int(self.maxn)):
self.pre = random.choice(table[self.pre])
if self.pre == '\n':
break
if self.isalnum(self.pre):
result +=(self.pre + ' ')
else:
result += self.pre
if self.pre == '。':
kuten += 1
if kuten == self.kutenNum:
break
return result
def makeMarkovText(self):
if self.sentence == '':
return '生成できなかったよ'
text = re.sub(r'(\n| |\s)','',self.sentence)
words = self.makeWakatiText(text)
table = self.buildTable(words)
text = self.buildSentence(table)
self.kutenNum = 0
self.pre = ''
self.head = []
return text
if __name__=='__main__':
txt = """日本国民は、正当に選挙された国会における代表者を通じて行動し、
われらとわれらの子孫のために、諸国民との協和による成果と、
わが国全土にわたつて自由のもたらす恵沢を確保し、
政府の行為によつて再び戦争の惨禍が起ることのないやうにすることを決意し、
ここに主権が国民に存することを宣言し、この憲法を確定する。
そもそも国政は、国民の厳粛な信託によるものであつて、その権威は国民に由来し、
その権力は国民の代表者がこれを行使し、その福利は国民がこれを享受する。
これは人類普遍の原理であり、この憲法は、かかる原理に基くものである。
われらは、これに反する一切の憲法、法令及び詔勅を排除する。
日本国民は、恒久の平和を念願し、人間相互の関係を支配する崇高な理想を深く自覚するのであつて、
平和を愛する諸国民の公正と信義に信頼して、われらの安全と生存を保持しようと決意した。
われらは、平和を維持し、専制と隷従、圧迫と偏狭を地上から永遠に除去しようと努めてゐる国際社会において、
名誉ある地位を占めたいと思ふ。われらは、全世界の国民が、ひとしく恐怖と欠乏から免かれ、
平和のうちに生存する権利を有することを確認する。
われらは、いづれの国家も、自国のことのみに専念して他国を無視してはならないのであつて、
政治道徳の法則は、普遍的なものであり、この法則に従ふことは、自国の主権を維持し、
他国と対等関係に立たうとする各国の責務であると信ずる。
日本国民は、国家の名誉にかけ、全力をあげてこの崇高な理想と目的を達成することを誓ふ。"""
m1 = MarkovChain(txt)
print(m1.makeMarkovText())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment