Spaces:
Runtime error
Runtime error
File size: 6,564 Bytes
4222961 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
import json
from util import parse_attribute_string
from util import parsing_condition_string
# 我希望实现一个python函数
# 分析一个字符串中有没有":"
# 如果有,我希望在第一个":"的位置分开成str_left和str_right,并以f"{str_left}:「{str_right}」"的形式输出
# 例子输入
# 爸爸:我真棒
# 例子输出
# 爸爸:「我真棒」
# 例子输入
# 这一句没有冒号
# 例子输出
# :「这一句没有冒号」
def wrap_text_with_colon(text):
# 查找冒号在字符串中的位置
colon_index = text.find(":")
# 如果找到了冒号
if colon_index != -1:
# 分割字符串为左右两部分
str_left = text[:colon_index]
str_right = text[colon_index+1:]
# 构造新的格式化字符串
result = f"{str_left}:「{str_right}」"
else:
# 如果没有找到冒号,整个字符串被认为是右侧部分
result = f":「{text}」"
return result
# 给定 example_json_str = """{"prefix": "糖糖: 嘿嘿,最近我在想要不要改变直播风格,你觉得我应该怎么做呀?", "options": [{"user": "你可以试试唱歌直播呀!", "reply": "糖糖: 哇!唱歌直播是个好主意!我可以把我的可爱音色展现给大家听听!谢谢你的建议!", "attribute_change": "Stress: -1.0"}, {"user": "你可以尝试做一些搞笑的小品,逗大家开心。", "reply": "糖糖: 哈哈哈,小品确实挺有趣的!我可以挑战一些搞笑角色,给大家带来欢乐!谢谢你的建议!", "attribute_change": "Stress: -1.0"}, {"user": "你可以尝试做游戏直播,和观众一起玩游戏。", "reply": "糖糖: 游戏直播也不错!我可以和观众一起玩游戏,互动更加有趣!谢谢你的建议!", "attribute_change": "Stress: -1.0"}]}"""
# 我希望建立一个DialogueEvent类
# 这个类可以凭空初始化
# 也可以通过DialogueEvent(str)的方式来初始化
# 并且json_str解析后,会以self.data的字典形式存储在类中
# 并且可以通过类似 event["options"]的方式进行调用
# 请用python为我实现
class DialogueEvent:
def __init__(self, json_str=None, user_role = None):
if json_str:
try:
self.data = json.loads(json_str)
except json.JSONDecodeError:
print("输入的字符串不是有效的JSON格式。")
self.data = {}
else:
self.data = {}
if "condition" not in self.data:
if "category" in self.data:
self.data["condition"] = parsing_condition_string( self.data["category"] )
else:
self.data["condition"] = None
if "name" not in self.data:
if "id" in self.data:
self.data["name"] = self.data["id"]
else:
self.data["name"] = ""
if "prefix_emoji" not in self.data:
self.data["prefix_emoji"] = "📄"
if "prefix" in self.data:
self.data["prefix"] = self.data["prefix"].replace(":",":")
for option in self.data["options"]:
if "user" in option:
option["user"] = option["user"].strip(" :")
if "reply" in option:
option["reply"] = option["reply"].replace(":",":")
if "option_emoji" not in option:
option["option_emoji"] = "📄"
if user_role is None:
self.user_role = "阿P"
def __getitem__(self, key):
return self.data.get(key, None)
def __setitem__(self, key, value):
self.data[key] = value
def __repr__(self):
return str(self.data)
def get_most_neutral( self ):
options = self.data["options"]
if len(options) == 0:
print('warning! no options can be selected')
return 0
i = 0
min_change = 99999
for i, option in enumerate(options):
attr_change = parse_attribute_string(option["attribute_change"])
current_change = 0
for k in attr_change:
current_change += abs( attr_change[k] )
if current_change < min_change:
min_change = current_change
choice_id = i
return choice_id
def get_emoji( self, choice_id ):
return self.data["prefix_emoji"] + self.data["options"][choice_id]["option_emoji"]
def transfer_output( self, choice_id ):
line = wrap_text_with_colon(self.data["prefix"]) + "\n"
if line.strip()[0] != "糖":
line = "糖糖:" + line
ans = line
user_text = self.user_role + ":「" + self.data["options"][choice_id]["user"] + "」\n"
ans += user_text
line = wrap_text_with_colon(self.data["options"][choice_id]["reply"]) + "\n"
if line.strip()[0] != "糖":
line = "糖糖:" + line
ans += line
# print(self.data["options"][choice_id]['attribute_change'])
return ans
def most_neutral_output(self):
neutral_id = self.get_most_neutral()
return self.transfer_output( neutral_id ), self.get_emoji( neutral_id )
def get_text_and_emoji(self, choice_id):
return self.transfer_output(choice_id), self.get_emoji( choice_id )
if __name__ == "__main__":
example_json_str = """{"prefix": "糖糖: 嘿嘿,最近我在想要不要改变直播风格,你觉得我应该怎么做呀?", "options": [{"user": "你可以试试唱歌直播呀!", "reply": "糖糖: 哇!唱歌直播是个好主意!我可以把我的可爱音色展现给大家听听!谢谢你的建议!", "attribute_change": "Stress: -1.0"}, {"user": "你可以尝试做一些搞笑的小品,逗大家开心。", "reply": "糖糖: 哈哈哈,小品确实挺有趣的!我可以挑战一些搞笑角色,给大家带来欢乐!谢谢你的建议!", "attribute_change": "Stress: -1.0"}, {"user": "你可以尝试做游戏直播,和观众一起玩游戏。", "reply": "糖糖: 游戏直播也不错!我可以和观众一起玩游戏,互动更加有趣!谢谢你的建议!", "attribute_change": "Stress: -1.0"}]}"""
# 通过给定的json字符串初始化DialogueEvent实例
event = DialogueEvent(example_json_str)
# 通过类似字典的方式访问数据
# print(event["options"]) # 打印options字段的内容
print(event.transfer_output(1) )
print(event.get_most_neutral())
print(event.most_neutral_output()) |