40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
import random
|
|
from collections import defaultdict
|
|
|
|
# NAME GEN MODEL
|
|
|
|
|
|
class NameGenerator:
|
|
def __init__(self, corpus, validate=None):
|
|
self.model = self.build_model(self.pad_names_for_model(corpus))
|
|
self.validate = validate
|
|
|
|
def pad_names_for_model(self, names):
|
|
new_names = []
|
|
for name in names:
|
|
new_names.append(f"<<{name}>")
|
|
return new_names
|
|
|
|
def build_model(self, words):
|
|
model = defaultdict(list)
|
|
for word in words:
|
|
for pos in range(len(word) - 2):
|
|
model[word[pos] + word[pos + 1]].append(word[pos + 2])
|
|
return model
|
|
|
|
def make_name(self):
|
|
result = "<<"
|
|
while True:
|
|
window = result[-2:]
|
|
nxt = random.choice(self.model[window])
|
|
if nxt == ">":
|
|
break
|
|
result += nxt
|
|
return result.removeprefix("<<")
|
|
|
|
def generate_name(self):
|
|
while True:
|
|
name = self.make_name()
|
|
if self.validate is None or self.validate(name) is None:
|
|
return name
|