-
Notifications
You must be signed in to change notification settings - Fork 77
/
condition.py
223 lines (175 loc) · 8.37 KB
/
condition.py
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
import logging
import re
from os import getenv
from df_engine.core import Actor, Context
import common.dff.integration.condition as int_cnd
import common.dff.integration.context as int_ctx
import common.greeting as common_greeting
import common.link as common_link
from common.emotion import is_positive_regexp_based, is_negative_regexp_based
logging.basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO)
logger = logging.getLogger(__name__)
LANGUAGE = getenv("LANGUAGE", "EN")
GREETING_STEPS = list(common_greeting.GREETING_QUESTIONS[LANGUAGE])
link_to_skill2key_words = {
skill_name: common_link.link_to_skill2key_words[skill_name]
for skill_name in common_link.link_to_skill2key_words
if skill_name in common_link.SKILLS_FOR_LINKING
}
link_to_skill2i_like_to_talk = {
skill_name: common_link.link_to_skill2i_like_to_talk[skill_name]
for skill_name in common_link.link_to_skill2i_like_to_talk
if skill_name in common_link.SKILLS_FOR_LINKING
}
def offered_topic_choice_declined_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("offered_topic_choice_declined_condition")
prev_bot_uttr = int_ctx.get_last_bot_utterance(ctx, actor)["text"]
# asked what to talk about
shared_memory = int_ctx.get_shared_memory(ctx, actor)
greeting_step_id = shared_memory.get("greeting_step_id", 0)
was_linking_topic_offering = (
GREETING_STEPS[greeting_step_id - 1] == "what_to_talk_about" if greeting_step_id > 0 else False
)
user_asked_for_topic = any(
[
resp.lower() in prev_bot_uttr.lower()
for resp in common_greeting.GREETING_QUESTIONS[LANGUAGE]["what_to_talk_about"]
]
)
was_active = "dff_friendship_skill" == int_ctx.get_last_bot_utterance(ctx, actor).get("active_skill", "")
# offered choice between two topics
offered_topics = shared_memory.get("offered_topics", [])
# and user declined
declined = int_cnd.is_no_vars(ctx, actor)
if was_active and offered_topics and was_linking_topic_offering and not user_asked_for_topic and declined:
# was offered particular linking question, and user said no
return True
return False
def asked_for_events_and_got_yes_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("asked_for_events_and_got_yes_condition")
prev_bot_uttr = int_ctx.get_last_bot_utterance(ctx, actor).get("text", "")
was_event_question = any(
[
resp.lower() in prev_bot_uttr.lower()
for resp in common_greeting.GREETING_QUESTIONS[LANGUAGE]["recent_personal_events"]
]
)
agreed = int_cnd.is_yes_vars(ctx, actor)
entities = int_ctx.get_nounphrases_from_human_utterance(ctx, actor)
if was_event_question and agreed and len(entities) == 0:
return True
return False
def false_positive_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("false_positive_condition")
flag = (
bool(re.search(common_greeting.FALSE_POSITIVE_TURN_ON_RE, int_ctx.get_last_human_utterance(ctx, actor)["text"]))
and int_ctx.get_human_utter_index(ctx, actor) == 0
)
return flag
def hello_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("hello_condition")
flag = True
flag = flag and len(int_ctx.get_human_utterances(ctx, actor)) == 1
flag = flag
return flag
def how_are_you_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("how_are_you_condition")
prev_frindship_skill = int_ctx.get_last_bot_utterance(ctx, actor).get("active_skill", "") == "dff_friendship_skill"
how_are_you_found = common_greeting.HOW_ARE_YOU_TEMPLATE[LANGUAGE].search(
int_ctx.get_last_human_utterance(ctx, actor)["text"]
)
how_are_you_precise_found = common_greeting.HOW_ARE_YOU_PRECISE_TEMPLATE[LANGUAGE].search(
int_ctx.get_last_human_utterance(ctx, actor)["text"]
)
how_are_you_by_bot_found = common_greeting.HOW_ARE_YOU_TEMPLATE[LANGUAGE].search(
int_ctx.get_last_bot_utterance(ctx, actor)["text"]
)
any_you_in_user = common_greeting.ANY_YOU_TEMPLATE[LANGUAGE].search(
int_ctx.get_last_human_utterance(ctx, actor)["text"]
)
if how_are_you_precise_found:
return True
elif prev_frindship_skill and (how_are_you_found or (how_are_you_by_bot_found and any_you_in_user)):
return True
return False
def positive_or_negative_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("positive_or_negative_condition")
# SYS_USR_ANSWERS_HOW_IS_HE_DOING
usr_sentiment = int_ctx.get_human_sentiment(ctx, actor)
pos_temp = is_positive_regexp_based(int_ctx.get_last_human_utterance(ctx, actor))
neg_temp = is_negative_regexp_based(int_ctx.get_last_human_utterance(ctx, actor))
bot_asked_how_are_you = any(
[
resp in int_ctx.get_last_bot_utterance(ctx, actor)["text"]
for resp in common_greeting.HOW_ARE_YOU_RESPONSES[LANGUAGE]
]
)
if bot_asked_how_are_you and (usr_sentiment in ["positive", "negative"] or pos_temp or neg_temp):
return True
return False
def no_requests_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("no_requests_condition")
return int_cnd.no_requests(ctx, actor)
def no_special_switch_off_requests_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("no_special_switch_off_requests_condition")
return int_cnd.no_special_switch_off_requests(ctx, actor)
def was_what_do_you_do_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("was_what_do_you_do_condition")
bot_uttr_text = int_ctx.get_last_bot_utterance(ctx, actor).get("text", "")
if int_cnd.no_requests(ctx, actor) and any(
[
phrase in bot_uttr_text
for phrase in common_greeting.GREETING_QUESTIONS[LANGUAGE]["what_do_you_do_on_weekdays"]
]
):
return True
return False
def is_yes_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("is_yes_condition")
if int_cnd.is_yes_vars(ctx, actor):
return True
return False
def is_no_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("is_no_condition")
if int_cnd.is_no_vars(ctx, actor):
return True
return False
def not_is_no_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("not_is_no_condition")
if not int_cnd.is_no_vars(ctx, actor):
return True
return False
def std_greeting_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("std_greeting_condition")
flag = True
# flag = flag and not condition_utils.is_new_human_entity(vars)
# flag = flag and not condition_utils.is_switch_topic(vars)
# flag = flag and not condition_utils.is_opinion_request(vars)
# flag = flag and not condition_utils.is_lets_chat_about_topic_human_initiative(vars)
# flag = flag and not condition_utils.is_question(vars)
# flag = flag and condition_utils.is_begin_of_dialog(vars)
if flag:
shared_memory = int_ctx.get_shared_memory(ctx, actor)
flag = flag and shared_memory.get("greeting_step_id", 0) < len(GREETING_STEPS)
return flag
def new_entities_is_needed_for_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("new_entities_is_needed_for_condition")
flag = True
# what is the state in here?
# flag = flag and int_cnd.is_first_time_of_state(ctx, actor, State.SYS_NEW_ENTITIES_IS_NEEDED_FOR)
flag = flag and not int_cnd.is_switch_topic(ctx, actor)
flag = flag and not int_cnd.is_lets_chat_about_topic_human_initiative(ctx, actor)
flag = flag and int_cnd.is_new_human_entity(ctx, actor)
return flag
def closed_answer_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("closed_answer_condition")
flag = True
flag = flag and not int_cnd.is_switch_topic(ctx, actor)
flag = flag and not int_cnd.is_lets_chat_about_topic_human_initiative(ctx, actor)
return flag
def link_to_by_enity_condition(ctx: Context, actor: Actor, *args, **kwargs) -> bool:
logger.info("link_to_by_enity_condition")
flag = True
flag = flag and not int_cnd.is_switch_topic(ctx, actor)
flag = flag and not int_cnd.is_lets_chat_about_topic_human_initiative(ctx, actor)
return flag