feat: add silly markov thing

This commit is contained in:
Ashhhleyyy 2022-12-29 12:06:54 +00:00
parent e2623702ec
commit 93abddc3be
Signed by: ash
GPG key ID: 83B789081A0878FB
3 changed files with 88 additions and 0 deletions

1
silly/markov/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
data/

View file

@ -0,0 +1,51 @@
from collections import defaultdict
import csv
import json
import os
import re
import sys
def main():
if len(sys.argv) < 3:
print(f"Usage: {sys.argv[0]} <messages dir> <output file>")
exit(1)
messages_path = sys.argv[1]
output_path = sys.argv[2]
index_path = os.path.join(messages_path, "index.json")
with open(index_path) as f:
message_index = json.load(f)
transitions = defaultdict(list)
messages = []
for id, channel_name in message_index.items():
print(f"Loading messages from {channel_name}...")
with open(os.path.join(messages_path, f"c{id}", "messages.csv"), newline='') as f:
reader = csv.DictReader(f)
for line in reader:
content = line["Contents"]
messages.append(content)
print(f"Loaded {len(messages)} messages!")
for message in messages:
words = re.split(' +', message)
for w0, w1, w2 in zip(words[0:], words[1:], words[2:]):
transitions[w0, w1].append(w2)
data = []
for state, transition in transitions.items():
data.append({
'state': state,
'transition': transition,
})
with open(output_path, "w") as f:
json.dump(data, f)
if __name__ == "__main__":
main()

View file

@ -0,0 +1,36 @@
import json
import random
import sys
def main():
if len(sys.argv) < 2:
print("Usage: {sys.argv[0]} <chain file>")
exit(1)
chain_path = sys.argv[1]
transitions = {}
with open(chain_path) as f:
data = json.load(f)
for item in data:
state = item['state']
transition = item['transition']
transitions[state[0], state[1]] = transition
start_states = list(transitions.keys())
print("Press enter to generate another")
while True:
w0, w1 = random.choice(start_states)
print(w0, w1, end='')
w2 = random.choice(transitions[w0, w1])
for _ in range(500):
print(' ' + w2, end='')
if (w1, w2) not in transitions:
break
w0, w1, w2 = w1, w2, random.choice(transitions[w1, w2])
print()
input()
if __name__ == '__main__':
main()