ChatHaruhi-Needy / Needy-Haruhi /src /DialogueEvent.py
silk-road's picture
Upload 37 files
4222961
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())