<jupyter_start><jupyter_text>GramáticasEn esta sección quiero revisar cómo un automata lee reglas, escoge una regla aleatoriamente QUE SE PUEDA APLICAR y modifica el string de acuerdo a las reglas ya definidas. Con ello podemos encontrar además patrones de convergencia de los automatas<jupyter_code>myrules={"rawimputs":["X to aY","Y to ZZ","Z to bXa","X to c","Xa to cb","Z to a"]}
rules=pd.DataFrame(myrules)
#def Rules(inputs,outputs):
    
rules[["inputs","outputs"]]=rules["rawimputs"].str.split(" to ", expand=True)
rules
def enterRules():
    executing=True
    listing=[]
    while executing:
        newrule=input("Please enter a new rule in the format X to Y or enter 0 to finish \t")
        if newrule != "0":
            if " to " in newrule:
                listing.append(newrule)
            else:
                print("Bad format, try again :)")
        else:
            executing=False
    dictionary={"rawinputs":listing}
    rules=pd.DataFrame(dictionary)
    rules[["inputs","outputs"]]=rules["rawinputs"].str.split(" to ", expand=True)
    rules.drop(columns=["rawinputs"],inplace=True)
    return rules
def ChainPath(rules, w,ITER):
    seed=w
    rules["input is in"]=rules["inputs"].apply(lambda x: x in seed)
    filtering=rules[rules["input is in"]==True]
    if len(filtering["inputs"])>0:
        choose=random.choice(filtering.index.to_numpy())
        print("Regla escogida: "+ rules["inputs"][choose] + " ---> " + rules["outputs"][choose])
        seed=seed.replace(rules["inputs"][choose],rules["outputs"][choose],1)
        print("Para la cadena ingresada tenemos que cambio por: " + seed + " en la iteración " + str(ITER))
    else:
        seed=seed
        print("Para la cadena ingresada tenemos SE QUEDO IGUAL " + seed + " en la iteración " + str(ITER))
    return seed
    
rules.loc[[0],["outputs"]]

rules["outputs"][0]

def generateStrFromRules(rules,Start,Nmax):
    iteration=0
    Chain=Start
    for i in range(Nmax):
        Chain=ChainPath(rules, Chain,iteration)
        iteration+=1
    return Chain
newrules=enterRules()
newrules
ATTEMPT=generateStrFromRules(newrules,"SYYZSYZSYZYSYSYZZY",50)<jupyter_output>Regla escogida: ZY ---> YZ
Para la cadena ingresada tenemos que cambio por: SYYZSYZSYYZSYSYZZY en la iteración 0
Regla escogida: S ---> aSYZ
Para la cadena ingresada tenemos que cambio por: aSYZYYZSYZSYYZSYSYZZY en la iteración 1
Regla escogida: ZY ---> YZ
Para la cadena ingresada tenemos que cambio por: aSYYZYZSYZSYYZSYSYZZY en la iteración 2
Regla escogida: S ---> aSYZ
Para la cadena ingresada tenemos que cambio por: aaSYZYYZYZSYZSYYZSYSYZZY en la iteración 3
Regla escogida: S ---> 
Para la cadena ingresada tenemos que cambio por: aaYZYYZYZSYZSYYZSYSYZZY en la iteración 4
Regla escogida: ZY ---> YZ
Para la cadena ingresada tenemos que cambio por: aaYYZYZYZSYZSYYZSYSYZZY en la iteración 5
Regla escogida: S ---> 
Para la cadena ingresada tenemos que cambio por: aaYYZYZYZYZSYYZSYSYZZY en la iteración 6
Regla escogida: ZY ---> YZ
Para la cadena ingresada tenemos que cambio por: aaYYYZZYZYZSYYZSYSYZZY en la iteración 7
Regla escogida: S ---> aSYZ
Para la cadena ingresada tenemos que cambi[...]
{'fraction_non_alphanumeric': 0.11268939393939394, 'fraction_numerical': 0.005681818181818182, 'mean_word_length': 3.92846034214619, 'pattern_counts': {'":': 3, '<': 4, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '292765', 'license': 'MIT', 'n_tokens_mistral': 1151, 'n_tokens_neox': 1112, 'n_words': 319, 'path': 'LengMaqNBGRAMATICAS.ipynb', 'repo_name': 'DavidJHub/Linguistics', 'size': '3168'}