亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用此 CFG 隨機生成字符串?

如何使用此 CFG 隨機生成字符串?

喵喵時光機 2022-09-27 16:12:50
我有這個代碼描述一個上下文無關的語法,我試圖生成匹配它的隨機字符串;例如,像這樣:“約翰認為瑪麗討厭每只綠貓”但我目前的輸出是:[['_S', ['_NP _VP']], ['_NP', ['_Det _Adj _N', '_Det _N', '_Adj _PropN', '_PropN']], ['_VP', ['_Vi', '_Vt _NP', '_Vc _Comp _S']]][['_Det', ['the', 'a', 'some', 'any', 'every']], ['_Adj', ['green', 'young', 'tired', 'confused']], ['_N', ['dog', 'cat']], ['_PropN', ['John', 'Mary']], ['_Vi', ['sleeps', 'walks']], ['_Vt', ['loves', 'hates']], ['_Vc', ['says', 'thinks', 'believes']], ['_Comp', ['that']]]請幫忙!import randompsg_rules_str = "S → NP VP\n" \                "NP → Det Adj N | Det N | Adj PropN | PropN\n" \                "VP → Vi | Vt NP | Vc Comp S"terminals_str = "Det → the | a | some | any | every\n" \                "Adj → green | young | tired | confused\n" \                "N → dog | cat\n" \                "PropN → John | Mary\n" \                "Vi → sleeps | walks\n" \                "Vt → loves | hates\n" \                "Vc → says | thinks | believes\n" \                "Comp → that"psg_rules_list = [a.split("→") for a in psg_rules_str.split("\n")]for p in psg_rules_list:    p[0] = "_" + p[0].strip()    p[1] = p[1].split("|")    p[1] = ["_" + a.strip().replace(" ", " _") for a in p[1]]print(psg_rules_list)# [['_S', ['_NP _VP']], ['_NP', ['_Det _Adj _N', '_Det _N', '_Adj _PropN', '_PropN']], ['_VP', ['_Vi', '_Vt _NP', '_Vc _Comp _S']]]terminals_list = [a.split("→") for a in terminals_str.split("\n")]for t in terminals_list:    t[0] = "_" + t[0].strip()    t[1] = t[1].split("|")    t[1] = [a.strip() for a in t[1]]print(terminals_list)
查看完整描述

1 回答

?
長風秋雁

TA貢獻1757條經驗 獲得超7個贊

你幾乎讓程序工作。以下是完成該函數的方法:reachTerminals


import random


psg_rules_str = "S → NP VP\n" \

                "NP → Det Adj N | Det N | Adj PropN | PropN\n" \

                "VP → Vi | Vt NP | Vc Comp S"


terminals_str = "Det → the | a | some | any | every\n" \

                "Adj → green | young | tired | confused\n" \

                "N → dog | cat\n" \

                "PropN → John | Mary\n" \

                "Vi → sleeps | walks\n" \

                "Vt → loves | hates\n" \

                "Vc → says | thinks | believes\n" \

                "Comp → that"


psg_rules_list = [a.split("→") for a in psg_rules_str.split("\n")]

for p in psg_rules_list:

    p[0] = "_" + p[0].strip()

    p[1] = p[1].split("|")

    p[1] = ["_" + a.strip().replace(" ", " _") for a in p[1]]


terminals_list = [a.split("→") for a in terminals_str.split("\n")]

for t in terminals_list:

    t[0] = "_" + t[0].strip()

    t[1] = t[1].split("|")

    t[1] = [a.strip() for a in t[1]]


def reachTerminals(from_nts, with_rules, with_ts):

    from_nts = str.upper("_" + from_nts.replace("_", "").strip().replace(" ", " _"))

    rule_tags = [a[0] for a in with_rules]

    ts_tags = [a[0] for a in with_ts]

    nts_todo = [a for a in rule_tags if a in from_nts]

    while nts_todo:

        for tag in nts_todo:

            wr_index = rule_tags.index(tag)

            repl_choices = with_rules[wr_index][1]


            choice = random.choice(repl_choices)

            from_nts = from_nts.replace(tag, choice, 1)

        nts_todo = [a for a in rule_tags if a in from_nts]


    ts_todo = [a for a in ts_tags if a in from_nts]

    while ts_todo:

        for tag in ts_todo:

            wr_index = ts_tags.index(tag)

            repl_choices = with_ts[wr_index][1]


            choice = random.choice(repl_choices)

            from_nts = from_nts.replace(tag, choice, 1)

        ts_todo = [a for a in ts_tags if a in from_nts]


    return from_nts



print(reachTerminals(from_nts = "s", with_rules = psg_rules_list, with_ts = terminals_list))

您可以使用的重要工具是 random.option 函數和 str.replace 函數的第三個參數,它只允許您替換子字符串的第一個匹配項。我還沒有徹底測試代碼,但它似乎按預期工作。輸出示例:


green John loves some confused dog


Mary says that the tired dog says that some green cat hates some cat


every green dog loves young John


John loves the tired cat


查看完整回答
反對 回復 2022-09-27
  • 1 回答
  • 0 關注
  • 80 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號