Refactor
This commit is contained in:
parent
a0de5b03b7
commit
eba5259afb
34
foo.py
34
foo.py
@ -1,34 +0,0 @@
|
|||||||
#!/bin/python3.10
|
|
||||||
from dataclasses import dataclass, field
|
|
||||||
from typing import Union, Iterator
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
|
||||||
class Infty:
|
|
||||||
def __repr__(self):
|
|
||||||
return "∞"
|
|
||||||
inf = Infty()
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
|
||||||
class WrappedNumber:
|
|
||||||
value: int = 5
|
|
||||||
|
|
||||||
def __add__(self, other):
|
|
||||||
match other:
|
|
||||||
case Infty():
|
|
||||||
return inf
|
|
||||||
case WrappedNumber(val):
|
|
||||||
return WrappedNumber(self.value + val)
|
|
||||||
case _:
|
|
||||||
raise Exception("Invalid argument")
|
|
||||||
|
|
||||||
def __mul__(self, other):
|
|
||||||
return WrappedNumber(self.value + other.value)
|
|
||||||
|
|
||||||
def __matmul__(self, other):
|
|
||||||
return WrappedNumber(self.value ** other.value)
|
|
||||||
|
|
||||||
W = WrappedNumber
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
MYNat = WrappedNumber | Infty
|
|
||||||
82
main.py
82
main.py
@ -1,82 +0,0 @@
|
|||||||
CORPUS = "craze.txt"
|
|
||||||
|
|
||||||
from dataclasses import dataclass, field
|
|
||||||
from itertools import chain
|
|
||||||
from random import choices
|
|
||||||
from typing import Optional
|
|
||||||
from time import sleep
|
|
||||||
import sys
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
|
||||||
class Token:
|
|
||||||
value: str
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
|
||||||
class PureToken(Token):
|
|
||||||
pass
|
|
||||||
|
|
||||||
@dataclass(frozen=True)
|
|
||||||
class EndToken(Token):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def tokenize(lines: list[str]) -> list[Token]:
|
|
||||||
tokenlists = [ line.strip().split() for line in lines ]
|
|
||||||
words = chain.from_iterable(tokenlists) # flattened
|
|
||||||
return list(map(Token, words))
|
|
||||||
|
|
||||||
class МарковNode:
|
|
||||||
|
|
||||||
def __init__(self, token):
|
|
||||||
self.successors = {} # othertoken -> count
|
|
||||||
self.count = 0 # total number of successors
|
|
||||||
self.token = token
|
|
||||||
|
|
||||||
def insert(self, other):
|
|
||||||
self.successors[other] = self.successors.get(other, 0) + 1
|
|
||||||
self.count += 1
|
|
||||||
|
|
||||||
def step(self) -> Optional[Token]:
|
|
||||||
# TODO: Tag token if 2-gram was deterministic
|
|
||||||
match (choices(list(self.successors.keys()), list(self.successors.values()))):
|
|
||||||
case [x]:
|
|
||||||
return x
|
|
||||||
case _:
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Марков:
|
|
||||||
# tokens : list[Token] = []
|
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, filename):
|
|
||||||
with open(filename, "r") as f:
|
|
||||||
lines = f.readlines()
|
|
||||||
self.tokens : list[Token]= tokenize(lines)
|
|
||||||
|
|
||||||
self.chain = { token: МарковNode(token) for token in set(self.tokens) } # Token -> MarkowNode
|
|
||||||
for (a,b) in zip(self.tokens, self.tokens[1:]):
|
|
||||||
self.chain[a].insert(b)
|
|
||||||
|
|
||||||
def step(self, token: Token) -> Optional[Token]:
|
|
||||||
return self.chain[token].step()
|
|
||||||
|
|
||||||
|
|
||||||
mc = Марков(CORPUS)
|
|
||||||
|
|
||||||
def gen(s: Optional[Token]):
|
|
||||||
while s:
|
|
||||||
yield s
|
|
||||||
s = mc.step(s)
|
|
||||||
|
|
||||||
def ihateGen(s):
|
|
||||||
s = mc.step(s)
|
|
||||||
return [s, lambda: ihateGen(s)]
|
|
||||||
|
|
||||||
g = gen(Token("The"))
|
|
||||||
while True:
|
|
||||||
print(next(g).value, end=" ")
|
|
||||||
sys.stdout.flush()
|
|
||||||
sleep(0.2)
|
|
||||||
#
|
|
||||||
#
|
|
||||||
Loading…
Reference in New Issue
Block a user